Реализация VGG16 на Pytorch, выдающая ошибку несоответствия размера - PullRequest
2 голосов
/ 13 марта 2019

Фрагмент моей реализации кода на PyTorch:

model = models.vgg16(pretrained = False)
classifier = nn.Sequential(
        nn.Linear(25088, 128),
        nn.ReLU(True),
        nn.Dropout(),
        nn.Linear(128, 128),
        nn.ReLU(True),
        nn.Dropout(),
        nn.Linear(128, 20)
)
model.classifier = classifier

Я передаю изображения с входным размером (60x60x3) и batch_size = 30.

Когда я запускаю код из LinuxТерминал (Ubuntu) (с версией PyTorch: 1.0.0, версия Torchvision: 0.2.1) выдает следующее сообщение об ошибке :

RuntimeError: несоответствие размера, м1: [30 x 512], м2: [25088 x 128]

Пока я запускаю его из Spyder (Anaconda) в Windows (с версией PyTorch: 1.0.1, версия Torchvision: 0.2.2) отлично работает .

Я что-то упустил или это из-за несовпадения версий в Pytorch и Torchvision?Оба я работаю на Python 3.6.Пожалуйста, предложите.

[ ОБНОВЛЕНИЕ : ошибочно поменял местами номера версий для случая без ошибок и без ошибок.Спасибо @Manoj Mohan за указание на это]

1 Ответ

1 голос
/ 13 марта 2019

Наверное, наоборот.Все отлично работает на Torchvision 0.2.2 и не работает на Torchvision 0.2.1.

Это изменение использования AdaptiveAvgPool2d, вошедшее в 0.2.2, является причиной того, что вы не видите ошибку.https://github.com/pytorch/vision/commit/83b2dfb2ebcd1b0694d46e3006ca96183c303706

>>> import torch
>>> model = models.vgg16(pretrained = False)
>>> x = torch.randn(1,3,60,60) # random image
>>> feat = model.features(x)
>>> flat_feat = feat.view(feat.size(0), -1) # flatten
>>> flat_feat.shape
torch.Size([1, 512])
>>> model.classifier(flat_feat)

RuntimeError: несоответствие размера, м1: [1 x 512], м2: [25088 x 4096] в /pytorch/aten/src/TH/generic/THTensorMath.cpp:940

Вы видите ошибку несоответствия размера.После адаптивного среднего пула все работает нормально.

>>> import torch.nn.functional as F
>>> avg = F.adaptive_avg_pool2d(feat, (7,7))
>>> avg = avg.view(avg.size(0), -1)
>>> output = model.classifier(avg)
>>> output.shape
torch.Size([1, 1000])
...