我正在学习 PyTorch 和 CNN,但对如何计算 Conv2D 层后第一个 FC 层的输入数量感到困惑。
我的网络架构如下所示,这是我使用此处解释的计算的推理。
输入图像将具有形状 (1 x 28 x 28)。
第一个 Conv 层的步幅为 1,填充为 0,深度为 6,我们使用 (4 x 4) 内核。因此输出将是 (6 x 24 x 24),因为新体积是 (28 - 4 + 2*0)/1。
然后我们将它与 (2 x 2) 内核和步幅 2 合并,因此我们得到 (6 x 11 x 11) 的输出,因为新卷是 (24 - 2)/2。
第二个 Conv 层和池化层也是如此,但这次在 Conv 层中使用 (3 x 3) 内核,最终生成 (16 x 3 x 3) 特征图。
我的假设是第一个线性层应该有 144 个输入(16 * 3 * 3),但是当我以编程方式计算输入时,我得到 400。我错过了什么?
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 6, 4)
self.conv2 = nn.Conv2d(6, 16, 3)
self.fc1 = nn.Linear(400, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, len(classes))
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_features # 400, not 144
相关但不那么重要:人们是否使用推理来获得良好的内核大小、层数和池层数,或者每个人都只是看看 SOTA 论文做了什么?