CNN学习笔记-模型衡量参数
计算量
CNN的计算量通常用乘加数(Multi-Add)来表示,与输入输出图尺寸有关,通常卷积层的占比最大。
卷积层
假设kernel-size为\(k \times k \times C_{in}\),数量为\(C_{out}\)。输入feature map尺寸为\(H_{in} \times W_{in} \times C_{in}\),输出feature map尺寸为\(H_{out} \times W_{out} \times C_{out}\)
那么Multi-Add为\((k \times k \times C_{in} + k \times k \times C_{in}-1) \times (H_{out} \times W_{out} \times C_{out}) = (2 \times k \times k \times C_{in} -1) \times (H_{out} \times W_{out} \times C_{out})\) (不考虑bias的情况)
若考虑bias,则Multi-Add为\((k \times k \times C_{in} + k \times k \times C_{in}) \times (H_{out} \times W_{out} \times C_{out}) = (2 \times k \times k \times C_{in}) \times (H_{out} \times W_{out} \times C_{out})\)
Multi-Add的计算意义为:
\(k \times k \times C_{in}\):表示一个kernel的一次卷积操作,最后在输出feature map形成一个结点的乘法操作次数。
\(k \times k \times C_{in} - 1\):表示那上述乘数结果加在一起的加法次数。
\(\times (H_{out} \times W_{out} \times C_{out})\):表示一共进行了这么多次乘加操作(feature map的一个结点对应kernel的一次完整卷积操作)
考虑bias加一是因为一个kernel对应一个位置的卷积操作中,有一个与偏置常数相关的加法操作,+1后与-1抵消。
全连接层
假设I代表input size,O表示output size。
那么Multi-Add为\((2 \times I -1) \times O\)
同理考虑bias后无-1。I+(I-1)的意义与convolutional layer一致,前者表示乘法数,后者表示加法数。
参数量
CNN的参数量,即parameters,与输入图像尺寸无关。
卷积层
假设kernel-size为\(k \times k \times C_{in} \times C_{out}\),即卷积核数量为\(C_{out}\)。
那么\(parameters = (k \times k \times C_{in} \times C_{out}) + C_{out}\)
\(k \times k \times C_{in} \times C_{out}\)表示kernel中的所有参数量,\(+ C_{out}\)表示bias数量,一个kernel对应一个bias。
全连接层
假设I代表input size,O表示output size。
parameters = I × O + O
+O表示每一个输出结点有一个bisa
池化层
Pooling layer无参数。
FLOPs
全称为floating point operations,即浮点运算量,理解为计算量。
在CNN中理解为等同于Multi-Add。
模型大小
Model Size(MB),即模型保存在本地时的大小。
总结
附上一张经典模型的衡量标准图
1GFLOPs = 1×10^9 FLOPs