深度學習基礎模型之AlexNet

這個只是瞭解圖像相關知識的時候碼一下,方便自己查看。並不是論文翻譯。

論文ImageNet Classification with Deep Convolutional Neural Networks

卷積和池化的計算

圖像爲L×L×C,有K個大小爲A×A×C的卷積核,pad:B,stride:S。那麼得到的特徵圖爲
[(L-A + 2 × B)/S + 1,(L-A + 2 × B)/S + 1,K]
圖像爲L×L×C,有大小爲A×A的池化層,pad:B,stride:C,那麼得到的特徵圖爲
[(L-A + 2 × B)/S + 1,(L-A + 2 × B)/S + 1,C]
也就是說,卷積核的厚度C要和輸入的厚度C對應(卷積的計算)。特徵圖的厚度就是有多少個卷積核。
池化層改變特徵圖大小但是不改變厚度。

前言

第一個典型的CNN是LeNet5結構,例如GoogLeNet之所以L大寫似乎就是爲了致敬。但是大家最熟知的,或者說魔改最多的還是AlexNet,當時在2012年的ImageNet競賽中的冠軍模型,後來發表了論文ImageNet Classification with Deep Convolutional Neural Networks。論文一作是Alex,是大神Hinton的學生。
事實上AlexNet的結構和LeNet非常相似,也就是目前通用的卷積神經網絡的結構,就是通過前面的卷積層進行特徵提取,最後通過全連接建立映射作爲輸出。但是AlexNet更爲複雜。

數據集介紹

ImageNet數據集包含1,500萬標註好的高像素照片,分爲大約22,000個組別。使用Amazon’s
Mechanical Turk crowd-sourcing tool在互聯網上收集圖片並進行人工標註。ILSVRC比賽自2010年開始,使用的數據集是ImageNet的子集,大約包含120萬張訓練集和50,000張驗證集,150,000張測試集圖片共1000個類別。
因爲ImageNet包含的是多種尺寸的高像素的圖片,但是AlexNet需要一個固定尺寸的輸入,所以通過降採樣的方式得到256×256大小的圖片。首先對輸入的圖片進行放縮使短邊變爲256,然後再對得到的圖像裁剪最中間的256×256的像素。(其實蠻粗暴的,但是事實證明也比較有效了,這是對特定數據集的做法。)

結構

AlexNet包括八個可學習的層——五個卷積層和三個全連接層。下面介紹一些相對之前模型來說比較新穎的點。
一、ReLU激活函數
之前常用的激活函數使tanh或者sigmoid,但是都有這樣那樣的問題(爲什麼?)所以這裏應用了ReLU激活函數來避免梯度爆炸/消失等問題。(現在更多還有leaky-ReLU等)
二、多CPU訓練
文章顯示這裏使用了兩個CPU進行並行訓練,現在來說其實蠻普遍了。其實不瞭解的人可以瞭解一下並行訓練到底是怎麼實現並行和參數更新的。
三、局部響應歸一化(Local Response Normalization)
就是一個歸一化的方法,ReLU不需要輸入的歸一化來防止激活函數飽和,但是應用LRN能更使模型更有效。

局部響應歸一化原理是仿造生物學上活躍的神經元對相鄰神經元的抑制現象(側抑制),然後根據論文有公式如下
在這裏插入圖片描述

可以參考這篇博客深度學習的局部響應歸一化LRN(Local Response Normalization)理解
四、重疊最大池化
池化在CNN中早就是有應用的。池化一般跟在卷積層之後,用於減少卷積得到的特徵,有防止過擬合的效果,有時候也被叫做降採樣層
。一般來說,一個窗口大小爲z×z的池化窗口,每次的步長s也爲z,也就是說窗口沒有重疊。AlexNet設置z=3,s=2。這就有了重疊的池化。沒有理論的基礎,但是效果確實有提升。(可能降採樣損失了很多信息,但是重疊後能減少信息損失。)
五、Dropout層
Dropout層在AlexNet中設置在最初的兩層全連接之間。可以簡單的認爲Dropout就是通過按照一定比例隨機抑制神經元輸出來得到稀疏特徵,來應對過擬合問題。
Dropout層在訓練的時候是直接抑制了一部分輸出,但是預測的時候並沒有,所以在預測輸出的時候會按照比例對權重矩陣進行縮小。細節可以參考論文Dropout: a simple way to prevent neural networks from overfitting.
六、結構總覽
在這裏插入圖片描述
論文裏的圖就是一半的不好看的樣子,但是因爲是雙GPU並行,所以看一半就可以了。很容易可以看到這個主要是將圖片分成兩部分進行處理,最後再合爲一個1000維的向量。
第一層卷積:224×224×3經過96個卷積核11×11×3得到55×55×96特徵圖(224會被預處理爲227,步長爲4,而且是雙GPU所以是55×55×48)
第一層池化:55×55×96經過大小爲3步長爲2的最大池化,變爲27×27×96(雙GPU)
第二層卷積:再經過256個5×5×48的卷積核得到27×27×256特徵圖(步長爲1,pad爲2)
第二層池化:27×27×256經過大小爲3步長爲2的最大池化,變爲13×13×256
第三層卷積:再通過384個3×3×256的卷積核(這裏兩個GPU的聯繫起來了),經過歸一化和池化得到13×13×384特徵圖(pad:1,步長爲1)
第四層卷積:再通過384個3×3×192的卷積核,得到13×13×384特徵圖
第五層卷積:再通過256個3×3×192的卷積核,得到13×13×256特徵圖
第五層池化:再通過大小爲3,步長爲2的池化得到6×6×256
第六層全連接:通過4096個6×6×256濾波器(卷積核)得到4096維特徵向量
第七層全連接:通過全連接得到4096維特徵向量
第八層全連接:全連接得到1000維輸出,計算概率得到分類結果。

AlexNet 中60M參數

AlexNet只有8層,但是它需要學習的參數有60000000個,相比如他的層數,這是一個很可怕的數字了,我們來計算下這些參數都是怎麼來的:
C1:96×11×11×3(卷積核個數/寬/高/厚度) 34848個
C2:256×5×5×48(卷積核個數/寬/高/厚度) 307200個
C3:384×3×3×256(卷積核個數/寬/高/厚度) 884736個
C4:384×3×3×192(卷積核個數/寬/高/厚度) 663552個
C5:256×3×3×192(卷積核個數/寬/高/厚度) 442368個
R1:4096×6×6×256(卷積核個數/寬/高/厚度) 37748736個
R2:4096×4096 16777216個
R3:4096×1000 4096000個

在R1中卷積核尺寸是6×6×2566\times6\times2566×6×256而不是13×13×25613\times13\times25613×13×256是因爲經過了最大池化。可以看到,全連接層(尤其是第一層)參數數量佔了絕大部分。

減少過擬合

一、數據擴增
1、生成圖像:通過隨機抽取的方式從256×256的圖像抽取出來224×224
2、改變訓練集中圖片RGB三個通道的權重。對圖片應用PCA。每個像素點都有三個通道,我們通過引入隨機量對像素點進行重建。通過這樣的方式引入了均值爲0方差爲0.1的高斯隨機噪聲
在這裏插入圖片描述
二、Dropout
這個前面講過了。

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