第十五節,卷積神經網絡之AlexNet網絡詳解(五)
原文 ImageNet Classification with Deep ConvolutionalNeural Networks
下載地址:http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
在這之前,關於AlexNet的講解的博客已經有很多,我認為還是有必要自己親自動手寫一篇關於AlexNet相關的博客,從而鞏固我的理解。
其中有幾篇內容寫的很不錯,我在下面列出類作為參考:
從AlexNet理解卷積神經網絡的一般結構
AlexNet 網絡詳解及Tensorflow實現源碼
神經網絡模型之AlexNet的一些總結
lenet-5,Alexnet詳解以及tensorflow代碼實現
一 介紹
Alex Krizhevsky等人訓練了一個大型的卷積神經網絡用來把ImageNet LSVRC-2010比賽中120萬張高分辨率的圖像分為1000個不同的類別。在測試卷上,獲得很高準確率(top-1 and top-5 error rates of 37.5%and 17.0% ).。通過改進該網絡,在2012年ImageNet LSVRC比賽中奪取了冠軍,且準確率遠超第二名(top-5 test error rate of 15.3%,第二名26.2%。這在學術界引起了很大的轟動,開啟了深度學習的時代,雖然後來大量比AlexNet更快速更準確的卷積神經網絡結構相繼出現,但是AlexNet作為開創者依舊有著很多值得學習參考的地方,它為後續的CNN甚至是R-CNN等其他網絡都定下了基調,所以下面我們將從AlexNet入手,理解卷積神經網絡的一般結構。
AlexNet網絡包括了6000萬個參數和65000萬個神經元,5個卷積層,在一些卷積層後面還有池化層,3個全連接層,輸出為 的softmax層。
二 數據集
實驗采用的數據集是ImageNet。ImageNet是超過1500萬個標記的高分辨率圖像的數據集,大約有22,000個類別。這些圖像是從網上收集的,並使用亞馬遜的Mechanical Turk眾包服務進行了標記。從2010年開始,舉辦ILSVRC比賽,數據使用的是ImageNet的 一個子集,每個類別大約有1000個圖像,總共有1000個類別。總共有大約120萬個訓練圖像,50000個驗證圖像,以及150000個測試圖像。ImageNet比賽給出兩個錯誤率,top-1和top-5,top-5錯誤率是指你的模型預測的概率最高的5個類別中都不包含正確的類別。
![技術分享圖片](http://image.bubuko.com/info/201804/20180411103350043985.png)
四 局部歸一化(Local Response Normalization)
AlexNet在激活函數之外又使用了局部歸一化,公式如下:
![技術分享圖片](http://image.bubuko.com/info/201804/20180411103350194381.png)
其中aix,y表示第i個卷積在(x,y)產生的值然後應用ReLU激活函數的結果,n表示相鄰的幾個卷積核,N表示這一層總的卷積核數量。k,n,α都是超參數,他們的值是在驗證集實驗上得到的,k=2,n=5,α=0.75.這種歸一化操作實現了某種形式的橫向抑制,這也是真實神經元的某種行為啟發。這種具有對局部神經元的活動創建競爭機制,使得其中響應比較大的值變得更大,而對響應比較小的值更加加以抑制,從而增強模型的泛化能力,這和讓更加明顯的特征更加明顯,很細微不明顯的特征加以抑制是一個道理。
後來證明該步驟起到的作用很小,所以後來就很少使用。
五 重疊poolin(overlap pooling) 通常情況下,在卷積神經網絡中我們設置池化層參數為步幅s=2,窗口大小f=2,這相當於對圖像進行下采樣,而AlexNet使用了重疊的池化層,設置s=2,f=3。在這以前大部分是使用平均池化,到了Alexnet中就全部使用最大池化(max pool),這可以很好的解決平均池化的模糊問題。同時Alexnet提出讓卷積核掃描步長比池化核的尺寸小,這樣在池化層的輸出之間會有重疊和覆蓋,在一定程度上提升了特征的豐富性。 六 網絡結構 AlexNet總共包含8層,5個卷積層,3個全連接層,輸出 為1000個類別的softmax層。如下圖所示:![技術分享圖片](http://image.bubuko.com/info/201804/20180411103350252001.png)
從圖上可以明顯看到網絡結構分為上下兩側,這是因為網絡分布在兩個GPU上,這種藥是因為NVIDIA GTX 580 GPU只用3GB內存,裝不下那麽大的網絡。為了減少GPU之間的通信,第2,4,5個卷積層只連接同一個GPU上的上一層的kernel map(指和卷積核相乘後得到的矩陣)。第三個卷積層連接第二層的所有的kernel map。全連接的神經元連接到上一層的所有神經元。第1,2個卷積層裏ReLU操作後軸LRN操作。第1,2,5卷積層卷積之後進行max pooling操作。ReLU激活函數應用於所有的卷積層和全連接層。
在AlexNet中,我們標記5個卷積層依次2為C1,C2,C3,C4,C5。而每次卷積後的結果在上圖中可以看到,比如經過卷積層C1後,原始的圖像變成了55x55的尺寸,一共有96個通道,分布在2張3G的顯卡上,所以上圖中一個立方體的尺寸是55x55x48,48是通道數目(後面會詳細的說明),而在這個立方體裏面還有一個5x5x48的小立方體,這個就是C2卷積層的核尺寸,48是核的厚度(後面會詳細說明)。這樣我們就能看到它每一層的卷積核尺寸以及每一層卷積之後的尺寸。我們按照上面的說明,推到下每一層的卷積操作:
需要說明的是,雖然AlexNet網絡都用上圖的結構來表示,但是其實輸入圖像的尺寸不是224x224x3,而應該是227x227x3,大家可以用244的尺寸推導下,會發現邊界填充的結果是小數,這顯然是不對的,在這裏就不做推導了。
AlexNet各個層的參數和結構如下: 輸入層:227x227x3
C1:96x11x11x3 (卷積核個數/高/寬/深度)
C2:256x5x5x48(卷積核個數/高/寬/深度)
C3:384x3x3x256(卷積核個數/高/寬/深度)
C4:384x3x3x192(卷積核個數/高/寬/深度)
C5:256x3x3x192(卷積核個數/高/寬/深度)
更詳細的結構如下:
-
227x227x3的輸入圖像和卷積核11x11x3做卷積運算,步長為s=4,卷積後的尺寸是55x55x1。因為:(227-11+2*0)/4+1=55 。一共有96個卷積核,最後的輸出:55x55x48x2。(圖上之所以看起來是48個是由於2個GPU服務器處理,每個服務器承擔了48個)
- 使用ReLU激勵函數,然後還有個LRN標準化處理。
- 然後經過了一個最大池化層,池化層參數f=3,s=2.所以我們得到27x27x48x2的輸出。27是是由(55-3)/2+1計算得到的。
- 27x27x48x2的輸入,卷積核為5x5x48,。這是因為第1個卷積共有96個卷積核,第2個卷積核的尺寸應該為5x5x96,但是第一層的kernel maos分布在兩個GPU上,且第二個卷積層只連接同一個GPU上的上一個網絡,所以卷積核的尺寸為5x5x48。padding=2,s=1,(same卷積)經過卷積運算,卷積後的尺寸是27x27x1。因為:(27-5+2*2)/1+1=27 。一共有256個卷積核, 最後的輸出:27x27x128x2。
- 使用ReLU激勵函數,然後還有個LRN標準化處理。
- 然後經過了一個最大池化層,池化層參數f=3,s=2.所以我們得到13x13x128x2的輸出。13是是由(27-3)/2+1計算得到的。
3.推導下C3後的輸出是什麽:
- 13x13x256的輸入,卷積核為3x3x256,padding=1,s=1(same卷積)經過卷積運算,卷積後的尺寸是13x13x1。因為:(13-3+2*1)/1+1=13 。一共有384個卷積核, 最後的輸出:27x27x192x2。
- 使用ReLU激勵函數,不過C3層沒有使用池化層和LRN。
4.推導下C4後的輸出是什麽:
- 13x13x192x2的輸入,卷積核為3x3x192,padding=1,s=1(same卷積)經過卷積運算,卷積後的尺寸是13x13x1。因為:(13-3+2)/1+1=13 。一共有384個卷積核, 最後的輸出:13x13x192x2。
- 使用ReLU激勵函數,不過C4層沒有使用池化層和LRN。
5.推導下C5後的輸出是什麽:
- 13x13x192x2的輸入,卷積核為3x3x192,padding=1,s=1(same卷積)經過卷積運算,卷積後的尺寸是13x13x1。因為:(13-3+2)/1+1=13 。一共有個256卷積核, 最後的輸出:13x13x128x2。
- 使用ReLU激勵函數,不過C5層沒有LRN。
- 然後經過了一個最大池化層,池化層參數f=3,s=2.所以我們得到6x6x256的輸出。6是是由(13-3)/2+1計算得到的。
![技術分享圖片](http://image.bubuko.com/info/201804/20180411103351564551.png)
- 這裏使用4096個神經元,對256個大小為6X6特征圖,進行一個全鏈接,卷積核為6x6x256,一共有4096卷積核。
- 然後進行一個dropout操作,隨機從4096個節點中丟掉一些節點信息。
7.推導下FC7後的輸出是什麽:
- 這裏和FC6是類似的。
8.輸出層
- 采用的是1000個神經元,然後對FC7中4096個神經元進行全鏈接,然後會通過高斯過濾器,得到1000個float型的值,也就是我們所看到的預測的可能性,。
- 如果是訓練模型的話,會通過標簽label進行對比誤差,然後求解出殘差,再通過鏈式求導法則,將殘差通過求解偏導數逐步向上傳遞,並將權重進行推倒更改,類似與BP網絡思慮,然後會逐層逐層的調整權重以及偏置.
由於上面網絡是分布在兩個GPU上面,看起來有些淩亂,因此我們把AlexNet網絡整合在一塊,如下:
- AlexNet 首先用一張 227×227×3 的圖片作為輸入,實際上原文中使用的圖像是 224×224×3,但是如果你嘗試去推導一下,你會發現 227×227 這個尺寸更好一些。
- C1 第一層我們使用 96 個11×11 的過濾器,步幅為 4,由於步幅是 4,因此尺寸縮小到 55×55,縮小了 4 倍左右。然後用一個 3×3 的過濾器構建最大池化層,f=3,s=2,尺寸縮小為 27×27×96。
- C2 接著再執行一個 5×5 的same卷積, p=3,s=1,輸出是 27×27×256。然後再次進行最大池化,尺寸縮小到 13×13。
- C3 再執行一次 same 卷積,p=1,s=1,得到的結果是 13×13×384, 384 個過濾器。
- C4 再做一次 same 卷積,p=1,s=1,得到的結果是 13×13×384, 384 個過濾器。
- C5 再做一次 same 卷積,p=1,s=1,得到的結果是 13×13×256。最後再進行一次最大池化,尺寸縮小到 6×6×256。
- 6×6×256 等於 9216,將其展開為 9216 個單元,然後是一些全連接層。最後使用 softmax 函數輸出識別的結果。
七 防止過擬合
1.增加圖片數據集(Data Augmentation)
-
- 對圖片進行變化,例如裁切,縮放,翻轉等。
- 在圖片每個像素的RGB值上加入一個偏移量,使用主成分分析方法處理。將每個像素的RGB值x,y = [Ix,yR,Ix,yG,Ix,yB]加上下面的值:
其中pi和λi分別是RGB值3x3協方差矩陣的第i個特征向量和特征值。αi是一個服從均值0,標準差為0.1的高斯分布的隨機變量,在訓練一張圖片之前生成,同一張圖片訓練多次會生成多次。這兩個矩陣相乘,得到一個3x1的矩陣。
這種方法將top-1錯誤率減少了1%。
2.Dropout
dropout是以一定的概率使神經元的輸出為0,AlexNet設置概率為0.5,這種技術打破了神經元之間固定的依賴,使得學習到的參數更加健壯。AlexNet在第1,2個全連接網絡中使用了dropout,這使得叠代收斂的速度增加了一倍。
八 訓練學習
該模型訓練使用了隨機梯度下降法,每批圖片有180張,權重更新公式如下:
其中i是叠代的索引,v是動量,0.9是動量參數,ε是學習率,0.0005是權重衰減系數,在這裏不僅起到正則化的作用,而且減少了模型的訓練誤差。是這一批圖片代價函數對權重w的偏導數。
所有的權重都采用均值為0,方差為0.01的高斯分布進行初始化。第2,4,5卷積層和所有全連接層的偏差都初始化為1,其他層的偏差初始化為0.學習率ε=0.01,所有層都使用這個學習率,在訓練過程中,當錯誤率不在下降時,將學習率除以10,在終止訓練之前減少3次,我們把120萬張圖片訓練了90遍,總過花費了5到6天。
第十五節,卷積神經網絡之AlexNet網絡詳解(五)