Я пытаюсь реализовать vggnet, но он плохо обучается

#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) на бумаге…