Ошибка несоответствия размера во время тонкой настройки VGG

Я следил за учебным пособием по переносу муравьев и пчел из официальных документов PyTorch (http://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html). Я пытаюсь настроить модель VGG19, изменив последний слой, чтобы предсказать один из двух классов. Я могу изменить последний слой fc, используя следующий код.

Но я получаю сообщение об ошибке при выполнении функции train_model. Ошибка «несоответствие размера в /opt/conda/conda-bld/pytorch_1513368888240/work/torch/lib/THC/generic/THCTensorMathBlas.cu:243». Есть идеи, в чем проблема?

model_conv = torchvision.models.vgg19(pretrained=True)
for param in model_conv.parameters():
    param.requires_grad = False

model_conv = nn.Sequential(*list(model_conv.classifier.children())[:-1] +
                     [nn.Linear(in_features=4096, out_features=2)])
if use_gpu:
    model_conv = model_conv.cuda()

criterion = nn.CrossEntropyLoss()

optimizer_conv = optim.SGD(model_conv._modules['6'].parameters(), lr=0.001, momentum=0.9)
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_conv, step_size=7, gamma=0.1)

model_conv = train_model(model_conv, criterion, optimizer_conv, exp_lr_scheduler, num_epochs=25)

person Manoj Karthick    schedule 15.02.2018    source источник
comment
Можете ли вы опубликовать свой код предварительной обработки данных?   -  person Manuel Lagunas    schedule 15.02.2018
comment
Я использую тот же код, что и на странице руководства (pytorch.org/tutorials/beginner/transfer_learning_tutorial. html). Я разместил только те части, которые я изменил в вопросе.   -  person Manoj Karthick    schedule 16.02.2018


Ответы (1)


Когда вы определяете свою модель, вы просто рассматриваете classifier, который состоит только из полностью подключенной части сети. Затем, при подаче изображения 224*224*3 в модель, она пытается «пройти» линейный слой с 25 000 объектов в качестве входных данных. Чтобы решить эту проблему, вам просто нужно добавить сверточную часть раньше, для этого переопределите модель следующим образом:

class newModel(nn.Module):
    def __init__(self, old_model):
        super(newModel, self).__init__()

        self.features = old_model.features
        self.classifier = nn.Sequential(*list(old_model.classifier.children())[:-1] +
                                         [nn.Linear(in_features=4096, out_features=2)])

    def forward(self, x):
        x = self.features(x)
        x = x.view(x.size(0), -1)
        x = self.classifier(x)
        return x

model_conv = newModel(model_conv)

Теперь вы просто также указываете параметры для оптимизации, если вы просто хотите обучить последний слой (тот, который был недавно добавлен), выполните:

optimizer_conv = optim.SGD(model_conv.classifier._modules['6'].parameters(), lr=0.001, momentum=0.9)

Остальной код остается прежним.

Надеюсь, поможет!

person Manuel Lagunas    schedule 16.02.2018