我是一个PyTorch和神经网络的新手,现在有点卡住了。
我有这样一个CNN架构:
class ConvNet(nn.Module): def __init__(self, num_classes=10): super(ConvNet, self).__init__() self.conv1 = nn.Conv2d( in_channels=3, out_channels=16, kernel_size=3) self.conv2 = nn.Conv2d( in_channels=16, out_channels=24, kernel_size=4) self.conv3 = nn.Conv2d( in_channels=24, out_channels=32, kernel_size=4) self.dropout = nn.Dropout2d(p=0.3) self.pool = nn.MaxPool2d(2) self.fc1 = nn.Linear(600, 120) self.fc2 = nn.Linear(512, 10) self.final = nn.Softmax(dim=1) def forward(self, x): # 卷积3层 x = F.max_pool2d(F.relu(self.conv1(x)), 2) # 卷积层的输出 x = self.dropout(x) x = F.max_pool2d(F.relu(self.conv2(x)), 2) # 卷积层的输出 x = self.dropout(x) x = F.max_pool2d(F.relu(self.conv3(x)), 2) # 卷积层的输出 x = self.dropout(x) # 线性层 x = F.interpolate(x, size=(600, 120)) x = x.view(x.size(0), -1) x = self.fc1(x) return x
但是当我尝试用我的图像进行训练时,它不起作用,并且我遇到了这个错误:
RuntimeError: 尺寸不匹配,m1: [16 x 2304000],m2: [600 x 120]
我想添加第二个线性层(self.fc2
)以及最终的SoftMax层(self.final
),但由于我在第一个线性层就卡住了,我无法取得任何进展。
回答:
self.fc1
的输入维度需要与你扁平化张量的特征(第二个)维度相匹配。因此,不要使用self.fc1 = nn.Linear(600, 120)
,你可以将其替换为self.fc1 = nn.Linear(2304000, 120)
。
请记住,因为你使用的是全连接层,模型不能是输入尺寸不变的(与全卷积网络不同)。如果你在x = x.view(x.size(0), -1)
之前更改了通道或空间维度的大小(就像你从上一个问题移动到这个问题时所做的那样),self.fc1
的输入维度将需要相应地更改。