我正在努力学习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)发布于 2019-11-12 04:57:21
这里有一个很好的入门(特别是总结)来计算这类事情:http://cs231n.github.io/convolutional-networks/

哪里
您没有提到输入的宽度/高度,但我假设它们是28x28 MNIST图像。
在这种情况下,我们有:
28722将这些数字插入上面的方程将给您13.5,这是很尴尬的,因为它不是一个整数。在PyTorch的例子中,它似乎可以归结为13。(事实证明,除了这论坛帖子之外,很难找到任何关于这一事实的文档)
编辑: 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
https://stackoverflow.com/questions/58811641
复制相似问题