我正在尝试学习PyTorch。但是,对于卷积和最大池化之后的完全连接层中的形状,我确实感到困惑。
案例1。我们如何计算nn.Linear
中的数字5408
我认为5408 = 32 * m * m,其中32来自nn.Conv2d(3, **32**, kernel_size=7, stride=2)
,但是m等于13。但是,13来自哪里?
simple_model = nn.Sequential(
nn.Conv2d(3, 32, kernel_size=7, stride=2),
nn.ReLU(inplace=True),
Flatten(), # see above for explanation
nn.Linear(5408, 10), # affine layer
)
情况2 我们如何在fc = nn.Linear(64*4*4, 10)
中获得数字4 * 4,情况1的问题相同。我不知道数字4的来源... >
# (conv -> batchnorm -> relu -> maxpool) * 3 -> fc
layer1 = nn.Sequential(
nn.Conv2d(3, 16, kernel_size = 5, padding = 2),
nn.BatchNorm2d(16),
nn.ReLU(),
nn.MaxPool2d(2)
)
layer2 = nn.Sequential(
nn.Conv2d(16, 32, kernel_size = 3, padding = 1),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(2)
)
layer3 = nn.Sequential(
nn.Conv2d(32, 64, kernel_size = 3, padding = 1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(2)
)
fc = nn.Linear(64*4*4, 10)
答案 0 :(得分:2)
这里是计算这些事情的一个很好的入门(特别是摘要): http://cs231n.github.io/convolutional-networks/
哪里
您没有提到输入的宽度/高度,但我假设它们是28x28
MNIST图像。
在这种情况下,我们有:
28
7
2
2
将这些数字放在上面的公式中将使您13.5
尴尬,因为它不是整数。就PyTorch而言,它似乎将其四舍五入至13。(实际上,除了this论坛帖子之外,很难找到关于这一事实的任何文档)
编辑: cuDNN的实际实现在这里:https://github.com/pytorch/pytorch/blob/fdab1cf0d485820907d7541266d69b70e1d3d16b/aten/src/ATen/native/cudnn/Conv.cpp#L157-L158
对于第二种情况,您的输入似乎不是28x28
,而必须是32x32
。卷积不会缩小高度和宽度(您可以将数字自己插入并检查)。但是,MaxPool2d(2)
层在每次卷积后会将高度和宽度缩小一半。所以你从:
32x32
-> 16x16
-> 8x8
-> 4x4