我们以VGG-16为例,来探讨一下如何计算卷积层、全连接层的参数量、计算量。为了简单、直观地理解,以下讨论中我们都会忽略偏置项,实践中必须考虑偏置项。
【卷积层的参数量】
什么是卷积层的参数?
卷积层的基本原理就是图像的二维卷积,即将一个二维卷积模板先翻转(旋转180°),再以步长stride进行滑动,滑动一次则进行一次模板内的对应相乘求和作为卷积后的值。
具体的细节请参考我之前的文章CNN基础知识——卷积(Convolution)、填充(Padding)、步长(Stride)
那谁是参数呢?图像本身有参数吗?怎么可能呢。
那答案只有一个:filter。
如上图所示,就是一个
的卷积核,它的参数就是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
。
feature map中的每一个像素点,都是64个
filter 共同作用于原图计算一次得到的,所以它的计算量为
。
已经知道单个像素的计算量,那乘以feature map所有像素,就是一次卷积的计算量:
。
(重点,重点,重点)
计算公式:计算量 = 输出的feature map * 当前层filter
这仅仅是单个样本前向传播计算量,实际计算量还应乘以batch size。
【全连接层的计算量】
全连接层的计算量,如何计算呢?其实和卷积层计算量的计算方法是一样的。
VGG-16最后一次卷积得到的feature map为
,全连接层是将feature map展开成一维向量
。则FC层的计算量为
。
通过以上讨论可以发现:我们需要减少网络参数时主要针对全连接层;进行计算优化时,重点放在卷积层。
【CNN未来的发展趋势】
1.小--模型有效且参数少
2.快--运行速度快
3.准--与大模型有相当的准确率