CNN模型參數(shù)量和計算量詳解

一、參數(shù)量

參數(shù)量一般指可學(xué)習(xí)參數(shù)的數(shù)量,在CNN中主要有卷積層(Conv),批歸一化層(BN),和全連接層(FC)含有可學(xué)習(xí)參數(shù)。

1. 卷積層參數(shù)量:
(1)普通卷積層的參數(shù)量:

\text{Param}(Conv)=\left \{ \begin{aligned} &C_o \times C_i \times K_w \times K_h + C_o, &\text{bias=True}, \\ &C_o \times C_i \times K_w \times K_h, &\text{bias=False} \end{aligned} \right.
其中C_o是輸出通道數(shù),C_i是輸入通道數(shù),K_w是卷積核的寬,K_h是卷積核的高。

(2)分組卷積的參數(shù)量:

\text{Param}(GConv)=\left \{ \begin{aligned} &C_o \times \frac{C_i}{g} \times K_w \times K_h + C_o, &\text{bias=True}, \\ &C_o \times \frac{C_i}{g} \times K_w \times K_h, &\text{bias=False} \end{aligned} \right.
其中g為分組數(shù)。分組卷積把輸入分為g組,分別在組內(nèi)進行卷積計算,參數(shù)量減少了g倍。

(3)深度分離卷積的參數(shù)量:

\text{Param}(DWConv)=\left \{ \begin{aligned} &C_i \times K_w \times K_h + C_i, &\text{bias=True}, \\ &C_i \times K_w \times K_h, &\text{bias=False} \end{aligned} \right.
深度分離卷積可視為分組卷積在g=C_i時的特殊情況。

【注意】如果Conv后面有BN層,則Conv計算不需要偏置,即 bias=False。
【解釋】因為BN是線性計算,BN層已經(jīng)有偏置,且兩個偏置都是可學(xué)習(xí)參數(shù),加在一起等效于一個偏置的作用:
Conv有偏差+BN:\gamma (Wx+b)+\beta=(\gamma W)x+(\gamma b+\beta)
Conv無偏差+BN:\gamma Wx+\beta=(\gamma W)x+\beta
【防杠】上面的推導(dǎo)只是一個簡單的示意,實際計算有更多細節(jié),不在本文討論范圍。

2. 批歸一化層參數(shù)量:

\text{Param}(BN)=2C
BN層只有放縮因子\gamma和偏置\beta這兩組可學(xué)習(xí)參數(shù),這里的C是通道數(shù)。

3. 全連接層參數(shù)量:

\text{Param}(FC)=N_o \times N_i +N_o
其中N_o是輸出神經(jīng)元數(shù)量,N_i是輸入神經(jīng)元數(shù)量,第二項N_o是偏置b的。

二、計算量

當(dāng)前相關(guān)論文中多使用浮點運算量(FLOPs)作為計算量的指標(biāo),F(xiàn)LOPs原本指乘法和加法的計算次數(shù)總和,即單次乘法和單次加法各算一次浮點運算。如:(a*b+c)浮點運算量是2,(a*b+c*d)的浮點運算量是3。

但在當(dāng)前絕大多數(shù)深度學(xué)習(xí)論文中,F(xiàn)LOPs這一指標(biāo)實際上計算的是“乘-加”數(shù)(MACs),即乘且加的數(shù)量。如:(a*b+c)的乘-加數(shù)是1,(a*b+c*d)的乘-加數(shù)是2。

本文將錯就錯,本文中的FLOPs計算的內(nèi)容實際上就是MACs。

CNN中幾乎所有層(除ReLU外)都存在FLOPs(有些論文中認為池化和BN沒有FLOPs,因為它們不是標(biāo)準(zhǔn)的乘-加運算),下面給出幾種常用模塊的計算量公式。

另外,本文給出的計算量是模型推斷階段輸入單張圖片的計算量,如果要計算批量輸入是的計算量,只需要在單張輸入圖像計算量的基礎(chǔ)上\timesBatchSize即可。

1. 卷積層的FLOPs:
(1)普通卷積的FLOPs:

\text{FLOPs}(Conv)=C_o \times C_i \times K_w \times K_h \times W_o \times H_o
其中W_oH_o是該卷積層輸出特征圖的寬和高。方便起見,本文直接忽略偏差b的FLOPs,細究的話b的FLOPs為C_o \times W_o \times H_o,因為b被廣播成尺寸為輸出特征圖大小后在每個輸出激活值(浮點數(shù))上進行了一次加法運算,相當(dāng)于特殊的乘法和累加。忽略這一項對全局影響不大。

(2)分組卷積的FLOPs:

\text{FLOPs}(GConv)=C_o \times \frac{C_i}{g} \times K_w \times K_h \times W_o \times H_o

(3)深度分離卷積的FLOPs:

\text{FLOPs}(DWConv)=C_i \times K_w \times K_h \times W_o \times H_o
深度分離卷積可以視作分組卷積在g=C_iC_o=C_i時的特殊情況。

2. BN的FLOPs:

BN層的FLOPs一般只考慮推斷階段,訓(xùn)練階段還涉及到歸一化計算的運算量。當(dāng)然,由于BN本身就是線性計算,可以和前面的卷積層合并(重參數(shù)化),忽略BN層的FLOPs是有一定合理性的。我們給出一個參考計算:
\text{FLOPs}(BN)=C\times W \times H \times 2
由于BN是對特征圖上的所有激活值進行一次放縮和一次移位,兩次操作都可以視為特殊的“乘-加”,所以要在特征圖激活值總數(shù)上乘2。

3. 池化層的FLOPs:

\text{FLOPs}(Pool)=K_w \times K_h \times C_o \times W_o \times H_o
其中K_hK_w分別為池化窗口的高和寬。池化層輸出特征圖中的每個值都是由K_w \times K_h次浮點操作得到的。

4. ReLU層的FLOPs:

\text{FLOPs}(ReLU)=0
ReLU是對每個激活值的比較運算,不涉及浮點運算和乘加運算,故其沒有浮點運算量。

5. 全連接層的FLOPs:

\text{FLOPs}(FC)=N_o \times N_i + N_o

以上便是幾種CNN模型中常見模塊的參數(shù)量和計算量公式,其它沒有提及到的我將持續(xù)補充。

當(dāng)然,手工計算這些數(shù)據(jù)的十分麻煩的,在下一篇文章里,我們將總結(jié)幾種常用的計算模型參數(shù)量和計算量的庫。并且將給出使用PyTorch從零實現(xiàn)計算這些數(shù)據(jù)的代碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容