一、概念明晰
首先要明确“运算量”和“参数量”两个概念:
参数量:这个比较好理解,例如卷积层中的卷积核c_i*k*k*n_o,其参数量就是相乘的结果。而且,无论输入图像的尺寸怎么变(YOLO实现中的multi scale训练策略),只要模型结构确定,参数量就固定。还需要注意,参数都是FP32(4字节)存放,所以模型大小是参数量*4。
运算量:使用FLOPs衡量,代表浮点运算次数,这个可以衡量算法/模型的复杂度。
还要区分两个容易混淆的量:FLOPS和FLOPs:
FLOPS:Floating point Opreations Per Second,每秒浮点运算次数,理解为计算速度,是一个衡量硬件的标准。GPU算力[Nvidia官网查询]描述的就是这个,这些数值的单位为MM=10^12次。
FLOPs:Floating point Opreations,s是复数,为浮点数操作数。理解为算法的计算量。paper中通常使用的是GFLOPs,即10亿次浮点运算。
二、网络分析
分析一个Conv层,核大小为k,输入通道为C_i,输出通道为C_o,输出的Feature Map尺寸为H*W。
不考虑bias:
,其中有C_i*k*k次乘法 + (C_i*k*k-1)次加法运算,最后合起来乘以H*W*C_o。
考虑bias:
,其中的2可以视为一个MAC有两个操作。
上面的计算方式精确地计算了卷积层所需要的opreation数,但是也有一种计算方法直接给出了conv的FLOPs,例如CVPR2020的GhostNet中对卷积层的直接计算:
参考博文:
FLOPS理解:https://blog.csdn.net/smallhujiu/article/details/80876875
MAC:https://www.mobibrw.com/2019/17864
知乎算力和参数:https://www.zhihu.com/question/65305385/answer/451060549
FLOPS和FLOPs辨析:https://www.cnblogs.com/king-lps/p/10904552.html