在cnn之后计算完全连接层中的形状

时间:2019-11-12 03:34:07

标签: python conv-neural-network pytorch

我正在尝试学习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)

1 个答案:

答案 0 :(得分:2)

这里是计算这些事情的一个很好的入门(特别是摘要):  http://cs231n.github.io/convolutional-networks/

Calculations for Height and Width after applying a convolution

哪里

  • W =输入宽度
  • Fw =接收域(内核)宽度
  • P =填充
  • Sw =沿宽度大步

您没有提到输入的宽度/高度,但我假设它们是28x28 MNIST图像。

在这种情况下,我们有:

  • W = 28
  • Fw = 7
  • P = 2
  • Sw = 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

相关问题