【深度学习】关于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 + C o u t ) FLOPs = 2*(HWC_{in}K^{2}+1)C_{out} \\ =2*(HWK^{2}C_{in}C_{out} + C_{out}) FLOPs=2(HWCinK2+1)Cout=2(HWK2CinCout+Cout)

其中式子中 H W K 2 C i n C o u t HWK^{2}C_{in}C_{out} HWK2CinCout为卷积操作, C o u t C_{out} Cout为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=(2CinK21)HWCout

其中第一个括号可拆成 ( C i n ∗ K 2 + C i n ∗ K 2 − 1 ) (C_{in} * K^{2} + C_{in} * K^{2} -1) (CinK2+CinK21),原因是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×I1)×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:

  1. PRUNING CONVOLUTIONAL NEURAL NETWORKS FOR RESOURCE EFFICIENT INFERENCE
  2. https://www.zhihu.com/question/65305385/answer/451060549

你可能感兴趣的:(深度学习)