一、參數(shù)量
參數(shù)量一般指可學(xué)習(xí)參數(shù)的數(shù)量,在CNN中主要有卷積層(Conv),批歸一化層(BN),和全連接層(FC)含有可學(xué)習(xí)參數(shù)。
1. 卷積層參數(shù)量:
(1)普通卷積層的參數(shù)量:
其中是輸出通道數(shù),
是輸入通道數(shù),
是卷積核的寬,
是卷積核的高。
(2)分組卷積的參數(shù)量:
其中為分組數(shù)。分組卷積把輸入分為
組,分別在組內(nèi)進行卷積計算,參數(shù)量減少了
倍。
(3)深度分離卷積的參數(shù)量:
深度分離卷積可視為分組卷積在時的特殊情況。
【注意】如果Conv后面有BN層,則Conv計算不需要偏置,即 bias=False。
【解釋】因為BN是線性計算,BN層已經(jīng)有偏置,且兩個偏置都是可學(xué)習(xí)參數(shù),加在一起等效于一個偏置的作用:
Conv有偏差+BN:,
Conv無偏差+BN:
【防杠】上面的推導(dǎo)只是一個簡單的示意,實際計算有更多細節(jié),不在本文討論范圍。
2. 批歸一化層參數(shù)量:
BN層只有放縮因子和偏置
這兩組可學(xué)習(xí)參數(shù),這里的
是通道數(shù)。
3. 全連接層參數(shù)量:
其中是輸出神經(jīng)元數(shù)量,
是輸入神經(jīng)元數(shù)量,第二項
是偏置
的。
二、計算量
當(dāng)前相關(guān)論文中多使用浮點運算量(FLOPs)作為計算量的指標(biāo),F(xiàn)LOPs原本指乘法和加法的計算次數(shù)總和,即單次乘法和單次加法各算一次浮點運算。如:浮點運算量是2,
的浮點運算量是3。
但在當(dāng)前絕大多數(shù)深度學(xué)習(xí)論文中,F(xiàn)LOPs這一指標(biāo)實際上計算的是“乘-加”數(shù)(MACs),即乘且加的數(shù)量。如:的乘-加數(shù)是1,
的乘-加數(shù)是2。
本文將錯就錯,本文中的FLOPs計算的內(nèi)容實際上就是MACs。
CNN中幾乎所有層(除ReLU外)都存在FLOPs(有些論文中認為池化和BN沒有FLOPs,因為它們不是標(biāo)準(zhǔn)的乘-加運算),下面給出幾種常用模塊的計算量公式。
另外,本文給出的計算量是模型推斷階段輸入單張圖片的計算量,如果要計算批量輸入是的計算量,只需要在單張輸入圖像計算量的基礎(chǔ)上BatchSize即可。
1. 卷積層的FLOPs:
(1)普通卷積的FLOPs:
其中和
是該卷積層輸出特征圖的寬和高。方便起見,本文直接忽略偏差
的FLOPs,細究的話
的FLOPs為
,因為
被廣播成尺寸為輸出特征圖大小后在每個輸出激活值(浮點數(shù))上進行了一次加法運算,相當(dāng)于特殊的乘法和累加。忽略這一項對全局影響不大。
(2)分組卷積的FLOPs:
(3)深度分離卷積的FLOPs:
深度分離卷積可以視作分組卷積在且
時的特殊情況。
2. BN的FLOPs:
BN層的FLOPs一般只考慮推斷階段,訓(xùn)練階段還涉及到歸一化計算的運算量。當(dāng)然,由于BN本身就是線性計算,可以和前面的卷積層合并(重參數(shù)化),忽略BN層的FLOPs是有一定合理性的。我們給出一個參考計算:
由于BN是對特征圖上的所有激活值進行一次放縮和一次移位,兩次操作都可以視為特殊的“乘-加”,所以要在特征圖激活值總數(shù)上乘2。
3. 池化層的FLOPs:
其中和
分別為池化窗口的高和寬。池化層輸出特征圖中的每個值都是由
次浮點操作得到的。
4. ReLU層的FLOPs:
ReLU是對每個激活值的比較運算,不涉及浮點運算和乘加運算,故其沒有浮點運算量。
5. 全連接層的FLOPs:
以上便是幾種CNN模型中常見模塊的參數(shù)量和計算量公式,其它沒有提及到的我將持續(xù)補充。
當(dāng)然,手工計算這些數(shù)據(jù)的十分麻煩的,在下一篇文章里,我們將總結(jié)幾種常用的計算模型參數(shù)量和計算量的庫。并且將給出使用PyTorch從零實現(xiàn)計算這些數(shù)據(jù)的代碼。