卷積神經網路的引數量和計算量

Cpp課代表發表於2020-11-26

《卷積神經網路的引數量和計算量》

  對於在端部署的模型來說,模型的引數量以及計算量是錙銖必較的,使用什麼樣的啟用函式,會有多大的計算成本。對於模型的壓縮量化等都是模型的引數量和計算量的準確計量為基礎的,所以本文簡單記錄一下常見神經網路的引數量和計算量。

Key Words:Parameters count、FLOPS、FLOPs


Beijing, 2020

作者:RaySue

Agile Pioneer  


  • FLOPS (Floating point of per Second) 的縮寫,意指每秒浮點運算次數。用來衡量硬體的效能。

  • FLOPs (Floating point of operations) 的縮寫,是浮點運算次數,可以用來衡量演算法/模型複雜度。


模型的引數量

  • K h K_h Kh 卷積核的高度
  • K w K_w Kw 卷積核的寬度
  • C i n C_{in} Cin 輸入featureMap的channel數
  • C o u t C_{out} Cout 輸出featureMap的channel數

全連線引數量

  全連線層的引數量是很大的,和輸入的隱藏層的資料大小相關,如VGG-16最後一次卷積得到的feature map的維度為:7x7x512,將feature map展開後輸出為4096個隱藏層單元,那麼相當於用4096個1x1的卷積對7x7x512展平的結果去做卷積。
引數量:

7 × 7 × 512 × 4096 = 102760448 7 \times 7 \times 512 \times 4096 = 102760448 7×7×512×4096=102760448

一個億的引數量,所以全連線層引數是冗餘的。


池化層

  對於池化層而言,常用的Max-pooling,Avg-pooling等是不存在引數量的。


Vanilla Conv Parameters

   對於某一個卷積層,它的parameters個數為:

( K h ∗ K w ∗ C i n ) ∗ C o u t + C o u t (K_h * K_w * C_{in}) * C_{out} + C_{out} (KhKwCin)Cout+Cout


Group Convolution

   分組卷積的輸出特徵圖的每個通道,只和輸入特徵圖的一部分通道有關,而這部分通道,就是一個分組(Group)。依舊假設輸入特徵圖的尺寸為 C i n ∗ H ∗ W C_{in} * H * W CinHW,分為 g g g 組進行分組卷積,那麼,對於每一組,輸出特徵圖的通道數都是 C o u t g \frac{C_{out}}{g} gCout ,每組的卷積核引數變為:

C i n g ∗ K h ∗ K w ∗ C o u t g \frac{C_{in}}{g} * K_h * K_w * \frac{C_{out}}{g} gCinKhKwgCout

最後只需要將各個分組的計算結果按照通道進行連線(Cat)即可,總體的引數量為:

C i n g ∗ K h ∗ K w ∗ C o u t g ∗ g \frac{C_{in}}{g} * K_h * K_w * \frac{C_{out}}{g} * g gCinKhKwgCoutg

引數量減少為普通卷積的 1 / g 1 / g 1/g


Depthwise Separable Convolution

   對於深度可分離卷積,包含兩個部分,Depthwise和Point_wise。

Depthwise:

K h ∗ K w ∗ C i n K_h * K_w * C_{in} KhKwCin

Pointwise:

1 ∗ 1 ∗ C i n ∗ C o u t 1 * 1 * C_{in} * C_{out} 11CinCout

final:

K h ∗ K w ∗ C i n + 1 ∗ 1 ∗ C i n ∗ C o u t K_h * K_w * C_{in} + 1 * 1 * C_{in} * C_{out} KhKwCin+11CinCout

深度可分離卷積比普通卷積:

K h ∗ K w ∗ C i n + C i n ∗ C o u t ( K h ∗ K w ∗ C i n ) ∗ C o u t + C o u t = 1 C o u t + 1 K h ∗ K w \frac{K_h * K_w * C_{in} + C_{in} * C_{out}}{(K_h * K_w * C_{in}) * C_{out} + C_{out}} = \frac{1}{C_{out}} +\frac{1}{K_h * K_w} (KhKwCin)Cout+CoutKhKwCin+CinCout=Cout1+KhKw1

   為了便於理解、便於和分組卷積類比,假設 C i n = C o u t C_{in} = C_{out} Cin=Cout。深度卷積其實就是$g = C_{in} = C_{out} $的分組卷積,只不過沒有直接將 g g g 組結果拼接,所以Depthwise卷積引數量是標準卷積的 1 C o u t \frac{1}{C_{out}} Cout1,而Pointwise卷積的引數量是標註卷積的 1 K h ∗ K w \frac{1}{K_h * K_w} KhKw1


模型的計算量

  • FLOPS 注意全部大寫 是floating point of per Second 的縮寫,意指每秒浮點運算次數。用來衡量硬體的效能。
  • FLOPs 是floating point of operations的縮寫,是浮點運算次數,可以用來衡量演算法/模型複雜度。
  • MAC或MACC或MADD(Multiply And Accumulate)乘累加單元
  • 1 MAC = 2 FLOPs 2 * (卷積乘法 + 卷積乘法自後所有數相加 - 1)(n個數相加只需要n-1次相加,所以無bias -1,有bias +1抵消)細節
  • 運算量乘以的影像feature map的維度是 Output feature map的維度
  • 加、減、乘、除、指數運算、平方根、最大值…都是一個FLOP

卷積運算量(FLOPs)

Vanilla Conv

不考慮bias:

F L O P s = [ ( K h ∗ K w ∗ C i n ) + ( K h ∗ K w ∗ C i n − 1 ) ] ∗ H o u t ∗ W o u t ∗ C o u t FLOPs =[(K_h * K_w * C_{in}) + (K_h * K_w * C_{in} - 1)]* H_{out} * W_{out} * C_{out} FLOPs=[KhKwCin)+(KhKwCin1]HoutWoutCout

上式中,把卷積計算分為兩個部分,一部分表示乘法,一部分表示加法,加法只需n-1次

考慮bias:

F L O P s = ( 2 ∗ K h ∗ K w ∗ C i n ) ∗ H o u t ∗ W o u t ∗ C o u t FLOPs =(2 * K_h * K_w * C_{in})* H_{out} * W_{out} * C_{out} FLOPs=2KhKwCinHoutWoutCout

公式:

  • 引數量 x 輸出的特徵對映圖的 H,W,其他卷積一樣可以這樣運算

全連線層

不考慮bias:

F L O P s = ( 2 × I − 1 ) × O FLOPs = (2 \times I - 1) \times O FLOPs=(2×I1)×O

  • which I I I = input neuron numbers, O O O = output neuron numbers
  • 同樣的 I I I 表示乘法 I − 1 I - 1 I1表示加法

池化層

ps: 自己的理解

最大池化

最大池化,只有一個單個操作,取最大值,所以FLOPs如下:

H o u t ∗ W o u t H_{out} * W_{out} HoutWout

平均池化

平均池化,對池化步長 S S S 區域內的所有隱藏節點進行相加,再做一次除法,FLOPs如下:

( S h ∗ S w − 1 + 1 ) ∗ H o u t ∗ W o u t (S_h * S_w - 1 + 1) * H_{out} * W_{out} (ShSw1+1)HoutWout

啟用層

   神經網路中是一定存在非線性的啟用函式的,比如ReLU或Sigmoid等,當然這些啟用函式也是需要時間來計算的,但是由於啟用函式一般沒有乘法,所以不計算MAC只計算FLOPs


ReLU/PReLU/ELU

只有一個單個操作,取最大值,所以FLOPs如下:

F L O P s = H o u t × W o u t × C o u t FLOPs = H_{out} \times W_{out} \times C_{out} FLOPs=Hout×Wout×Cout


Sigmoid

  在計算FLOPS的時候,我們通常計算加、減、乘、除、指數、平方根等等,作為一個單個的FLOP。因此在Sigmoid中有4個明顯的操作,0-x, exp(x), 1 + x, 1 / x

y = 1 1 + e x p ( − x ) y = \frac{1}{1 + exp(-x)} y=1+exp(x)1

FLOPs:

F L O P s = H o u t × W o u t × C o u t × 4 FLOPs = H_{out} \times W_{out} \times C_{out} \times 4 FLOPs=Hout×Wout×Cout×4

實際上不會計算啟用函式的計算量的,因為和神經網路的大量乘加運算相比,它佔的比例微不足道。所以 we’ll simply assume that the activation function is free.


裝置FLOPS參考

卷積神經網路的引數量和計算量

卷積神經網路的引數量和計算量

卷積神經網路的引數量和計算量

以ResNet18為例計算FLOPs

卷積神經網路的引數量和計算量
  • 公式: H o u t ∗ W o u t ∗ K w ∗ K h ∗ C i n ∗ C o u t H_{out} * W_{out} * K_w * K_h * C_{in} * C_{out} HoutWoutKwKhCinCout (注意:不要忘了resnet的shortcut的add操作)

  • c o n v 1 : 112 ∗ 112 ∗ 7 ∗ 7 ∗ 3 ∗ 64 conv1:112*112*7*7*3*64 conv111211277364

  • c o n v 2 x : 56 ∗ 56 ∗ 64 ∗ 64 ∗ 9 + 56 ∗ 56 ∗ 64 ∗ 64 ∗ 9 + 56 ∗ 56 ∗ 64 ∗ 64 conv2x:56*56*64*64*9+56*56*64*64*9+56*56*64*64 conv2x565664649+565664649+56566464

  • c o n v 3 x : 28 ∗ 28 ∗ 64 ∗ 128 ∗ 9 + 28 ∗ 28 ∗ 128 ∗ 128 ∗ 9 + 28 ∗ 28 ∗ 64 ∗ 128 conv3x:28*28*64*128*9+28*28*128*128*9+28*28*64*128 conv3x2828641289+28281281289+282864128

  • c o n v 4 x : 14 ∗ 14 ∗ 128 ∗ 256 ∗ 9 + 14 ∗ 14 ∗ 256 ∗ 256 ∗ 9 + 14 ∗ 14 ∗ 128 ∗ 256 conv4x:14*14*128*256*9+14*14*256*256*9+14*14*128*256 conv4x14141282569+14142562569+1414128256

  • c o n v 5 x : 7 ∗ 7 ∗ 256 ∗ 512 ∗ 9 + 7 ∗ 7 ∗ 512 ∗ 512 ∗ 9 + 7 ∗ 7 ∗ 256 ∗ 512 conv5x:7*7*256*512*9+7*7*512*512*9+7*7*256*512 conv5x772565129+775125129+77256512

  • f c : 512 ∗ 1000 fc:512*1000 fc5121000

總共加起來乘以2,為1.8G flops


參考

https://www.pianshen.com/article/5383315087/
https://zhuanlan.zhihu.com/p/65377955
https://zhuanlan.zhihu.com/p/77471991?utm_source=wechat_timeline
https://www.zhihu.com/question/65305385
https://blog.csdn.net/zjucor/article/details/85239860
https://www.zhihu.com/question/65305385

相關文章