卷積神經網路的引數量和計算量
《卷積神經網路的引數量和計算量》
對於在端部署的模型來說,模型的引數量以及計算量是錙銖必較的,使用什麼樣的啟用函式,會有多大的計算成本。對於模型的壓縮量化等都是模型的引數量和計算量的準確計量為基礎的,所以本文簡單記錄一下常見神經網路的引數量和計算量。
Key Words:Parameters count、FLOPS、FLOPs
Beijing, 2020
作者:RaySue
文章目錄
-
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} (Kh∗Kw∗Cin)∗Cout+Cout
Group Convolution
分組卷積的輸出特徵圖的每個通道,只和輸入特徵圖的一部分通道有關,而這部分通道,就是一個分組(Group)。依舊假設輸入特徵圖的尺寸為 C i n ∗ H ∗ W C_{in} * H * W Cin∗H∗W,分為 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} gCin∗Kh∗Kw∗gCout
最後只需要將各個分組的計算結果按照通道進行連線(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 gCin∗Kh∗Kw∗gCout∗g
引數量減少為普通卷積的 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} Kh∗Kw∗Cin
Pointwise:
1 ∗ 1 ∗ C i n ∗ C o u t 1 * 1 * C_{in} * C_{out} 1∗1∗Cin∗Cout
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} Kh∗Kw∗Cin+1∗1∗Cin∗Cout
深度可分離卷積比普通卷積:
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} (Kh∗Kw∗Cin)∗Cout+CoutKh∗Kw∗Cin+Cin∗Cout=Cout1+Kh∗Kw1
為了便於理解、便於和分組卷積類比,假設 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} Kh∗Kw1。
模型的計算量
- 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=[(Kh∗Kw∗Cin)+(Kh∗Kw∗Cin−1)]∗Hout∗Wout∗Cout
上式中,把卷積計算分為兩個部分,一部分表示乘法,一部分表示加法,加法只需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=(2∗Kh∗Kw∗Cin)∗Hout∗Wout∗Cout
公式:
- 引數量 x 輸出的特徵對映圖的 H,W,其他卷積一樣可以這樣運算
全連線層
不考慮bias:
F L O P s = ( 2 × I − 1 ) × O FLOPs = (2 \times I - 1) \times O FLOPs=(2×I−1)×O
- which I I I = input neuron numbers, O O O = output neuron numbers
- 同樣的 I I I 表示乘法 I − 1 I - 1 I−1表示加法
池化層
ps: 自己的理解
最大池化
最大池化,只有一個單個操作,取最大值,所以FLOPs如下:
H o u t ∗ W o u t H_{out} * W_{out} Hout∗Wout
平均池化
平均池化,對池化步長 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} (Sh∗Sw−1+1)∗Hout∗Wout
啟用層
神經網路中是一定存在非線性的啟用函式的,比如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} Hout∗Wout∗Kw∗Kh∗Cin∗Cout (注意:不要忘了resnet的shortcut的add操作)
-
c o n v 1 : 112 ∗ 112 ∗ 7 ∗ 7 ∗ 3 ∗ 64 conv1:112*112*7*7*3*64 conv1:112∗112∗7∗7∗3∗64
-
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 conv2x:56∗56∗64∗64∗9+56∗56∗64∗64∗9+56∗56∗64∗64
-
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 conv3x:28∗28∗64∗128∗9+28∗28∗128∗128∗9+28∗28∗64∗128
-
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 conv4x:14∗14∗128∗256∗9+14∗14∗256∗256∗9+14∗14∗128∗256
-
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 conv5x:7∗7∗256∗512∗9+7∗7∗512∗512∗9+7∗7∗256∗512
-
f c : 512 ∗ 1000 fc:512*1000 fc:512∗1000
總共加起來乘以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
相關文章
- 輕量級卷積神經網路的設計卷積神經網路
- 輕量級卷積神經網路的設計技巧卷積神經網路
- 卷積神經網路中感受野的理解和計算卷積神經網路
- 卷積神經網路卷積神經網路
- 卷積神經網路概述卷積神經網路
- 解密卷積神經網路!解密卷積神經網路
- 5.2.1 卷積神經網路卷積神經網路
- 卷積神經網路CNN卷積神經網路CNN
- 卷積神經網路-AlexNet卷積神經網路
- 卷積神經網路-1卷積神經網路
- 卷積神經網路-2卷積神經網路
- 卷積神經網路-3卷積神經網路
- 卷積神經網路四種卷積型別卷積神經網路型別
- 卷積神經網路數學原理解析卷積神經網路
- 全卷積神經網路FCN卷積神經網路
- 深度剖析卷積神經網路卷積神經網路
- 【深度學習篇】--神經網路中的卷積神經網路深度學習神經網路卷積
- 卷積神經網路鼻祖LeNet網路分析卷積神經網路
- 卷積神經網路中的Winograd快速卷積演算法卷積神經網路演算法
- CNN神經網路之卷積操作CNN神經網路卷積
- 卷積神經網路 part2卷積神經網路
- 14 卷積神經網路(進階)卷積神經網路
- 卷積神經網路(CNN)詳解卷積神經網路CNN
- 何為神經網路卷積層?神經網路卷積
- Tensorflow-卷積神經網路CNN卷積神經網路CNN
- 【Python教程】計算機視覺的基石——讀懂 CNN卷積神經網路Python計算機視覺CNN卷積神經網路
- 吳恩達《卷積神經網路》課程筆記(1)– 卷積神經網路基礎吳恩達卷積神經網路筆記
- (四)卷積神經網路 -- 8 網路中的網路(NiN)卷積神經網路
- 淺聊卷積神經網路的發展卷積神經網路
- 卷積神經網路:Convolutional Neural Networks(CNN)卷積神經網路CNN
- 卷積神經網路(Convolutional Neural Network,CNN)卷積神經網路CNN
- 直白介紹卷積神經網路(CNN)卷積神經網路CNN
- 卷積神經網路—基本部件(2)卷積神經網路
- 卷積神經網路-啟用函式卷積神經網路函式
- 深度學習三:卷積神經網路深度學習卷積神經網路
- 一文看懂卷積神經網路卷積神經網路
- [譯] 使用 Python 和 Keras 實現卷積神經網路PythonKeras卷積神經網路
- 讓卷積神經網路來辨識馬和人卷積神經網路