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