0


神经网络的参数量(Params)和计算量(FLOPs)

定义

参数量(Params)

参数量是指模型训练中需要训练的参数总数。用来衡量模型的大小(计算空间复杂度)。

计算量(FLOPs)

浮点运算次数,理解为计算量(计算时间复杂度),可以用来衡量算法的复杂度,常用做神经网络模型速度的间接衡量标准(虽然最近已经有文章证明靠FLOPs间接标准评价模型的速度是不靠谱的,因为模型的计算速度还跟内存的吞吐等因素相关,但此标准依然广泛用作模型速度的参考评价标准)。在计算 FLOPS时,我们通常将加,减,乘,除,求幕,平方根等作为单个FLOP进行计数。

公式表示

卷积层

在这里插入图片描述
输入维度:

      W 
     
     
     
       i 
      
     
       n 
      
     
    
   
     ∗ 
    
    
    
      H 
     
     
     
       i 
      
     
       n 
      
     
    
   
     ∗ 
    
    
    
      C 
     
     
     
       i 
      
     
       n 
      
     
    
   
  
    W_{in}*H_{in}*C_{in} 
   
  
Win​∗Hin​∗Cin​

输出维度:

      W 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
     ∗ 
    
    
    
      H 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
     ∗ 
    
    
    
      C 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
  
    W_{out}*H_{out}*C_{out} 
   
  
Wout​∗Hout​∗Cout​

卷积核:

      k 
     
    
      w 
     
    
   
     ∗ 
    
    
    
      k 
     
    
      h 
     
    
   
  
    k_w*k_h 
   
  
kw​∗kh​

参数量:

      k 
     
    
      w 
     
    
   
     ∗ 
    
    
    
      k 
     
    
      h 
     
    
   
     ∗ 
    
    
    
      C 
     
     
     
       i 
      
     
       n 
      
     
    
   
     ∗ 
    
    
    
      C 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
  
    k_w*k_h * C_{in} * C_{out} 
   
  
kw​∗kh​∗Cin​∗Cout​

参数量(包括偏置bias):

     ( 
    
    
    
      k 
     
    
      w 
     
    
   
     ∗ 
    
    
    
      k 
     
    
      h 
     
    
   
     ∗ 
    
    
    
      C 
     
     
     
       i 
      
     
       n 
      
     
    
   
     + 
    
   
     1 
    
   
     ) 
    
   
     ∗ 
    
    
    
      C 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
  
    (k_w*k_h * C_{in} + 1) * C_{out} 
   
  
(kw​∗kh​∗Cin​+1)∗Cout​

计算量:

      k 
     
    
      w 
     
    
   
     ∗ 
    
    
    
      k 
     
    
      h 
     
    
   
     ∗ 
    
    
    
      C 
     
     
     
       i 
      
     
       n 
      
     
    
   
     ∗ 
    
    
    
      W 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
     ∗ 
    
    
    
      H 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
     ∗ 
    
    
    
      C 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
  
    k_w*k_h* C_{in} * W_{out} * H_{out} * C_{out} 
   
  
kw​∗kh​∗Cin​∗Wout​∗Hout​∗Cout​

计算量(考虑加法和偏置):

     [ 
    
   
     ( 
    
    
    
      k 
     
    
      w 
     
    
   
     ∗ 
    
    
    
      k 
     
    
      h 
     
    
   
     ∗ 
    
    
    
      C 
     
     
     
       i 
      
     
       n 
      
     
    
   
     ) 
    
   
     + 
    
    
    
      ( 
     
     
     
       k 
      
     
       w 
      
     
    
      ∗ 
     
     
     
       k 
      
     
       h 
      
     
    
      ∗ 
     
     
     
       C 
      
      
      
        i 
       
      
        n 
       
      
     
    
      − 
     
    
      1 
     
    
      ) 
     
    
      + 
     
    
      1 
     
    
   
     ] 
    
   
     ∗ 
    
    
    
      W 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
     ∗ 
    
    
    
      H 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
     ∗ 
    
    
    
      C 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
  
    [(k_w*k_h* C_{in}) +\boldsymbol{(k_w*k_h* C_{in}-1)+1}]* W_{out} * H_{out} * C_{out} 
   
  
[(kw​∗kh​∗Cin​)+(kw​∗kh​∗Cin​−1)+1]∗Wout​∗Hout​∗Cout​

PS: 其中

      k 
     
    
      w 
     
    
   
     ∗ 
    
    
    
      k 
     
    
      h 
     
    
   
     ∗ 
    
    
    
      C 
     
     
     
       i 
      
     
       n 
      
     
    
   
  
    k_{w} * k_{h}* C_{i n} 
   
  
kw​∗kh​∗Cin​表示乘法计算量,  
 
  
   
    
    
      k 
     
    
      w 
     
    
   
     ∗ 
    
    
    
      k 
     
    
      h 
     
    
   
     ∗ 
    
    
    
      C 
     
     
     
       i 
      
     
       n 
      
     
    
   
     − 
    
   
     1 
    
   
  
    k_{w} * k_{h}* C_{i n}-1 
   
  
kw​∗kh​∗Cin​−1表示加法计算量,+1表示偏置

池化层和激活层

激活、池化层仅仅对原来的矩阵做了一个变换,不会引进新的参数,这些其他层类型肯定需要时间,但它们不使用点积,并且成为网络总计算复杂度的舍入误差。
在这里插入图片描述

全连接层

全连接层设置下一层神经元的个数,并使用仿射变换

      y 
     
    
      i 
     
    
   
     = 
    
    
     
     
       W 
      
     
       ⃗ 
      
     
    
      i 
     
    
   
     ⋅ 
    
    
    
      x 
     
    
      ⃗ 
     
    
   
     + 
    
    
    
      b 
     
    
      i 
     
    
   
  
    y_i = \vec W_i \cdot \vec x+b_i 
   
  
yi​=Wi​⋅x+bi​得到下一层神经元的值,因为两层之间的神经元会全部连接起来,所及叫做全连接,如图所示。

在这里插入图片描述
输入维度:

      d 
     
     
     
       i 
      
     
       n 
      
     
    
   
  
    d_{in} 
   
  
din​

输出维度:

      d 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
  
    d_{out} 
   
  
dout​

参数量:

      d 
     
     
     
       i 
      
     
       n 
      
     
    
   
     ∗ 
    
    
    
      d 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
  
    d_{in}*d_{out} 
   
  
din​∗dout​

参数量(包括偏置bias):

     ( 
    
    
    
      d 
     
     
     
       i 
      
     
       n 
      
     
    
   
     + 
    
   
     1 
    
   
     ) 
    
   
     ∗ 
    
    
    
      d 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
  
    (d_{in}+1)*d_{out} 
   
  
(din​+1)∗dout​

计算量:

      d 
     
     
     
       i 
      
     
       n 
      
     
    
   
     ∗ 
    
    
    
      d 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
  
    d_{in}*d_{out} 
   
  
din​∗dout​

计算量(考虑加法和偏置):

     [ 
    
    
    
      d 
     
     
     
       i 
      
     
       n 
      
     
    
   
     + 
    
   
     ( 
    
    
    
      d 
     
     
     
       i 
      
     
       n 
      
     
    
   
     − 
    
   
     1 
    
   
     ) 
    
   
     + 
    
   
     1 
    
   
     ] 
    
   
     ∗ 
    
    
    
      d 
     
     
     
       o 
      
     
       u 
      
     
       t 
      
     
    
   
  
    [d_{in}+(d_{in}-1)+1]*d_{out} 
   
  
[din​+(din​−1)+1]∗dout​

PS:

      d 
     
     
     
       i 
      
     
       n 
      
     
    
   
     − 
    
   
     1 
    
   
  
    d_{in} -1 
   
  
din​−1表示加法运算量(权重矩阵与输入/上一层值的矩阵向量相乘所需的加法运算),+1表示偏置,输入是多维的直接相乘即可。

BN层

BN层引入的参数和输入层神经元个数相关,假设输入神经元个数为n,则该层引进的参数为2n不过但部分情况下可以完全忽略Batch Normalization层的影响

总结: 对于神经网络模型,减少网络参数应主要针对全连接层;而进行计算量优化时,重点应放在卷积层。

补充: 在笔试时,有时不会给出输出特征图的大小,需要自己计算,特征图大小的计算如下:

卷积层:

       o 
      
     
       u 
      
      
      
        t 
       
       
       
         s 
        
       
         i 
        
       
         z 
        
       
         e 
        
       
      
     
       = 
      
      
       
       
         I 
        
       
         n 
        
       
         P 
        
       
         u 
        
       
         t 
        
       
         S 
        
       
         i 
        
       
         z 
        
       
         e 
        
       
         − 
        
       
         K 
        
       
         e 
        
       
         r 
        
       
         n 
        
       
         e 
        
       
         l 
        
       
         S 
        
       
         i 
        
       
         z 
        
       
         e 
        
       
         + 
        
       
         2 
        
       
         ∗ 
        
       
         P 
        
       
         a 
        
       
         d 
        
       
         d 
        
       
         i 
        
       
         n 
        
       
         g 
        
       
       
       
         S 
        
       
         t 
        
       
         r 
        
       
         i 
        
       
         d 
        
       
         e 
        
       
      
     
       + 
      
     
       1 
      
     
    
   
  
    \LARGE {out_{size} = \frac {InPutSize-KernelSize + 2*Padding} {Stride}+1} 
   
  
outsize​=StrideInPutSize−KernelSize+2∗Padding​+1

池化层:

       o 
      
     
       u 
      
      
      
        t 
       
       
       
         s 
        
       
         i 
        
       
         z 
        
       
         e 
        
       
      
     
       = 
      
      
       
       
         I 
        
       
         n 
        
       
         P 
        
       
         u 
        
       
         t 
        
       
         S 
        
       
         i 
        
       
         z 
        
       
         e 
        
       
         − 
        
       
         K 
        
       
         e 
        
       
         r 
        
       
         n 
        
       
         e 
        
       
         l 
        
       
         S 
        
       
         i 
        
       
         z 
        
       
         e 
        
       
       
       
         S 
        
       
         t 
        
       
         r 
        
       
         i 
        
       
         d 
        
       
         e 
        
       
      
     
       + 
      
     
       1 
      
     
    
   
  
    \LARGE {out_{size} = \frac {InPutSize-KernelSize } {Stride}+1} 
   
  
outsize​=StrideInPutSize−KernelSize​+1

PS: 计算结果不是整数时,卷积层上取整,池化层下取整。


本文转载自: https://blog.csdn.net/weixin_46707326/article/details/128302771
版权归原作者 枉费红笺 所有, 如有侵权,请联系我们删除。

“神经网络的参数量(Params)和计算量(FLOPs)”的评论:

还没有评论