博客搬家至 Mun: https://kiddie92.github.io
簡書同步更新
前幾天聽室友給我講算法崗的面經,其中面試官就問了一個小問題,“給出CNN網絡的參數(可學習的)個數如何計算”,今天就來計算一下好了。
問題描述
可學習參數顧名思義就是指CNN中需要學習/更新的變量,因為CNN的網絡架構設計中會引入很多需要被學習出來的變量,比如:hidden layer
中的神經元個數便直接和仿射變換的參數個數相關,而現在的問題是把這些可學習的變量的個數統計出來。
卷積神經網絡架構
卷積神經網絡在計算機視覺領域有比較多的應用,下圖便是一個圖片識別的網絡架構示例圖(工業界使用的模型更復雜)。

上圖描述了卷積神經網絡在進行正向計算/正向傳播時的流程/架構,如圖所示,當輸入一個"小轎車"的圖片時,我們希望經過一個函數各種計算后,能夠輸出“CAR”這個詞。那么該如何計算呢?
-
輸入層(input):
就是讀取圖片,將圖片用數字化的矩陣來表示。 -
卷積(convolution):
選用卷積核(filter,可以是多個)對圖片的多個通道進行卷積操作(element-wise的相乘)。卷積計算會使圖片的長寬變小,但是"高度"變大(如圖中的圖片逐漸變"厚"),這是因為使用的卷積核(filter)較多,使得計算得到的圖片通道數(channels)也會增加。
卷積操作其實可以理解為簡化版的"連接層",部分神經元才可以和下一層的部分神經元進行連接。
-
激活(activation):
該操作主要是對之前的卷積計算結果做非線性處理,萬能逼近原理告訴我們這種線性和非線性計算的組合可以擬合所有復雜的函數。常用的非線性處理函數/激活函數有Sigmoid、Relu、Leaky ReLU、tanh等,更多內容可以參考這里。 -
池化(pooling):
對非線性化后的高維矩陣進行"減采樣",同樣以一定步長逐步將矩陣中的"元素塊(例如:)"僅使用一個數來代表,比如:取"元素塊"中的最大值、平均值等計算方式。
降采樣可以減少后續的計算量還可以一定程度防止過擬合。
-
拉平(Flatten):
將高維矩陣"拉平",轉換為一維矩陣,元素依次排序。 -
全連接(Fully Connected):
設置下一層神經元的個數,並使用仿射變換得到下一層神經元的值,因為兩層之間的神經元會全部連接起來,所及叫做全連接。
-
輸出層計算分類概率(Softmax):
對最后一層的神經元進行概率輸出計算,即:給出各分類標簽的概率,比如這里預期"Car"的概率一定要大於其他分類標簽的概率值,所以最后一層的神經元個數和分類的標簽個數需要一致。下面是softmax函數的表達式: -
Batch-Normalization:
這一層其實在每一次卷積、全連接后都可以進行計算,但是圖片中沒有反映處這個處理過程。感興趣可以查看我之前的博客卷積神經網絡之Batch Normalization(一):How?
參數個數計算
按照上面的步驟描述,可知:
- input層是沒有引進變量的;
- 卷積層則引入了"卷積核/filter",假設卷積核大小為
,圖片有
個通道(channels)/維度,而選用的"卷積核/filter"有
個,再加上bias,可以得到引進的參數有:
個;
- 激活、池化層僅僅對原來的矩陣做了一個變換,不會引進新的參數;
- 拉平操作僅僅對矩陣進行了reshape,也不會引進新的變量;
- 全連接層就是對前后神經元做了仿射變換
,引進的參數有權重和偏置,假設n個神經元連接m個神經元,則引入的參數有
;
- 輸出層其實和全連接層沒啥區別,只是輸出的神經元個數要求是分類的標簽個數,所以引入的變量也是
,這里m是分類的標簽個數;
- BN層引入的參數則和輸入層神經元個數相關,假設輸入神經元個數為n,則該層引進的參數為
綜合以上,計算一個CNN架構的所有可學習參數/變量的個數可以分解成每一個步驟的參數變化量和引入參數個數兩個相關的小問題,就像這樣:
# name size parameters
--- -------- ------------------------- ------------------------
0 input 1x28x28 0
1 conv2d1 (28-(5-1))=24 -> 32x24x24 (5*5*1+1)*32 = 832
2 maxpool1 32x12x12 0
3 conv2d2 (12-(3-1))=10 -> 32x10x10 (3*3*32+1)*32 = 9'248
4 maxpool2 32x5x5 0
5 dense 256 (32*5*5+1)*256 = 205'056
6 output 10 (256+1)*10 = 2'570
最后將每一個步驟的參數相加便得到所有參數的個數。
參考資料
- https://stackoverflow.com/questions/42786717/how-to-calculate-the-number-of-parameters-for-convolutional-neural-network
- https://medium.freecodecamp.org/an-intuitive-guide-to-convolutional-neural-networks-260c2de0a050