2012年,Imagenet比賽冠軍的model——Alexnet,它證明了CNN在複雜模型下的有效性,然後GPU實現使得訓練在可接受的時間範圍內得到結果,推動了有監督DL的發展。
模型結構見下圖:
圖中卷積部分都是畫成上下兩塊,意思是說把這一層計算出來的feature map分開,但是前一層用到的數據要看連接的虛線,如圖中input層之後的第一層第二層之間的虛線是分開的,是說二層上面的128map是由一層上面的48map計算的,下面同理;而第三層前面的虛線是完全交叉的,就是說每一個192map都是由前面的128+128=256map同時計算得到的。
模型組成
- 輸入層
- 5個卷積層
- 3個全鏈接層
其中3個卷積層進行了最大池化
模型主要結構: 輸入數據—>卷積、池化、ReLu激活—>卷積、池化、ReLu激活—>卷積、ReLu激活—>卷積、ReLu激活—>卷積、池化、ReLu激活—>全連接、ReLu激活、droupout—>全連接、ReLu激活、droupout—>輸出
AlexNet的具體架構如下所示:
層 |
類型 | 特徵圖 | 尺寸 | 卷積核尺寸 | 步長 | 填充 | 激活函數 |
---|---|---|---|---|---|---|---|
OUT |
全連接 | - | 1000 | - | - | - | Softmax |
F9 | 全連接 | - | 4096 | - | - | - | Relu |
F8 | 全連接 | - | 4096 | - | - | - | Relu |
C7 |
卷積 | 256 | 13×13 | 3×3 | 1 | SAME | Relu |
C6 | 卷積 | 384 | 13×13 | 3×3 | 1 | SAME | Relu |
C5 | 卷積 | 384 | 13×13 | 3×3 | 1 | SAME | Relu |
S4 | 最大池化 | 256 | 13×13 | 3×3 | 2 | VALID | - |
C3 | 卷積 | 256 | 27×27 | 5×5 | 1 | SAME | Relu |
S2 | 最大池化 | 96 | 27×27 | 3×3 | 2 | VALID | - |
C1 | 卷積 | 96 | 55×55 | 11×11 | 4 | SAME | Relu |
In | 輸入 | 3 | 224×224 | - | - | - | - |
Alexnet有一個特殊的計算層–LRN層,是對當前層的輸出結果做平滑處理,是深度學習訓練時的一種提高準確度的技術方法。LRN一般是在激活、池化後進行的一種處理方法。Alexnet中LRN層對局部神經元的活動創建競爭機制,使得其中響應比較大的值變得相對更大,並抑制其他反饋較小的神經元,增強了模型的泛化能力
AlexNet 各層的詳細描述
輸入層: 輸入大小爲224 x 224的3通道圖像
第1層:con - relu - pooling - LRN:卷積層(卷積、池化)
第一層輸入數據爲原始的227*227*3的圖像,這個圖像被11*11*3的卷積核進行卷積運算,卷積覈對原始圖像的每次卷積都生成一個新的像素。卷積核沿原始圖像的x軸方向和y軸方向兩個方向移動,移動的步長是4個像素。因此,卷積核在移動的過程中會生成(227-11)/4+1=55個像素(227個像素減去11,正好是54,即生成54個像素,再加上被減去的11也對應生成一個像素),行和列的55*55個像素形成對原始圖像卷積之後的像素層。共有96個卷積核,會生成55*55*96個卷積後的像素層。96個卷積核分成2組,每組48個卷積核。對應生成2組55*55*48的卷積後的像素層數據。這些像素層經過relu1單元的處理,生成激活像素層,尺寸仍爲2組55*55*48的像素層數據。
這些像素層經過pool運算(池化運算)的處理,池化運算的尺度爲3*3,運算的步長爲2,則池化後圖像的尺寸爲(55-3)/2+1=27。 即池化後像素的規模爲27*27*96;然後經過歸一化處理,歸一化運算的尺度爲5*5;第一卷積層運算結束後形成的像素層的規模爲27*27*96。分別對應96個卷積核所運算形成。這96層像素層分爲2組,每組48個像素層,每組在一個獨立的GPU上進行運算。
反向傳播時,每個卷積覈對應一個偏差值。即第一層的96個卷積覈對應上層輸入的96個偏差值。
第2層:conv - relu - pool - LRN:卷積層(卷積、池化)
第二層輸入數據爲第一層輸出的27*27*96的像素層,爲便於後續處理,每幅像素層的左右兩邊和上下兩邊都要填充2個像素;27*27*96的像素數據分成27*27*48的兩組像素數據,兩組數據分別再兩個不同的GPU中進行運算。每組像素數據被5*5*48的卷積核進行卷積運算,卷積覈對每組數據的每次卷積都生成一個新的像素。卷積核沿原始圖像的x軸方向和y軸方向兩個方向移動,移動的步長是1個像素。因此,卷積核在移動的過程中會生成(27-5+2*2)/1+1=27個像素。(27個像素減去5,正好是22,在加上上下、左右各填充的2個像素,即生成26個像素,再加上被減去的5也對應生成一個像素),行和列的27*27個像素形成對原始圖像卷積之後的像素層。共有256個5*5*48卷積核;這256個卷積核分成兩組,每組針對一個GPU中的27*27*48的像素進行卷積運算。會生成兩組27*27*128個卷積後的像素層。這些像素層經過relu2單元的處理,生成激活像素層,尺寸仍爲兩組27*27*128的像素層。
這些像素層經過pool運算(池化運算)的處理,池化運算的尺度爲3*3,運算的步長爲2,則池化後圖像的尺寸爲(57-3)/2+1=13。 即池化後像素的規模爲2組13*13*128的像素層;然後經過歸一化處理,歸一化運算的尺度爲5*5;第二卷積層運算結束後形成的像素層的規模爲2組13*13*128的像素層。分別對應2組128個卷積核所運算形成。每組在一個GPU上進行運算。即共256個卷積核,共2個GPU進行運算。
反向傳播時,每個卷積覈對應一個偏差值。即第一層的96個卷積覈對應上層輸入的256個偏差值
第3層:conv - relu:卷積層
第三層輸入數據爲第二層輸出的2組13*13*128的像素層;爲便於後續處理,每幅像素層的左右兩邊和上下兩邊都要填充1個像素;2組像素層數據都被送至2個不同的GPU中進行運算。每個GPU中都有192個卷積核,每個卷積核的尺寸是3*3*256。因此,每個GPU中的卷積核都能對2組13*13*128的像素層的所有數據進行卷積運算。卷積覈對每組數據的每次卷積都生成一個新的像素。卷積核沿像素層數據的x軸方向和y軸方向兩個方向移動,移動的步長是1個像素。因此,運算後的卷積核的尺寸爲(13-3+1*2)/1+1=13(13個像素減去3,正好是10,在加上上下、左右各填充的1個像素,即生成12個像素,再加上被減去的3也對應生成一個像素),每個GPU中共13*13*192個卷積核。2個GPU中共13*13*384個卷積後的像素層。這些像素層經過relu3單元的處理,生成激活像素層,尺寸仍爲2組13*13*192像素層,共13*13*384個像素層
第4層:conv-relu:卷積層
第四層輸入數據爲第三層輸出的2組13*13*192的像素層;爲便於後續處理,每幅像素層的左右兩邊和上下兩邊都要填充1個像素;2組像素層數據都被送至2個不同的GPU中進行運算。每個GPU中都有192個卷積核,每個卷積核的尺寸是3*3*192。因此,每個GPU中的卷積核能對1組13*13*192的像素層的數據進行卷積運算。卷積覈對每組數據的每次卷積都生成一個新的像素。卷積核沿像素層數據的x軸方向和y軸方向兩個方向移動,移動的步長是1個像素。因此,運算後的卷積核的尺寸爲(13-3+1*2)/1+1=13(13個像素減去3,正好是10,在加上上下、左右各填充的1個像素,即生成12個像素,再加上被減去的3也對應生成一個像素),每個GPU中共13*13*192個卷積核。2個GPU中共13*13*384個卷積後的像素層。這些像素層經過relu4單元的處理,生成激活像素層,尺寸仍爲2組13*13*192像素層,共13*13*384個像素層
第5層:conv - relu - pool:卷積層(卷積、池化)
第五層輸入數據爲第四層輸出的2組13*13*192的像素層;爲便於後續處理,每幅像素層的左右兩邊和上下兩邊都要填充1個像素;2組像素層數據都被送至2個不同的GPU中進行運算。每個GPU中都有128個卷積核,每個卷積核的尺寸是3*3*192。因此,每個GPU中的卷積核能對1組13*13*192的像素層的數據進行卷積運算。卷積覈對每組數據的每次卷積都生成一個新的像素。卷積核沿像素層數據的x軸方向和y軸方向兩個方向移動,移動的步長是1個像素。因此,運算後的卷積核的尺寸爲(13-3+1*2)/1+1=13(13個像素減去3,正好是10,在加上上下、左右各填充的1個像素,即生成12個像素,再加上被減去的3也對應生成一個像素),每個GPU中共13*13*128個卷積核。2個GPU中共13*13*256個卷積後的像素層。這些像素層經過relu5單元的處理,生成激活像素層,尺寸仍爲2組13*13*128像素層,共13*13*256個像素層。
2組13*13*128像素層分別在2個不同GPU中進行池化(pool)運算處理。池化運算的尺度爲3*3,運算的步長爲2,則池化後圖像的尺寸爲(13-3)/2+1=6。 即池化後像素的規模爲兩組6*6*128的像素層數據,共6*6*256規模的像素層數據
第6層:fc - relu - dropout:全鏈接層
第六層輸入數據的尺寸是6*6*256,採用6*6*256尺寸的濾波器對第六層的輸入數據進行卷積運算;每個6*6*256尺寸的濾波器對第六層的輸入數據進行卷積運算生成一個運算結果,通過一個神經元輸出這個運算結果;共有4096個6*6*256尺寸的濾波器對輸入數據進行卷積運算,通過4096個神經元輸出運算結果;這4096個運算結果通過relu激活函數生成4096個值;並通過drop運算後輸出4096個本層的輸出結果值。
由於第六層的運算過程中,採用的濾波器的尺寸(6*6*256)與待處理的feature map的尺寸(6*6*256)相同,即濾波器中的每個係數只與feature map中的一個像素值相乘;而其它卷積層中,每個濾波器的係數都會與多個feature map中像素值相乘;因此,將第六層稱爲全連接層。
第五層輸出的6*6*256規模的像素層數據與第六層的4096個神經元進行全連接,然後經由relu6進行處理後生成4096個數據,再經過dropout6處理後輸出4096個數據。
這裏有一層特殊的dropout層,在alexnet中是說在訓練的以1/2概率使得隱藏層的某些neuron的輸出爲0,這樣就丟到了一半節點的輸出,BP的時候也不更新這些節點
第7層: fc - relu - dropout:全鏈接層
第六層輸出的4096個數據與第七層的4096個神經元進行全連接,然後經由relu7激活函數進行處理後生成4096個數據,再經過dropout7處理後輸出4096個數據
第8層:fc - softmax:輸出層
第七層輸出的4096個數據與第八層的1000個神經元進行全連接,經過訓練後輸出被訓練的數值
Alexnet網絡中各個層發揮的作用如下表所述:
算法 | 作用 |
---|---|
ReLU、多個CPU | 提高訓練速度 |
重疊pool池化 | 提高精度、不容易產生過擬合 |
局部響應歸一化 | 提高精度 |
數據增益、Dropout | 減少過擬合 |