CNN卷积层、全连接层的参数量、计算量

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

【卷积层的参数量】

什么是卷积层的参数?

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

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

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

那答案只有一个:filter。

如上图所示,就是一个 3\times3 的卷积核,它的参数就是9个。

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

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

(重点,重点,重点)

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

VGG-16为例,Conv1-1,输入 224\times224\times3 ,64个 3\times3 filter,输出feature map 224\times224\times64

Conv1-1的参数量为 3\times3\times3\times64=1728

Conv2-1,输入 112\times112\times64 ,128个 3\times3 filter,输出feature map 112\times112\times128

Conv2-1的参数量 3\times3\times64\times128=73728

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

【全连接层的参数量】

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

VGG-16最后一次卷积得到的feature map为 7\times7\times512 ,全连接层是将feature map展开成一维向量 1\times4096实际上,我们就是用4096个7\times7\times512 的filter去做卷积(可以理解为是一个卷积层)。

我们就可以计算第一个FC的参数量 7\times7\times512\times4096=102760448

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

【卷积层的计算量】

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

以VGG-16为例,Conv1-1,输入 224\times224\times3 ,64个 3\times3 filter,输出feature map 224\times224\times64

feature map中的每一个像素点,都是64个 3\times3 filter 共同作用于原图计算一次得到的,所以它的计算量为 3\times3\times64=576

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

(重点,重点,重点)

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

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

【全连接层的计算量】

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

VGG-16最后一次卷积得到的feature map为 7\times7\times512 ,全连接层是将feature map展开成一维向量 1\times4096 。则FC层的计算量为7\times7\times512\times1\times4096=102760448

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

【CNN未来的发展趋势】

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

2.快--运行速度快

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

发布于 2019-08-29