#python #pytorch #conv-neural-network #training-data #vgg-net
#python #pytorch #conv-нейронная сеть #обучение-данные #vgg-net
Вопрос:
Я новичок в CNN. Я пытаюсь обучить vggnet.
класс Net(nn.Module) :
def __init__(self) :
super(Net, self).__init__()
self.conv = nn.Sequential (
#1
#####
nn.Conv2d(3,64,3, padding=1), nn.ReLU(inplace=True),
nn.Conv2d(64,64,3, padding=1),nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#2
#####
nn.Conv2d(64,128,3, padding=1), nn.ReLU(inplace=True),
nn.Conv2d(128,128,3, padding=1),nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#####
#3
#####
nn.Conv2d(128,256,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(256,256,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(256,256,3, padding=1),nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#4
#####
nn.Conv2d(256,512,3, padding=1), nn.ReLU(inplace=True),
nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(512,512,3, padding=1), nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#5
#####
nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#####
)
self.fc = nn.Sequential(
nn.Linear(512 * 7 * 7, 4096), nn.ReLU(inplace=True), nn.Dropout(0.5),
nn.Linear(4096, 4096), nn.ReLU(inplace=True), nn.Dropout(0.5),
nn.Linear(4096, 1000)
)
def forward(self, x):
# diffrent depending on the model
x = self.conv(x)
# change dimension
x = torch.flatten(x, 1)
# same
x = self.fc(x)
return x
Но потеря составляет около 6,9077.
После эпохи 0 он редко меняется.
Даже если я изменю уменьшение веса на 0 (не использовать нормализацию L2), потери немного изменятся.
Мой оптимизатор и планировщик
оптимизатор = torch.optim.SGD(net.parameters(), lr= 0.1, weight_decay= 5e-4)
планировщик = lr_scheduler.ReduceLROnPlateau(оптимизатор, коэффициент = 0.1, терпение = 2, режим = ‘min’)
В чем проблема. Иногда он печатает байты, но получает только 0. warnings.warn(str(msg)) Это связано с моей проблемой?
Комментарии:
1. Я использую transform = transformes . Compose([ преобразует. Изменение размера ((224, 224)), преобразования. ToTensor(), преобразует. Нормализовать((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)), ])
2. и trainset = torchvision.datasets . ImageNet(‘./data’, split= ‘train’, download = None, transform = transform) trainloader = torch.utils.data . Загрузчик данных (набор данных, batch_size=64, shuffle= True, num_workers = 4, pin_memory = True) набор тестов = torchvision.datasets. ImageNet(‘./data’, split= ‘val’, download = None, transform = transform) testloader = torch.utils.data . Загрузчик данных (testset, batch_size=64, shuffle = False, num_workers = 4, pin_memory = True)
Ответ №1:
Ваше значение потерь 6.9077
равно -log(1/1000)
, что в основном означает, что ваша сеть выдает случайные выходные данные из всех возможных 1000 классов.
Немного сложно обучать сети VGG с нуля, особенно если вы не включаете уровни пакетной нормы.
Попробуйте снизить скорость обучения до 0,01 и добавить импульс вашему SGD.
Добавьте дополнительные дополнения к вводу (например, Изменение цвета и т. Д.).
Комментарии:
1. Извините, я установил значение 0.01
2. Lr = 0.1 — моя ошибка, и, как я знаю, defualt mementum равен 0.9
3. Когда я добавляю batchnorm, он работает хорошо. Но я хочу попробовать без BN. Потому что я слышал, что BN не используется для статьи о vgg
4. @Jjh действительно, batchnorm появился после первой статьи vgg. возможно, вы захотите перейти к исходной статье и посмотреть, какие мета-параметры они использовали
5. Я установил скорость обучения с уменьшением веса (штраф l2) на бумаге…