计算量(FLOPs)和参数量(Parameters)

  • FLOPS(全大写):是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度,是一个衡量硬件性能的指标
  • FLOPs(s小写):,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量,可以用来衡量算法/模型的复杂度,也就是我们这里要讨论的计算量。
  • 参数定义(下同):$C_{int}$为输入通道数,k 为卷积核边长, $C_{out}$为输出通道数,$H_{out}*W_{out}$ 为输出特征图的长宽。
  • FLOPs = Paras $H_{out}W_{out}$ ;大致是这样的,参数量是和输入特征图大小无关的。

标准卷积层

  • Parameters:

    • 考虑 bias:$(k^2C_{int}+1)C_{out}$
    • 不考虑 bias:$(k^2C_{int})C_{out}$
  • FLOPs:

    • 考虑 bias:$(2C_{int}k^2)C_{out}H_{out}*W_{out}$
    • 不考虑 bias:$(2C_{int}k^2-1)C_{out}H_{out}*W_{out}$
  • 其实卷积层在实现的时候可以选择加bias或者不加,在很多的框架当中是一个可以选择的参数,为了严谨,这里特地提一下。

  • 如何理解公式?在不考虑 bias的情况下,我们先计算输出feature map中的一个pixel的计算量,然后乘以feature map的规模大小即可,所以主要分析下面FLOPs中的括号部分:

    可以看成两个部分,第一项是乘法运算,第二项是加法运算,因为n个数相加,要加n-1次。所以不考虑 bias,会有一个-1,如果考虑bias,刚刚好中和掉了。✖️️2是因为有$C_{int}k^2$次乘法和$C_{int}k^2$次加法??

深度可分离卷积

深度可分离卷积可分为两个部分,第一部分是分通道卷积(深度卷积),另一部分是1*1卷积,两部分相加即可!

  • Parameters:(不考虑bias)

    • 深度卷积:$k^2*C_{int}$
    • 1*1卷积:$(11C_{int})*C_{out}$
  • FLOPs:(考虑bias)

    • 深度卷积:$(2k^2 )C_{int}H_{out}W_{out}$
    • 1*1卷积:$2C_{int}C_{out}H_{out}W_{out}$

池化层

  • 全局池化:针对输入所有值进行一次池化操作,不论是max、sum还是avg,都可以简单地看做是只需要对每个值算一次。

    • Parameters:池化层没有可学习的参数,故参数量为0;

    • FLOPs:$H_{int}W_{int}C_{int}$

  • 一般池化(注意池化层的:$C_{out} = C_{int}$)

    • Parameters:池化层没有可学习的参数,故参数量为0;-
    • FLOPs:$k^2H_{out}W_{out}*C_{out}$

全连接层

  • Parameters:

    • 考虑bias:$(I+1)*O$
    • 不考虑bias:$I*O$
  • FLOPs:

    • 考虑bias:$(2I)O$
    • 不考虑bias:$(2I-1)O$
  • 分析同理,括号内是一个输出神经元的计算量,拓展到O个输出神经元。

  • 如果该全连接层的输入是卷积层的输出,需要先将输出展开成一列向量:

    例子: $H W D$ 输出到 O,其中参数(包括bias):$(H W D+1) * O$

激活层

  • Sigmoid:根据sigmoid的公式可以知道,每个输入都需要经历4次运算,因此计算量是$HWC*4$(参数含义同ReLU)
  • Relu:Relu一般都是跟在卷积层的后面,这里假设卷积层的输出为$HWC$,因为ReLU函数的计算只涉及到一个判断,因此计算量就是$HWC$