CNN中parameters和FLOPs計算

CNN中parameters和FLOPs計算

以AlexNet爲例,先注意觀察每層編注的通道數的變化。
在這裏插入圖片描述1. 卷積網絡的參數量的計算(parameters)

CNN中的parameters分爲兩種:W和b,注意這裏W是大寫,表示一個矩陣,也因此它相比 b,既含有更多的信息,同時也是parameters的主要部分。

在AlexNet模型結構圖中,每個大長方體中的小長方體就是W,它是大小爲[K_h, K_w, C_{in}]的三維矩陣,其中

  • K_h爲卷積核(filter或kernel)的高度,
  • K_w爲卷積核的寬度,
  • C_{in}爲輸入的通道數(Channels),
    一般情況下,K_h和K_w的大小是一樣的,且一般比較小,3、5、7之類。

每個卷積核在輸入數據上從左往右、從上往下掃一遍,便會計算出很多個前向傳播的值,這些值就會按原來相對位置拼成一個feature map,由於單個卷積核提取的信息太過有限,於是需要N個不同的卷積核各掃數據,會產生N個feature map,這N個feature map在拼在一起就是這一層的輸出,即更“厚”的一個長方體。輸出的高度和寬度分別爲h, w,同時N就是輸出的通道數,記作C_{out},則輸出矩陣大小爲[h, w, C_{out}}]。
例如在從AlexNet圖中左邊第一個大長方體(如輸入的圖片)到第二個大長方體(圖中是兩個並列小長方體,這是作者分佈式訓練的需要,分析時可以將二者並起來看,即C_{out}=48*2)這個過程,即是從[in_h, in_w, C_{in}] = [224, 224, 3]的矩陣,經過[K_h, K_w, C_{in}] = [11, 11, 3]的卷積核,變爲[out_h, out_w, C_{out}] = [55, 55, 96]的矩陣的過程。

對於偏置參數 b,從前向傳播公式可以看出,和W(這裏的W是權值矩陣)是一對一的關係,b的個數(維度)也和W是對應的,即[C_{out}, ],例如對於AlexNet的第一個卷積層,parameters中偏置的個數爲number(b)=C_{out} = 96。

於是可以得出對於某一個卷積層,它的parameters個數爲:
parameters
(K_h * K_w * C_{in}) * C_{out} + C_{out}

對於全連接層,比如AlexNet的後三層,相對更簡單,因爲是變成了兩組一維數據之間的兩兩連接相乘(如上圖第5層到第6層,卷積層過度到全連接層,會先將第5層三維數據flatten爲一維,參數的總個數未變),然後加上一個偏置即可。所以對於某個全連接層,如果輸入的數據有N_{in}個節點,輸出的數據有N_{out}個節點,它的parameters個數爲:N_{in} * N_{out} + N_{out}。如果上層是卷積層,**N_{in}**就是上層的輸出三維矩陣元素個數,即三個維度相乘。

注意:Tensorflow使用卷積核的時候,使用的格式是[k_h,k_w,in_c,out_c]。

2. FLOPs(floating point operations),浮點運算次數

  • FLOPS: 全大寫,指每秒浮點運算次數,可以理解爲計算的速度。是衡量硬件性能的一個指標。(硬件)
  • FLOPs: s小寫,指浮點運算數,理解爲計算量。可以用來衡量算法/模型的複雜度。(模型) 在論文中常用GFLOPs(1 GFLOPs = 10^9 FLOPs)
    2017年,ICIR收錄了NVIDIA發表的一篇論文,詳細的講解了一下FLOPs的計算。

簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。
這個過程中的浮點運算主要就是W相關的乘法,以及b相關的加法,每一個W對應中K_h*K_w個乘法,每一個b對應一個加法,看起來FLOPs個數和parameters是相同的。但實際上每個feature map上每個點的權值是共享,這是CNN的一個重要特性,也可以說是優勢(因此才獲得特徵不變性,以及大幅減少參數數量),我們在計算FLOPs是在parameters的基礎上需要再乘以feature map的大小即可,對於某個卷積層,它的FLOPs數量爲:
[(K_h * K_w * C_{in}) * C_{out} + C_{out}] * (H * W) = num_params * (H * W),其中num_params表示該層參數的數目。

還是裏AlexNet網絡第一卷積層爲例,它的FLOPs數目爲: [(11 * 11 * 3) * 96 + 96] * (55 * 55) = 105,705,600。
對於全連接層,由於不存在權值共享,它的FLOPs數目即是該層參數數目:
N_{in} * N_{out} + N_{out}
注意:
不能只用FLOPs作爲指標呢,有如下幾個原因:
1.FLOPs沒有考慮幾個對速度有相當大影響的重要因素。
2.計算平臺的不同會導致結果不同。
FLOPs沒有考慮幾個對速度有相當大影響的重要因素:MAC和並行度

推薦用來計算pytorch構建的網絡的參數,空間大小,MAdd,FLOPs等指標,簡單好用。
flops-counter.pytorch
torchstat

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章