AlexNet_原理詳細

問題背景:本來想直接跳到R-CNN的,轉念一想,基礎沒打牢還是不好,於是又回過頭來學習學習AlexNet。
原文鏈接:https://blog.csdn.net/taoyanqi8932/article/details/71081390


一、原理部分

這裏寫圖片描述
上圖是來自paper的原汁原味AlexNet網絡結構。可以看到:

整個網絡從左往右,有一個輸入,然後有8個需要訓練的層,前5個爲卷積層,最後3層爲全連接層。分別說說這些層:

第一個層 conv_1:

  • 輸入的圖片大小爲224*224*3
  • 有96個卷積核,尺寸爲11*11,即11*11*96。步長(stride)爲4.
  • 按照無padding的方式,輸出的每個feature map尺寸應該爲54*54

怎麼計算出來?(224-11+1)/4,向上取整,或者 (224-11)/4+1,向下取整

但論文裏面寫輸出的尺寸是55*55,關於這個,有2種解釋:
1)這裏用了padding=SAME的方式,可參考這個鏈接理解,有興趣的去看API
https://www.jianshu.com/p/05c4f1621c7e
2)輸入圖片的尺寸給錯了,應該是227*227.
- 96個卷積核,所以feature map的大小爲55*55*96.
- 卷積層後跟ReLU,同時後面跟LRN層,尺寸不變.
- 然後跟着最大池化層,核大小爲3*3,步長爲2,因此feature map的大小爲:27*27*96.(55-3+1)/2,向上取整=27

第二個層 conv_2:

  • 輸入的tensor爲27*27*96
  • 卷積核的大小爲: 5*5*256,步長爲1,如果按照無padding=VALID,輸出feature map爲:23*23*256,跟最大池化後的結果不符,因此傾向於認爲本文都是padding=SAME。因此,步長爲1時,feature map爲27*27*256.
  • 同樣緊跟ReLU,和LRN層.尺寸不變,
  • 最大池化層,核大小爲3*3,步長爲2,因此feature map爲:13*13*256。(27-3+1)/2,向上取整=13

    第三個層 conv_3:

  • 輸入tensor爲13*13*256

  • 卷積核 3*3*384,步長爲1,feature map爲:13*13*384
  • 加上ReLU,尺寸不變
  • 無最大池化層

    第四個層 conv_4:

  • 配置和conv_3一樣,因此feature map爲:13*13*384

    第五個層 conv_5:

  • 輸入tensor爲13*13*384

  • 卷積核 3*3*256,步長爲1,feature map爲:13*13*256
  • 加上ReLU,尺寸不變
  • 最大池化層,核大小3*3,步長爲2,因此feature map:6*6*256,(13-3+1)/2,向上取整6

在看全連接層前,可以補一下預備知識,我覺得這兩個講得蠻好的,從兩個角度來說的:
https://blog.csdn.net/u011021773/article/details/78121359
https://blog.csdn.net/l691899397/article/details/52267166

這裏想囉嗦一下,說說自己的見解。從維度的角度上來說。前面我們對二維圖片進行卷積,卷積核也是二維的,但因爲有多個卷積核,所以卷積出來的結果是三維的。現在,我們對三維的feature map進行卷積,卷積核也是三維的,有多個這樣的卷積核,那麼出來的結果是不是應該四維呢?是這樣沒錯。但是!但是!但是!巧妙地用與feature map同樣尺寸大小的卷積核,結果就會是一維的,其它三維點乘的結果是一個數字。
舉個栗子,2*2矩陣點乘2*2矩陣,結果是啥?一個數字!n個2*2矩陣點乘2*2矩陣,結果是啥?拼接起來是一個一維向量。

第六個層 fc_1:

  • 卷積核6*6*256*4096,輸出爲一維向量,4096個元素。
  • 加上ReLU,尺寸不變

第七個層 fc_2:

  • 輸出爲一維向量,4096個元素。
  • 加上ReLU,尺寸不變

第七個層和第六個層元素個數一樣,第七個層是不是有點多餘?
那當然不是啦,雖然表面上元素個數一樣。但是,其中有權重、有偏差、有反向傳播,第七個層還是有發揮作用的!

第8個層 fc_3:

  • 輸出爲一維向量,1000個元素。最後一層用了softmax,輸出爲1000個種類的各類概率值.

這裏怎麼實現4096到1000的轉換?都是一維的。那麼就要從另一個角度來說了。全連接層的每一個結點都與上一層的所有結點相連,所以這裏輸出的向量元素個數是取決於全連接層節點個數,而不是上一層節點個數。

二、評價部分

1) AlexNet使用ReLU代替了Sigmoid,其能更快的訓練,同時解決sigmoid在訓練較深的網絡中出現的梯度消失,或者說梯度彌散的問題。
激活函數的主要作用是引入了非線性,不太懂的可以參考鏈接:
https://www.zhihu.com/question/22334626
各個激活函數介紹及梯度消失及梯度彌散可參考鏈接:
http://www.360doc.com/content/17/1102/21/1489589_700400500.shtml,建議直接看第5點

2) 隨機dropout一些神經元,以避免過擬合,

3) 在以前的CNN中普遍使用平均池化層average pooling, AlexNet全部使用最大池化層 max pooling, 避免了平均池化層的模糊化的效果,並且步長比池化的核的尺寸小,這樣池化層的輸出之間有重疊,提升了特徵的豐富性.

4)提出LRN層,局部響應歸一化,對局部神經元創建了競爭的機制,使得其中響應較大的值變得更大,並抑制反饋較小的. (強者更強,弱者更弱)
雖然看網上大家對LRN層的評價都不高,但還是給出一個參考鏈接:
https://blog.csdn.net/searobbers_duck/article/details/51645941

5)使用了gpu加速神經網絡的訓練

6)使用數據增強的方法緩解過擬合現象.
數據增強是擴充了樣本集,參考鏈接:
https://www.cnblogs.com/zhonghuasong/p/7256498.html
(個人覺得,GAN也是數據增強的一種方式)

因爲我也不是很懂,所以在學習過程中也是查閱各種資料,覺得講得比較好的鏈接都附了上來。下一步是弄弄代碼吧~

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