проблема измерения с использованием архитектуры VGG16 - PullRequest
0 голосов
/ 04 марта 2020

Я попытался использовать архитектуру vgg16, а затем слой свертки. Я знаю, что выходные данные vgg16 предполагаются равными 512 каналам 7x7, но по какой-то причине он просто выводит их в виде некоего одномерного списка.

, поэтому я продолжаю получать следующую ошибку: RuntimeError: Ожидается 4-мерный ввод для 4-мерного веса 100 512 3 3, но вместо этого получается 2-мерный ввод размера [64, 25088]

Я попытался изменить вывод vgg16 безуспешно. какие-либо предложения? все, что я хочу, это поместить слой свертки, а не полностью связанный слой, после vgg16, чтобы он не имел слишком большого количества параметров

кода (только часть vgg16 и сеть, которую я хочу добавить)

#Choosing our pretrained network model
pre_trained_model = tv.models.vgg16(pretrained=True)
pre_trained_model = pre_trained_model

# freeze parameters
for param in pre_trained_model.parameters():
param.requires_grad = False

# add layers to train
from collections import OrderedDict
#classifier = classifier.nn.Size([1, 512, 7, 7])
classifier = nn.Sequential(OrderedDict([
                      ('conv1', nn.Conv2d(512, 100, 3)),
                      ('fc1', nn.Linear(2500, 400)),
                      ('dr1', nn.Dropout(p = 0.3)),
                      ('bn1', nn.BatchNorm1d(num_features=400)),
                      ('relu2', nn.ReLU()),
                      ('fc2', nn.Linear(400, 100)),
                      ('dr2', nn.Dropout(p = 0.3)),
                      ('bn2', nn.BatchNorm1d(num_features=100)),
                      ('relu3', nn.ReLU()),
                      ('fc3', nn.Linear(100, 2)),
                      ]))

1 Ответ

0 голосов
/ 04 марта 2020

Если вы внимательно посмотрите на функцию forward VGG :

def forward(self, x):
        x = self.features(x)
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x

Вы заметите, что torch.flatten вызов до self.classifier запускается Вот почему вы получаете входные данные в виде "сглаженного" вектора пространственных объектов.

Вы можете "отменить" torch.flatten, используя torch.view или torch.reshape, но вам необходимо знать пространственные размеры вход и как они влияют на пространственную форму карты объектов. То есть карта объектов имеет форму batch -by-512-7-7 только для входных данных формы batch -by-3-224-224. Если вы измените размер ввода (поскольку net до этой точки является полностью сверточным), форма карты объектов может измениться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...