卷积尺寸计算的核心要点


title: 卷积尺寸计算的核心要点
date: 2019-01-25 16:38:19
category: 默认分类


本文介绍 卷积尺寸计算的核心要点

卷积尺寸计算的核心要点

This article was original written by Jin Tian, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat: jintianiloveu

很多时候i我们在计算卷积尺寸的时候,会忽略一些东西。比如我抛出两个问题很多人肯定不知道:

  1. VGG第一层卷积之后的尺寸是多大,假如输入224;
  2. 第一个问题答案的原因是为什么?

首先告诉大家,假如你输入尺寸是224, 那么第一层的输出也是224, 大家可以用 alfred 这个库,github 地址: http://github.com/jinfagang/alfred 里面有一个summary pytorch model的函数,可以帮你打印每一层的网络输出, 比如VGG的输出是这样的:

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 224, 224]           1,792
              ReLU-2         [-1, 64, 224, 224]               0
            Conv2d-3         [-1, 64, 224, 224]          36,928
              ReLU-4         [-1, 64, 224, 224]               0
         MaxPool2d-5         [-1, 64, 112, 112]               0
            Conv2d-6        [-1, 128, 112, 112]          73,856
              ReLU-7        [-1, 128, 112, 112]               0
            Conv2d-8        [-1, 128, 112, 112]         147,584
              ReLU-9        [-1, 128, 112, 112]               0
        MaxPool2d-10          [-1, 128, 56, 56]               0
           Conv2d-11          [-1, 256, 56, 56]         295,168
             ReLU-12          [-1, 256, 56, 56]               0
           Conv2d-13          [-1, 256, 56, 56]         590,080
             ReLU-14          [-1, 256, 56, 56]               0
           Conv2d-15          [-1, 256, 56, 56]         590,080
             ReLU-16          [-1, 256, 56, 56]               0
        MaxPool2d-17          [-1, 256, 28, 28]               0
           Conv2d-18          [-1, 512, 28, 28]       1,180,160
             ReLU-19          [-1, 512, 28, 28]               0
           Conv2d-20          [-1, 512, 28, 28]       2,359,808
             ReLU-21          [-1, 512, 28, 28]               0
           Conv2d-22          [-1, 512, 28, 28]       2,359,808
             ReLU-23          [-1, 512, 28, 28]               0
        MaxPool2d-24          [-1, 512, 14, 14]               0
           Conv2d-25          [-1, 512, 14, 14]       2,359,808
             ReLU-26          [-1, 512, 14, 14]               0
           Conv2d-27          [-1, 512, 14, 14]       2,359,808
             ReLU-28          [-1, 512, 14, 14]               0
           Conv2d-29          [-1, 512, 14, 14]       2,359,808
             ReLU-30          [-1, 512, 14, 14]               0
        MaxPool2d-31            [-1, 512, 7, 7]               0
           Linear-32                 [-1, 4096]     102,764,544
             ReLU-33                 [-1, 4096]               0
          Dropout-34                 [-1, 4096]               0
           Linear-35                 [-1, 4096]      16,781,312
             ReLU-36                 [-1, 4096]               0
          Dropout-37                 [-1, 4096]               0
           Linear-38                 [-1, 1000]       4,097,000
================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.19
Forward/backward pass size (MB): 218.59
Params size (MB): 527.79
Estimated Total Size (MB): 746.57
----------------------------------------------------------------

但是问题来了,为什么第一层和第二层的输出尺寸都是224没有变呢?其实根本原因是 这一层的卷积kernel size是3,而padding是1, 当你卷积核是3, padding是1,的时候,输出尺寸是不变的。

规律

其实背后的规律就是卷积的运算方式。如果卷积核是5,那么padding设置为2,则输出尺寸也不变。 简单来说就是:

P = (F-1)/2

只要是这样,输入输出就不变,但是问题来了,这个操作有什么用?你尺寸不变,特征就不抽象,这不是白白增加参数进行无谓的计算吗?其实这个设计的本质,或者说wisdom在于:我可以通过保证spatial分辨率不变的情况下,更多的叠加深层的网络. 可以看到实际上在很多decent的网络设计中,开头很多上来就是这么一层不改变尺寸的卷积,比如Resnet。

猜你喜欢

转载自blog.csdn.net/weixin_34408624/article/details/87100761