首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cnn后全连接层的形状计算

cnn后全连接层的形状计算
EN

Stack Overflow用户
提问于 2019-11-12 03:34:07
回答 1查看 826关注 0票数 0

我正在努力学习PyTorch。但是,在卷积和最大池之后,我真的对一个完全连接的层的形状感到困惑。

案例1.我们如何计算nn.Linear中的5408,我认为5408 = 32 *m* m,其中32来自nn.Conv2d(3, **32**, kernel_size=7, stride=2),但m等于13。然而,13是从哪里来的呢?

代码语言:javascript
复制
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是从哪里来的……

代码语言:javascript
复制
# (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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-12 04:57:21

这里有一个很好的入门(特别是总结)来计算这类事情:http://cs231n.github.io/convolutional-networks/

哪里

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

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

在这种情况下,我们有:

  • W= 28
  • Fw = 7
  • P= 2
  • Sw = 2

将这些数字插入上面的方程将给您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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58811641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档