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我们在计算卷积尺寸的时候,会忽略一些东西。比如我抛出两个问题很多人肯定不知道:
- VGG第一层卷积之后的尺寸是多大,假如输入224;
- 第一个问题答案的原因是为什么?
首先告诉大家,假如你输入尺寸是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。
网友评论