关于CNN FLOPs的计算

FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。

FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。

在评估一个CNN的计算复杂度时,浮点数计算是一个常用的衡量指标。注意本文介绍的主要是MAC(memory access cost),即乘加法操作,在一些论文中是仅仅考虑乘法操作的。

  • 下面是NVIDIA在文章《PRUNING CONVOLUTIONAL NEURAL NETWORKS FOR RESOURCE EFFICIENT INFERENCE》文章中的计算方式。

    在常规计算中,通常不考虑非线性函数(激活函数)的计算量,对于卷积操作(带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\times (H\times W\times C_{in}\times K^2 + 1)\times C_{out} = 2(H\times W\times K^2 \times C_{in} \times C_{out} + C_{out}) FLOPs=2×(H×W×Cin×K2+1)×Cout=2(H×W×K2×Cin×Cout+Cout)

    C i n C_{in} Cin为输入通道数, C o u t C_{out} Cout为输出通道数, K K K为卷积核大小, H , W H,W H,W分别是输出特征图高度和宽度。

    其中, H × W × K 2 × C i n × C o u t H\times W\times K^2 \times C_{in}\times C_{out} H×W×K2×Cin×Cout为卷积操作, C o u t C_{out} Cout为bias操作,2是因为一个MAC操作算两个操作(包括累加和累乘)。

  • 但有人认为这是一种估算,他们认为对于卷积的计算量计算如下(不含bias):

    F L O P s = ( 2 × C i n × K 2 − 1 ) × H × W × C o u t FLOPs = (2\times C_{in}\times K^2 -1)\times H\times W\times C_{out} FLOPs=(2×Cin×K21)×H×W×Cout

    理解此公式需分两步, ( 2 × C i n × K 2 − 1 ) (2\times C_{in}\times K^2 -1) (2×Cin×K21)是第一步,计算出输出特征图的一个像素点,然后再乘以 H × W × C o u t H\times W\times C_{out} H×W×Cout扩展到整个输出特征图。 ( 2 × C i n × K 2 − 1 ) (2\times C_{in}\times K^2 -1) (2×Cin×K21)又可以分两步理解, ( 2 × C i n × K 2 − 1 ) = ( C i n × K 2 ) + ( C i n × K 2 − 1 ) (2\times C_{in}\times K^2 -1)=(C_{in}\times K^2)+(C_{in}\times K^2-1) (2×Cin×K21)=(Cin×K2)+(Cin×K21),第一项是乘法运算数,第二项是加法运算数,因为有 n n n个数相加,要加 n − 1 n-1 n1次,所以不考虑bias,会有一个 − 1 -1 1,如果考虑bias,刚好中和掉,括号内变为 2 × C i n × K 2 2\times C_{in}\times K^2 2×Cin×K2

实际上两种计算的差别不大。

  • 对于全连接操作:输入维度 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操作,比如 x 1 + x 2 + . . . + x n x_1+x_2+...+x_n x1+x2+...+xn只有 n − 1 n-1 n1次加法。

本博客转载自https://blog.csdn.net/shwan_ma/article/details/84924142

  • 还有另一种常用的FLOPs估算:
    对于一个标准卷积层,假设其大小是 h × w × c × n h\times w\times c\times n h×w×c×n,其中 c c c是输入通道数, n n n是输出通道数, h , w h,w h,w分别是卷积核的高度和宽度,输出的特征图大小是 H ′ × W ′ H'\times W' H×W,则该卷积层

N U M p a r a m s = n × ( h × w × c + 1 ) NUM_{params} = n\times (h\times w\times c + 1) NUMparams=n×(h×w×c+1)

N U M F L O P s = H ′ × W ′ × n × ( h × w × c + 1 ) NUM_{FLOPs} = H'\times W' \times n\times (h\times w\times c+1) NUMFLOPs=H×W×n×(h×w×c+1)

F L O P s = H ′ × W ′ × N U M p a r a m s FLOPs=H'\times W'\times NUM_{params} FLOPs=H×W×NUMparams.

对于一个Depthwise Separable Convolution,则

N U M p a r a m s = h × w × c + n × 1 × 1 × c NUM_{params} = h\times w\times c +n\times 1\times 1\times c NUMparams=h×w×c+n×1×1×c

N U M F L O P s = H ′ × W ′ × h × w × c + H ′ × W ′ × n × 1 × 1 × c NUM_{FLOPs} = H'\times W' \times h\times w\times c + H'\times W' \times n\times 1\times 1\times c NUMFLOPs=H×W×h×w×c+H×W×n×1×1×c

Reference

  • https://arxiv.org/abs/1611.06440v2
  • https://www.zhihu.com/question/65305385/answer/451060549

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