三、参数计算

        主要有两个部分的参数需要计算,一个是卷积后的尺寸,另一个是池化后的尺寸。先看一些具体的比较简单的例子,方便去数。最后再给出通用的计算公式。

3.1 卷积后的尺寸

3.1.1 无填充、步长为1

        整个过程如下所示:


CNN网络如何求参数的总数目 cnn参数量计算_人工智能

无填充步长为1卷积示意图

         如上图所示,相关数据如下表所示:

CNN网络如何求参数的总数目 cnn参数量计算_人工智能_02

 3.1.2 无填充、步长为2


CNN网络如何求参数的总数目 cnn参数量计算_机器学习_03

无填充步长为2卷积示意图

         如上图所示,相关数据如下表所示:

CNN网络如何求参数的总数目 cnn参数量计算_机器学习_04

        由上述两图、表可知,除卷积核大小外其它所有条件都不变的情况下,第二种情况相较于第一种情况,其输出的尺寸缩小了(2/4)∗(2/4)=1/4,高、宽各自方向上则缩小了2/4=1/2。 

3.1.3 有填充、步长为2

        整个过程如下所示:


CNN网络如何求参数的总数目 cnn参数量计算_层_05

有填充步长为2卷积示意图

         如上图所示,相关数据如下表所示:

CNN网络如何求参数的总数目 cnn参数量计算_层_06

 3.2 池化后的尺寸

3.2.1 无填充、步长为1


CNN网络如何求参数的总数目 cnn参数量计算_cnn_07

无填充步长为1池化示意图

         如上图所示,相关数据如下表所示:

CNN网络如何求参数的总数目 cnn参数量计算_cnn_08

 3.2.2 无填充、步长为2

        整个过程如下所示:


CNN网络如何求参数的总数目 cnn参数量计算_层_09

无填充步长为2池化示意图

         如上图所示,相关数据如下表所示:

CNN网络如何求参数的总数目 cnn参数量计算_层_10

3.2.3 有填充、步长为2

         整个过程如下所示:


CNN网络如何求参数的总数目 cnn参数量计算_层_11

有填充步长为2池化示意图

        如上图所示,相关数据如下表所示:

CNN网络如何求参数的总数目 cnn参数量计算_人工智能_12

 3.3 计算公式

         卷积后的参数无非就三个,通道数、高、宽。其中通道数不用计算,就等于卷积核数量。为方便叙述,记:

CNN网络如何求参数的总数目 cnn参数量计算_CNN网络如何求参数的总数目_13

 3.3.1 卷积部分推导

        给定相关参数后,设卷积核在水平、垂直方向分别可以有效移动(对有填充情况,超出填充部分则该次移动无效。无填充情况,超出输入数据则移动无效。)m、nm、n次,则有:

3.3.1.1 水平方向

        移动情况如下所示:


CNN网络如何求参数的总数目 cnn参数量计算_层_14

水平方向移动示意图

 

CNN网络如何求参数的总数目 cnn参数量计算_人工智能_15

3.3.1.2 垂直方向

         垂直方向的推导与水平方向一致,只不过换了个方向而已,在此不赘述,直接给出其计算公式如下:

CNN网络如何求参数的总数目 cnn参数量计算_cnn_16

 3.3.1.3 结论

        综上,再加入输出通道数,有卷积操作后输出的尺寸的计算公式如下:

CNN网络如何求参数的总数目 cnn参数量计算_CNN网络如何求参数的总数目_17

         如果有疑问,可以把前面的例子拿来验证。Tensorflow中关于这部分的说明参考。官方文档

CNN网络如何求参数的总数目 cnn参数量计算_人工智能_18

https://www.tensorflow.org/api_guides/python/nn#Convolution

3.3.2 池化部分推导

        池化部分因为工作原理和卷积部分基本上是一样的,所以其公式推导也并没有什么不同,有一点需要指出的是,池化部分仍然可以有填充。池化部分的推导这里就不再赘述。

3.3.3 小结

3.3.3.1 公式整合

        综上,整理出卷积/池化参数的通用计算公式如下:

CNN网络如何求参数的总数目 cnn参数量计算_层_19

         使用式(3-9)最右边的表达式计算时一定要注意,这种表达不是特别严谨,这样写是为了兼容网络上的一些博客的写法,分式结果要记得向下取整。

3.3.3.2 参考资料

        大部分参考的文献资料都在相应位置给出了,剩下还有些参考的资料罗列如下:

  • 神经网络之LeNet结构分析及参数详解;

3.4 示例

3.4.1 示例1

        该例子是牛客网上题库中的一个题,试题如下:

        输入图片大小为200×200,依次经过一层卷积(kernel size 5×5,padding 1,stride 2),pooling(kernel size 3×3,padding 0,stride 1),又一层卷积(kernel size 3×3,padding 1,stride 1)之后,输出特征图大小为:
        A. 95        B. 96        C. 97        D. 98        E. 99        F. 100
        答案: C

        可以看出,该网络隐藏层共有3层(2层卷积,1层池化),再加上输入、输出层,该网络是一个5层的NN。

CNN网络如何求参数的总数目 cnn参数量计算_机器学习_20

 3.4.2 示例2

        该例子是经典的LeNet-5,网络结构如下图所示:LeNet-5

CNN网络如何求参数的总数目 cnn参数量计算_人工智能_18

http://www.dengfanxin.cn/wp-content/uploads/2016/03/1998Lecun.pdf


CNN网络如何求参数的总数目 cnn参数量计算_层_22

LeNet-5网络结构图

         其网络参数参考下图(卷积核大小均为5*5,步长1。池化核大小均为2*2,步长为2,通道数不定。):

CNN网络如何求参数的总数目 cnn参数量计算_CNN网络如何求参数的总数目_23

        第1个卷积层C1,有:

CNN网络如何求参数的总数目 cnn参数量计算_人工智能_24

         第1个池化层S2,有:

CNN网络如何求参数的总数目 cnn参数量计算_CNN网络如何求参数的总数目_25

         第2个卷积层C3,有:

CNN网络如何求参数的总数目 cnn参数量计算_机器学习_26

        第2个池化层S4,有:

CNN网络如何求参数的总数目 cnn参数量计算_CNN网络如何求参数的总数目_27

        第3个卷积层C5,有:

CNN网络如何求参数的总数目 cnn参数量计算_机器学习_28

        第1个全连接层F6(全连接层没有卷积/池化操作),有:

CNN网络如何求参数的总数目 cnn参数量计算_机器学习_29

        所有结果计算出来都与原始Paper吻合,证明我们的公式是准确无误的。