卷积层的算力评估(MACC和FOPS)

深度学习模型算力评估:卷积层MACC与FLOPS计算
本文以Lenet模型为例,探讨卷积层的算力评估。通过计算得出第二层卷积层的MACC数量,与实际测量结果进行对比,并解释了理论值与实际测量值的差异。同时,介绍了参数和激活函数的数量计算方法。

以比较简单的lenet网络模型为例,我们尝试推导主要算子的算力计算公式,并看一下它的各层理论算力要求。

lenet网络结构

以第二层为例,他的输入尺寸是1*28*28*1的一张feature map,卷积核为 5*5*1,stride_h和stride_w均为1, pad_h,pad_w均为0,说明不做padding,输出feature map会缩小。

卷积层的算力评估方法

卷积模型,典型的卷积层计算如下图所示:

如果输入特征图的宽高分别是N_{ir},N_{ic},输出特征图的宽高分别是N_{or},N_{oc},上下左右填充分别为P_{up},P_{bottom}, P_{left},P_{right},水平和垂直方向上的卷积步长为s_c,s_r,卷集核宽高分别为K_r, K_c,则输出特征图的尺寸计算公式如下:

N_{oc}=\frac{N_{ic}-K_c+P_{left}+P_{right}}{s_c}+1

N_{or}=\frac{N_{ir}-K_r+P_{up}+P_{bottom}}{s_r}+1

 根据此公式,可以计算得到:

N_{oc}=\frac{28-5+0+0}{1}+1=24

N_{or}=\frac{28-5+0+0}{1}+1=24

所以,输出feature map的尺寸是24*24。

卷积算力计算

每做一次卷积,生成一个右图中的黄色方块,假设卷积核个数为M,通道数为C,每产生一个卷积结果,要进行K_r*K_c*C*2的浮点计算,而最终输出的feature map有N_{or}*N_{oc}*M个结果。所以卷积总的浮点计算量如下:

\boldsymbol{Total = K_r*K_c*C*2*N_{or}*N_{oc}*M}

 所以,带入数据得到:

之所以乘以2是因为每次MAC都要分成乘法和加法两次运算,也就是总共需要576000次的浮点数运算。

实际测量

前面我们已经计算出lenet第二层卷积层的理论浮点计算量为28800.pegasus有分析工具也可以对模型进行算力分析,我们用分析工具来验证一下,上面的计算是否正确:

测试命令为:

pegasus measure --model lenet.json

输出结果如下图所示:

最后输出总的结果为:

sum_macc:2.29M sum_param:420.41K sum_activation:20.51K

同时生成了analysis.json文件,里面列出了各层的算力需求清单,我们直接看第二层conv层面的分析数据,注意看第40行,macc值为:288000,和理论值差着一个因子2,原因何在?

这里直接计算macc表示MAC而不是FOPS了,如果计算FOPS,需要乘以2,计算MACC,就不需要了,应该是这样的吧。

这样就和工具分析一致了。

param个数计算:

卷积层中,参数完全由卷积核提供,所以参数个数为 5*5*20=500个,实际上,由于每个卷积核通道对应一个偏置,准确的数量应该是500+20=520个。

而激活函数的数量为24*24*20=11520,和输出神经元的个数一致。


结束!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papaofdoudou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值