一、参数量
参数量一般指可学习参数的数量,在CNN中主要有卷积层(Conv),批归一化层(BN),和全连接层(FC)含有可学习参数。
1. 卷积层参数量:
(1)普通卷积层的参数量:
其中是输出通道数,是输入通道数,是卷积核的宽,是卷积核的高。
(2)分组卷积的参数量:
其中为分组数。分组卷积把输入分为组,分别在组内进行卷积计算,参数量减少了倍。
(3)深度分离卷积的参数量:
深度分离卷积可视为分组卷积在时的特殊情况。
【注意】如果Conv后面有BN层,则Conv计算不需要偏置,即 bias=False。
【解释】因为BN是线性计算,BN层已经有偏置,且两个偏置都是可学习参数,加在一起等效于一个偏置的作用:
Conv有偏差+BN:,
Conv无偏差+BN:
【防杠】上面的推导只是一个简单的示意,实际计算有更多细节,不在本文讨论范围。
2. 批归一化层参数量:
BN层只有放缩因子和偏置这两组可学习参数,这里的是通道数。
3. 全连接层参数量:
其中是输出神经元数量,是输入神经元数量,第二项是偏置的。
二、计算量
当前相关论文中多使用浮点运算量(FLOPs)作为计算量的指标,FLOPs原本指乘法和加法的计算次数总和,即单次乘法和单次加法各算一次浮点运算。如:浮点运算量是2,的浮点运算量是3。
但在当前绝大多数深度学习论文中,FLOPs这一指标实际上计算的是“乘-加”数(MACs),即乘且加的数量。如:的乘-加数是1,的乘-加数是2。
本文将错就错,本文中的FLOPs计算的内容实际上就是MACs。
CNN中几乎所有层(除ReLU外)都存在FLOPs(有些论文中认为池化和BN没有FLOPs,因为它们不是标准的乘-加运算),下面给出几种常用模块的计算量公式。
另外,本文给出的计算量是模型推断阶段输入单张图片的计算量,如果要计算批量输入是的计算量,只需要在单张输入图像计算量的基础上BatchSize即可。
1. 卷积层的FLOPs:
(1)普通卷积的FLOPs:
其中和是该卷积层输出特征图的宽和高。方便起见,本文直接忽略偏差的FLOPs,细究的话的FLOPs为,因为被广播成尺寸为输出特征图大小后在每个输出激活值(浮点数)上进行了一次加法运算,相当于特殊的乘法和累加。忽略这一项对全局影响不大。
(2)分组卷积的FLOPs:
(3)深度分离卷积的FLOPs:
深度分离卷积可以视作分组卷积在且时的特殊情况。
2. BN的FLOPs:
BN层的FLOPs一般只考虑推断阶段,训练阶段还涉及到归一化计算的运算量。当然,由于BN本身就是线性计算,可以和前面的卷积层合并(重参数化),忽略BN层的FLOPs是有一定合理性的。我们给出一个参考计算:
由于BN是对特征图上的所有激活值进行一次放缩和一次移位,两次操作都可以视为特殊的“乘-加”,所以要在特征图激活值总数上乘2。
3. 池化层的FLOPs:
其中和分别为池化窗口的高和宽。池化层输出特征图中的每个值都是由次浮点操作得到的。
4. ReLU层的FLOPs:
ReLU是对每个激活值的比较运算,不涉及浮点运算和乘加运算,故其没有浮点运算量。
5. 全连接层的FLOPs:
以上便是几种CNN模型中常见模块的参数量和计算量公式,其它没有提及到的我将持续补充。
当然,手工计算这些数据的十分麻烦的,在下一篇文章里,我们将总结几种常用的计算模型参数量和计算量的库。并且将给出使用PyTorch从零实现计算这些数据的代码。
网友评论