CNN的開山之作是LeCun提出的LeNet-5,而其真正的爆發階段是2012年AlexNet取得ImageNet比賽的分類任務的冠軍,並且分類准確率遠遠超過利用傳統方法實現的分類結果,AlexNet之后,深度學習便一發不可收拾,分類准確率每年都被刷榜,下圖展示了模型的變化情況,隨着模型的變深,Top-5的錯誤率也越來越低,目前已經降低到了3.5%左右,同樣的ImageNet數據集,人眼的辨識錯誤率大概為5.1%,也就是深度學習的識別能力已經超過了人類。
LeNet-5結構簡要
輸入圖像大小為32x32,比MNIST數據庫中的字母大,這樣做的原因是希望潛在的明顯特征,如筆畫斷點或角點能夠出現在最高層特征監測子感受野的中心。
|
C1層 |
S2層 |
C3層 |
S4層 |
C5層 |
F6層 |
輸入圖像大小 |
32×32 |
28×28×6 |
14×14×6 |
10×10×16 |
5×5×16 |
1×1×120 |
卷積核大小 |
5×5 |
2×2 |
5×5 |
2×2 |
5×5 |
1×1 |
卷積核個數 |
6 |
6 |
16 |
16 |
120 |
84 |
輸出特征圖數量 |
6 |
6 |
16 |
16 |
120 |
1 |
輸出特征圖大小 |
28×28 (32-5+1) |
14×14 (28/2,28/2) |
10×10 (14-5+1) |
5×5×16 |
1×1 (5-5+1) |
84 |
神經元數量 |
4707 (28×28×6) |
1176 (14×14×6) |
1600 (10×10×16) |
400 (5×5×16) |
120 (1×120) |
84 |
連接數 |
122304 (28×28×5×5×6+28×28×6) |
5880 (2×2×14×14×6+14×14×6) |
151600 (1516×10×10) |
2000 (2×2×5×5×16+5×5×16) |
48120 (5×5×16×120×1+120×1) |
10164 (120×84+84) |
可訓練參數 |
156 (5×5×6,權值+偏置) |
12 (1×6+6, 權值+偏置) |
1516 |
32 ((1+1)×16) |
48120 (5×5×16×120+120) |
10164 (120×84+84) |
output層
- 輸入圖像大小:1x84
- 輸出特征圖數量:1x10
AlexNet
此文對AlexNet說的很詳細https://blog.csdn.net/zyqdragon/article/details/72353420以下表格之前均轉載此文。
Alex在2012年提出的alexnet網絡結構模型引爆了神經網絡的應用熱潮,並贏得了2012屆圖像識別大賽的冠軍,使得CNN成為在圖像分類上的核心算法模型。
1. conv1階段DFD(data flow diagram):
第一層輸入數據為原始的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. conv2階段DFD(data flow diagram):
第二層輸入數據為第一層輸出的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. conv3階段DFD(data flow diagram):
第三層輸入數據為第二層輸出的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. conv4階段DFD(data flow diagram):
第四層輸入數據為第三層輸出的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. conv5階段DFD(data flow diagram):
第五層輸入數據為第四層輸出的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. fc6階段DFD(data flow diagram):
第六層輸入數據的尺寸是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個數據。
7. fc7階段DFD(data flow diagram):
第六層輸出的4096個數據與第七層的4096個神經元進行全連接,然后經由relu7進行處理后生成4096個數據,再經過dropout7處理后輸出4096個數據。
8. fc8階段DFD(data flow diagram):
第七層輸出的4096個數據與第八層的1000個神經元進行全連接,經過訓練后輸出被訓練的數值。
Alexnet網絡中各個層發揮的作用如下表所述:
算法 |
作用 |
ReLU、多個CPU |
提高訓練速度 |
重疊pool池化 |
提高精度、不容易產生過擬合 |
局部響應歸一化 |
提高精度 |
數據增益、Dropout |
減少過擬合 |
**訓練技巧(以下AlexNet部分均轉載此文):dropout防止過擬合,提高泛化能力 **
訓練階段使用了Dropout技巧隨機忽略一部分神經元,緩解了神經網絡的過擬合現象,和防止對網絡參數優化時陷入局部最優的問題,Dropout雖有單獨的論文論述,但是AlexNet將其實用化,通過實踐證實了它的效果。在AlexNet中主要是最后幾個全連接層使用了Dropout。
該網絡是利用Dropout在訓練過程中將輸入層和中間層的一些神經元隨機置零,使得訓練過程收斂的更慢,但得到的網絡模型更加具有魯棒性。
數據擴充 / 數據增強:防止過擬合
通過圖像平移、水平翻轉、調整圖像灰度等方法擴充樣本訓練集,擴充樣本訓練集,使得訓練得到的網絡對局部平移、旋轉、光照變化具有一定的不變性,數據經過擴充以后可以達到減輕過擬合並提升泛化能力。進行預測時,則是取圖像的四個角加上中間共5個位置,並進行左右翻轉,一共獲得10張圖像,對它們進行預測並對10次結果求均值。
池化方式:
AlexNet全部使用最大池化的方式,避免了平均池化所帶來的模糊化的效果,並且步長<池化核的大小,這樣一來池化層的輸出之間會有重疊和覆蓋,提升了特征的豐富性。
此前的CNN一直使用平均池化的操作。
激活函數:ReLU
Relu函數:f(x)=max(0,x)
采用非飽和線性單元——ReLU代替傳統的經常使用的tanh和sigmoid函數,加速了網絡訓練的速度,降低了計算的復雜度,對各種干擾更加具有魯棒性,並且在一定程度上避免了梯度消失問題。
優勢:
ReLU本質上是分段線性模型,前向計算非常簡單,無需指數之類操作;
ReLU的偏導也很簡單,反向傳播梯度,無需指數或者除法之類操作;
ReLU不容易發生梯度發散問題,Tanh和Logistic激活函數在兩端的時候導數容易趨近於零,多級連乘后梯度更加約等於0;
ReLU關閉了右邊,從而會使得很多的隱層輸出為0,即網絡變得稀疏,起到了類似L1的正則化作用,可以在一定程度上緩解過擬合。
缺點:
當然,ReLU也是有缺點的,比如左邊全部關了很容易導致某些隱藏節點永無翻身之日,所以后來又出現pReLU、random ReLU等改進,而且ReLU會很容易改變數據的分布,因此ReLU后加Batch Normalization也是常用的改進的方法。
提出了LRN層(Local Response Normalization):
LRN即Local Response Normalization,局部響應歸一化處理,實際就是利用臨近的數據做歸一化,該策略貢獻了1.2%的准確率,該技術是深度學習訓練時的一種提高准確度的技術方法,LRN一般是在激活、池化后進行的一種處理方法。
LRN是對局部神經元的活動創建競爭機制,使得其中響應較大的值變得相對更大,並抑制其他反饋較小的神經元,增強了模型的泛化能力。
為什么輸入數據需要歸一化(Normalized Data)?
歸一化后有什么好處呢?原因在於神經網絡學習過程本質就是為了學習數據分布,一旦訓練數據與測試數據的分布不同,那么網絡的泛化能力也大大降低;另外一方面,一旦每批訓練數據的分布各不相同(batch 梯度下降),那么網絡就要在每次迭代都去學習適應不同的分布,這樣將會大大降低網絡的訓練速度,這也正是為什么我們需要對數據都要做一個歸一化預處理的原因。
對於深度網絡的訓練是一個復雜的過程,只要網絡的前面幾層發生微小的改變,那么后面幾層就會被累積放大下去。一旦網絡某一層的輸入數據的分布發生改變,那么這一層網絡就需要去適應學習這個新的數據分布,所以如果訓練過程中,訓練數據的分布一直在發生變化,那么將會影響網絡的訓練速度。
分布式計算:
AlexNet使用CUDA加速深度卷積網絡的訓練,利用GPU強大的並行計算能力,處理神經網絡訓練時大量的矩陣運算。
有多少層需要訓練
整個AlexNet有8個需要訓練參數的層,不包括池化層和LRN層,前5層為卷積層,后3層為全連接層,AlexNet的最后一層是由1000類輸出的Softmax層用作分類,LRN層出現在第一個和第二個卷積層之后,最大池化層出現在兩個LRN之后和最后一個卷積層之后。
雖然前幾個卷積層的計算量很大,但是參數量都很小,在1M左右甚至更小。只占AlexNet總參數量的很小一部分,這就是卷積層的作用,可以通過較小的參數量有效的提取特征。
為什么使用多層全連接:
全連接層在CNN中起到分類器的作用,前面的卷積層、池化層和激活函數層等操作是將原始數據映射到隱層特征空間,全連接層是將學到的特征映射映射到樣本標記空間,就是矩陣乘法,再加上激活函數的非線性映射,多層全連接層理論上可以模擬任何非線性變換。但缺點也很明顯: 無法保持空間結構。
由於全連接網絡的冗余(占整個我拿過來參數的80%),近期一些好的網絡模型使用全局平均池化(GAP)取代FC來融合學到的深度特征,最后使用softmax等損失函數作為網絡目標函數來指導學習過程,用GAP替代FC的網絡通常有較好的預測性能。
全連接的一個作用是維度變換,尤其是可以把高維變到低維,同時把有用的信息保留下來。全連接另一個作用是隱含語義的表達(embedding),把原始特征映射到各個隱語義節點(hidden node)。對於最后一層全連接而言,就是分類的顯示表達。不同channel同一位置上的全連接等價與1x1的卷積。N個節點的全連接可近似為N個模板卷積后的均值池化(GAP)。
GAP:假如最后一層的數據是10個66的特征圖,global average pooling是將每個特征圖計算所有像素點的均值,輸出一個數據值,10個特征圖就會輸出10個值,組成一個110的特征向量。
用特征圖直接表示屬於某類的置信率,比如有10個輸出,就在最后輸出10個特征圖,每個特征圖的值加起來求均值,然后將均值作為其屬於某類的置信值,再輸入softmax中,效果較好。
因為FC的參數眾多,這么做就減少了參數的數量(在最近比較火的模型壓縮中,這個優勢可以很好的壓縮模型的大小)。
因為減少了參數的數量,可以很好的減輕過擬合的發生。
為什么過了20年才卷土重來:
1. 大規模有標記數據集的出現,防止以前不可避免的過擬合現象
**2. 計算機硬件的突飛猛進,卷積神經網絡對計算機的運算要求比較高,需要大量重復可並行化的計算,在當時CPU只有單核且運算能力比較低的情況下,不可能進行個很深的卷積神經網絡的訓練。隨着GPU計算能力的增長,卷積神經網絡結合大數據的訓練才成為可能。 **
3. 卷積神經網絡有一批一直在堅持的科學家(如Lecun)才沒有被沉默,才沒有被海量的淺層方法淹沒。然后最后終於看到卷積神經網絡占領主流的曙光。
VGGNet
https://my.oschina.net/u/876354/blog/1634322
GoogLeNet
https://blog.csdn.net/alibabazhouyu/article/details/80027921
https://blog.csdn.net/u012679707/article/details/80824889
https://blog.csdn.net/sunlianglong/article/details/79956734
ResNet
https://blog.csdn.net/weixin_43624538/article/details/85049699
https://blog.csdn.net/u013181595/article/details/80990930
DeepFace
https://blog.csdn.net/hh_2018/article/details/80576290
U-Net
https://blog.csdn.net/mieleizhi0522/article/details/82025509