我尝试使用vgg16架构,然后使用卷积层。我知道vgg16的输出应该是7x7的512个通道,但由于某种原因,它只是以某种一维列表的形式给出了输出。
因此,我一直收到以下错误: RuntimeError:对于4维权重10051233,需要4维输入,但得到的是大小为64,25088的2维输入
我试图重塑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)),
]))发布于 2020-03-04 23:27:23
如果你仔细观察VGG's forward function
def forward(self, x):
x = self.features(x)
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = self.classifier(x)
return x在self.classifier生效之前,您会注意到torch.flatten调用。这就是为什么你将输入作为一个“扁平化”的2D特征向量。
您也许能够使用torch.view或torch.reshape“撤销”torch.flatten,但您需要知道输入的空间尺寸以及它们如何影响要素地图的空间形状。也就是说,仅对于形状batch-by-3-224-224的输入,特征映射是形状batch-by-512-7-7。如果更改输入大小(因为此时的网络是完全卷积的),则特征映射形状可能会发生变化。
https://stackoverflow.com/questions/60529201
复制相似问题