本文主要是介绍【深度学习】关于CNN网络的FLOPs的计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在评估一个CNN网络的计算复杂度时,浮点数运算(float point operation)是一个常用的衡量指标。注意本文介绍的主要是MAC(乘法加法操作),在一些论文里是仅仅考虑乘法操作的。
在常规的计算中,通常不考虑非线性函数的计算量(the nonlinearity),对于卷积操作:(带bias)
F L O P s = 2 ∗ H W ∗ ( C i n K 2 + 1 ) C o u t = 2 ∗ ( H W K 2 C i n C o u t + H W C o u t ) FLOPs = 2*HW*(C_{in}K^{2}+1)C_{out} \\ =2*(HWK^{2}C_{in}C_{out} +HW C_{out}) FLOPs=2∗HW∗(CinK2+1)Cout=2∗(HWK2CinCout+HWCout)
此处经评论提醒,已更正
其中式子中 H W K 2 C i n C o u t HWK^{2}C_{in}C_{out} HWK2CinCout为卷积操作, H W C o u t HWC_{out} HWCout为bias操作,2则表示为MAC操作(包含累加及累乘)
上面是NVIDIA在文章《PRUNING CONVOLUTIONAL NEURAL NETWORKS FOR RESOURCE EFFICIENT INFERENCE》文章中的计算方式。
但有人认为这是一种估算,他们认为对于卷积的计算量计算如下(不含bias):
F L O P s = ( 2 ∗ C i n ∗ K 2 − 1 ) ∗ H ∗ W ∗ C o u t FLOPs = (2*C_{in}*K^{2} - 1) * H * W * C_{out} FLOPs=(2∗Cin∗K2−1)∗H∗W∗Cout
其中第一个括号可拆成 ( C i n ∗ K 2 + C i n ∗ K 2 − 1 ) (C_{in} * K^{2} + C_{in} * K^{2} -1) (Cin∗K2+Cin∗K2−1),原因是n个数相加需要n-1次加法,此处不含bias。若没有-1则是带bias的计算方式。他们认为Nvidia是一种估算。
实际上两种计算的差别不是很大。
对于全连接操作:输入维度 I I I,输出维度 O O O,则全连接层(不含bias):
F L O P s = ( 2 × I − 1 ) × O FLOPs = (2 \times I-1) \times O FLOPs=(2×I−1)×O
全连接操作,含bias:
F L O P s = 2 × I × O FLOPs = 2 \times I \times O FLOPs=2×I×O
这里是没有考虑全连接中的bias操作,比如x1+x2+…xn只有(n-1)次加法。
Ref:
- PRUNING CONVOLUTIONAL NEURAL NETWORKS FOR RESOURCE EFFICIENT INFERENCE
- https://www.zhihu.com/question/65305385/answer/451060549
这篇关于【深度学习】关于CNN网络的FLOPs的计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!