我们以VGG-16为例,来探讨一下如何计算卷积层、全连接层的参数量、计算量。为了简单、直观地理解,以下讨论中我们都会忽略偏置项,实践中必须考虑偏置项。




cnn layer参数 cnn参数量_全连接


【卷积层的参数量】

什么是卷积层的参数?

卷积层的基本原理就是图像的二维卷积,即将一个二维卷积模板先翻转(旋转180°),再以步长stride进行滑动,滑动一次则进行一次模板内的对应相乘求和作为卷积后的值。

具体的细节请参考我之前的文章CNN基础知识——卷积(Convolution)、填充(Padding)、步长(Stride)

那谁是参数呢?图像本身有参数吗?怎么可能呢。

那答案只有一个:filter。


cnn layer参数 cnn参数量_cnn layer参数_02


如上图所示,就是一个


的卷积核,它的参数就是9个。


如果有多个通道呢?这简单啊,就用单通道卷积核的参数量乘以通道数呗。

这仅仅是一个filter的参数量,卷积层有若干个filter啊?

(重点,重点,重点)

计算公式参数量=(filter size * 前一层特征图的通道数 )* 当前层filter数量

VGG-16为例,Conv1-1,输入


,64个


filter,输出feature map



Conv1-1的参数量为



Conv2-1,输入


,128个


filter,输出feature map



Conv2-1的参数量



同理,可以计算其它卷积层的参数量。感兴趣的同学可以自己动手算一下。

【全连接层的参数量】

上面已经说过卷积层的参数量计算方法了,那如何计算全连接层的参数量?其实和卷积层参数量的计算方法是一样的

VGG-16最后一次卷积得到的feature map为


,全连接层是将feature map展开成一维向量


实际上,我们就是用4096个

的filter去做卷积

(可以理解为是一个卷积层)。

我们就可以计算第一个FC的参数量



1亿啊,这个数字好大的。这也是为什么说:全连接层参数冗余。全连接层参数就可占整个网络参数80%左右,好吓人的。

【卷积层的计算量】

一次卷积的计算量,如何计算呢?

以VGG-16为例,Conv1-1,输入


,64个


filter,输出feature map



cnn layer参数 cnn参数量_全连接


feature map中的每一个像素点,都是64个


filter 共同作用于原图计算一次得到的,所以它的计算量为



已经知道单个像素的计算量,那乘以feature map所有像素,就是一次卷积的计算量:



(重点,重点,重点)

计算公式:计算量 = 输出的feature map * 当前层filter

这仅仅是单个样本前向传播计算量,实际计算量还应乘以batch size

【全连接层的计算量】

全连接层的计算量,如何计算呢?其实和卷积层计算量的计算方法是一样的

VGG-16最后一次卷积得到的feature map为


,全连接层是将feature map展开成一维向量


。则FC层的计算量为



通过以上讨论可以发现:我们需要减少网络参数时主要针对全连接层;进行计算优化时,重点放在卷积层。

【CNN未来的发展趋势】

1.小--模型有效且参数少

2.快--运行速度快

3.准--与大模型有相当的准确率