在一个用于分类5个对象的简单CNN中,我遇到了大小不匹配的错误:
"RuntimeError: size mismatch, m1: [1 x 7744], m2: [400 x 120]" in the convolutional layer .
我的model.py文件如下:
import torch.nn as nnimport torch.nn.functional as Fclass FNet(nn.Module): def __init__(self,device): # 这里构建你的卷积神经网络 # 使用正则化 # 批量归一化 super(FNet, self).__init__() num_classes = 5 self.conv1 = nn.Conv2d(3, 6, 5) self.conv2 = nn.Conv2d(6, 16, 5) # 仿射操作:y = Wx + b self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 5) def forward(self, x): x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) x = F.max_pool2d(F.relu(self.conv2(x)), 2) x = x.view(-1, self.num_flat_features(x)) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x def num_flat_features(self, x): size = x.size()[1:] # 除批次维度之外的所有维度 num_features = 1 for s in size: num_features *= s return num_featuresif __name__ == "__main__": net = FNet()
完整错误信息如下:
Traceback (most recent call last): File "main.py", line 98, in <module> train_model('../Data/fruits/', save=True, destination_path='/home/mitesh/E yantra/task1#hc/Task 1/Task 1B/Data/fruits') File "main.py", line 66, in train_model outputs = model(images) File "/home/mitesh/anaconda3/envs/HC#850_stage1/lib/python3.6/site-packages/torch/nn/modules/module.py", line 477, in __call__ result = self.forward(*input, **kwargs) File "/home/mitesh/E yantra/task1#hc/Task 1/Task 1B/Code/model.py", line 28, in forward x = F.relu(self.fc1(x)) File "/home/mitesh/anaconda3/envs/HC#850_stage1/lib/python3.6/site-packages/torch/nn/modules/module.py", line 477, in __call__ result = self.forward(*input, **kwargs) File "/home/mitesh/anaconda3/envs/HC#850_stage1/lib/python3.6/site-packages/torch/nn/modules/linear.py", line 55, in forward return F.linear(input, self.weight, self.bias) File "/home/mitesh/anaconda3/envs/HC#850_stage1/lib/python3.6/site-packages/torch/nn/functional.py", line 1024, in linear return torch.addmm(bias, input, weight.t())RuntimeError: size mismatch, m1: [1 x 7744], m2: [400 x 120] at /opt/conda/conda-bld/pytorch-cpu_1532576596369/work/aten/src/TH/generic/THTensorMath.cpp:2070
回答:
如果你的网络中有一个nn.Linear
层,你不能“临时”决定这个层的输入大小。
在你的网络中,你为每个x
计算num_flat_features
,并期望你的self.fc1
能够处理你输入网络的任何x
大小。然而,self.fc1
有一个大小为400×120的固定大小的权重矩阵(期望输入维度为16*5*5=400,输出120维特征)。在你的情况下,x
的大小转换为7744维特征向量,self.fc1
无法处理。
如果你希望你的网络能够处理任何大小的x
,你可以在self.fc1
之前添加一个无参数的插值层,将所有x
调整到正确的尺寸:
x = F.max_pool2d(F.relu(self.conv2(x)), 2) # 卷积层的输出x = F.interpolate(x, size=(5, 5), mode='bilinear') # 调整大小到线性单元期望的尺寸x = x.view(x.size(0), 5 * 5 * 16)x = F.relu(self.fc1(x)) # 从这里继续...
有关更多信息,请参阅torch.nn.functional.interpolate
。