之前閱讀論文《ImageNet Classification with Deep Convolutional Neural Networks》的時候,文中有提到模型的總參數數量為60millions
,即6000萬。為了加深理解網絡結構,給自己提了一個小問題:這個參數總量是怎麽算出來的呢?
在動手之前,先google了一下,想看看之前有沒有類似的工作,隻在stackoverflow上找到了這個帖子:《How to calculate the number of parameters of AlexNet?》,題主給了自己的思路但不確定,回答中也沒有靠譜的。所以決定,自己動手看看。
首先貼一下AlexNet的網絡結構圖:
總的來說,AlexNet由輸入層,5個卷積層,3個全連接層組成(其中最後一個全連接層也是softmax輸出層)。圖中詳細標出了輸入大小以及各層的結構參數。特別需要注意的是:網絡是分布在2個GPU上的,部分層隻跟同一個GPU中的上一層連接(看起來,stackoverflow那個帖子中題主沒有考慮這個問題)。
接下來梳理一下各層的參數情況:
- 輸入層:圖片大小:寬高通道(RGB)依次為W * H * C = 224 x 224 x 3, 即150528像素。
- 第1個隱層, 卷積層,使用96個11 x 11 x 3的卷積核,如圖所示節點數量為:55(W) x 55(H) x 48(C) x 2 = 290400(注:這個地方的節點數與論文中提到的要高,有點奇怪。因為這層跟其他層計算方法一樣,其他層的節點數跟論文中完全一致)。根據卷積層的參數 = 卷積核大小 x 卷積核的數量
+ 偏置數量(即卷積的核數量),本層參數數量為:
(11 * 11 * 3 * 96) + 96 = 34848, 注:參數分為2部分w和b,“+”前麵一部分是w的數量, “+”後麵那部分是b的數量,後麵的層也按這個思路來計算。 - 第2個隱層,卷積層, 使用256個5x5x48卷積核,隻跟同一個GPU的上一層連接,節點數量:27*27*128*2 = 186624,參數數量:(5*5*48*128+128)*2 = 307456,最後”*2″是因為網絡層均勻分布在兩個GPU上,先計算單個GPU上的參數,再乘以GPU數量2。
- 第3個隱層,卷積層,使用384個3x3x256卷積核,節點數量:13*13*192*2 = 64896,參數數量:3*3*256*384+384 = 885120。
- 第4個隱層,卷積層,使用384個3x3x192卷積核,隻跟同一個GPU的上一層連接,節點數量:13*13*192*2 = 64896,參數數量:(3*3*192*192+192)*2 = 663936。
- 第5個隱層,卷積層,使用256個3x3x192卷積核,隻跟同一個GPU的上一層連接,節點數量:13*13*128*2 = 43264,參數數量:(3*3*192*128+128)*2 = 442624。
- 第6個隱層,全連接層,節點數為4096。根據全連接層的參數數量 = 上一層節點數量(pooling之後的) x 下一層節點數量 + 偏置數量(即下一層的節點數量),參數數量為:(6*6*128*2)*4096+4096 = 37752832,可以看到這個參數數量遠遠大於之前所有卷積層的參數數量之和。也就是說AlexNet的參數大部分位於後麵的全連接層。
- 第7個隱層,全連接層,節點數量為4096。參數數量為:4096*4096 + 4096= 16781312。
- 第8個隱層,全連接層,也是1000-way的softmax輸出層,節點數量為1000。參數數量為: 4096*1000 + 1000 = 4097000。
最後,為了方便查看,匯總為表格如下,其中最後一行給出了Alex的參數總量。