普通卷积
1. 公式
计算公式:
参数量=(filter size * 前一层特征图的通道数 )* 当前层filter数量
计算量 = 参数量* 输出图的尺度
详细如下:
输入卷积:Win * Hin * Cin
卷积核:k * k
输出卷积:Wout * Hout * Cout
参数量:(即卷积核的参数)
k * k * Cin * Cout
或者:(k * k * Cin + 1) * Cout (包括偏置bias)
计算量:
k * k * Cin * Wout * Hout * Cout
2. 详解
2.1 参数量计算
【卷积层的参数量】
VGG-16为例,Conv1-1,输入224x224x3 ,64个 3x3 filter,输出feature map 224x224x64 。
则Conv1-1的参数量为: 3x3x3x64 。
同理,可以计算其它卷积层的参数量。感兴趣的同学可以自己动手算一下。
【全连接层的参数量】
上面已经说过卷积层的参数量计算方法了,那如何计算全连接层的参数量?其实和卷积层参数量的计算方法是一样的。
VGG-16最后一次卷积得到的feature map为7x7x512 ,全连接层是将feature map展开成一维向量 1x4096。实际上,我们就是用4096个 的filter去做卷积(可以理解为是一个卷积层)。
我们就可以计算第一个FC的参数量7x7x512x4096 。
1亿啊,这个数字好大的。这也是为什么说:全连接层参数冗余。全连接层参数就可占整个网络参数80%左右,好吓人的。
2.1 参数量计算
【卷积层的计算量】
一次卷积的计算量,如何计算呢?
以VGG-16为例,Conv1-1,输入 224x224x3 ,64个 3x3 filter,输出feature map112x112x64 。
feature map中的每一个像素点,都是64个 3x3 filter 共同作用于原图计算一次得到的,所以它的计算量为 3x3x64 。
已经知道单个像素的计算量,那乘以feature map所有像素,就是一次卷积的计算量: 112x112x3x3x3x64。
【全连接层的计算量】
全连接层的计算量,如何计算呢?其实和卷积层计算量的计算方法是一样的。
VGG-16最后一次卷积得到的feature map为7x7x512 ,全连接层是将feature map展开成一维向量 1x4096 。则FC层的计算量为 7x7x512x1x4096。
通过以上讨论可以发现:我们需要减少网络参数时主要针对全连接层;进行计算优化时,重点放在卷积层。