我在尝试构建一个卷积神经网络时遇到了这个错误:
---> 52 x = x.view(x.size(0), 5 * 5 * 16)RuntimeError: shape '[16, 400]' is invalid for input of size 9600
我不清楚 ‘x.view’ 这一行的输入应该是什么。此外,我不太明白在我的代码中应该使用 ‘x.view’ 函数多少次。是只在3个卷积层和2个线性层之后使用一次吗?还是在每一层之后使用5次?
这是我的CNN代码:
import torch.nn.functional as F# Convolutional neural networkclass 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(16 * 5 * 5, 120) self.fc2 = nn.Linear(512, 10) self.final = nn.Softmax(dim=1) def forward(self, x): print('shape 0 ' + str(x.shape)) x = F.max_pool2d(F.relu(self.conv1(x)), 2) x = self.dropout(x) print('shape 1 ' + str(x.shape)) x = F.max_pool2d(F.relu(self.conv2(x)), 2) x = self.dropout(x) print('shape 2 ' + str(x.shape)) # x = F.max_pool2d(F.relu(self.conv3(x)), 2) # x = self.dropout(x) x = F.interpolate(x, size=(5, 5)) x = x.view(x.size(0), 5 * 5 * 16) x = self.fc1(x) return xnet = ConvNet()
有人能帮我理解这个问题吗?
x.shape
的输出是:
shape 0 torch.Size([16, 3, 256, 256])
shape 1 torch.Size([16, 16, 127, 127])
shape 2 torch.Size([16, 24, 62, 62])
谢谢。
回答:
这意味着通道和空间维度的乘积不是 5*5*16
。要展平张量,请将 x = x.view(x.size(0), 5 * 5 * 16)
替换为:
x = x.view(x.size(0), -1)