LeNet – 5網絡
網絡結構爲:
輸入圖像是:32x32x1的灰度圖像
卷積核:5x5,stride=1
得到Conv1:28x28x6
池化層:2x2,stride=2
(池化之後再經過激活函數sigmoid)
得到Pool1:14x14x6
卷積核:5x5,stride=1
得到Conv2:10x10x16
池化層Pool2:2x2,stride=2
(池化之後再經過激活函數sigmoid)
得到Pool2:5x5x16
然後將Pool2展開,得到長度爲400的向量
經過第一個全連接層,得到FC1,長度120
經過第二個全連接層,得到FC2,長度84
最後送入softmax迴歸,得到每個類的對應的概率值。
網絡結構圖如下:
LeNet大約有6萬個參數
可以看出,隨着網絡的加深,圖像的寬度和高度在縮小,與此同時,圖像的通道卻在不斷的變大。
注:LeNet論文中的一些細節與現在的網絡處理方式有些不同。閱讀原始論文時,建議精讀Section2,泛讀Section3。不同點有以下幾點:
1)論文中使用Sigmoid函數作爲激活函數,而現在我們一般使用ReLU等作爲激活函數;
2)現在我們使用的每個卷積核的通道數都與其上一層的通道數相同,但是LeNet受限於當時的計算機的運算速度,爲了減少計算量和參數,LeNet使用了比較複雜的計算方式;
3)LeNet網絡在池化層之後再進行非線性處理(即激活函數),現在的操作是經過卷積之後就經過非線性處理(激活函數),然後再進行池化操作;
AlexNet
輸入圖像:227x227x3的RGB圖像(實際上原文中使用的圖像是224x224x3,推導的時候使用227x227x3會好一點)
Filter1:11x11,stride=4
得到Conv1:55x55x96
Max-POOL1:3x3,stride=2
得到Conv2:27x27x96
Filter2: 5x5,padding=same
得到Conv3: 27x27x256
Max-Pool2: 3x3,stride=2
得到Conv4: 13x13x256
Filter3: 3x3,padding=same
得到Conv5: 13x13x384
Filter4: 3x3,padding=same
得到Conv6: 13x13x384
Filter5: 3x3,padding=same
得到Conv6: 13x13x256
Max-Pool3: 3x3,stride=2
得到Conv7: 6x6x256
然後將Conv7展開,得到一個長度爲6x6x256=9216的向量
經過第一個全連接層
得到FC1: 4096
經過第二個全連接層
得到FC2: 4096
最後使用softmax函數輸出識別的結果
AlexNet包含大約6000萬個參數。
AlexNet使用了ReLU激活函數;
AlexNet也使用了LRN層(Local Response Normalization,局部響應歸一化層),但是由於LRN可能作用並不大,應用的比較少,在此不再詳述。
VGG-16
VGG16網絡包含了16個卷積層和全連接層。
VGG網絡的一大優點是:簡化了神經網絡結構。
VGG網絡使用的統一的卷積核大小:3x3,stride=1,padding=same,統一的Max-Pool: 2x2,stride=2。
VGG16是一個很大的網絡,總共包含1.38億個參數。因此其主要缺點就是需要訓練的特徵數量非常巨大。
另外也有VGG19網絡,由於VGG16表現幾乎和VGG16不分高下,所以很多人還是會使用VGG16。
殘差網絡(Residual Networks,ResNet)
因爲存在梯度消失和梯度爆炸(vanishing and exploding gradients),非常深的網絡是很難訓練的。
ResNet由殘差塊(Residual block)組成,
信息流從a[l]到a[l+2],普通的網絡需要經過以下幾個步驟,稱爲主路徑。
Shortcut/skip connection指a[l]跳過一層或者好幾層,從而將信息傳遞到神經網絡的更深層。
Shortcut/skip connection在進行ReLU非線性激活之前加上,如下圖所示:
如果我們使用標準的優化算法訓練一個普通網絡,憑經驗,你會發現隨着網絡深度的加深,訓練錯誤會先減少,然後增多。而理論上,隨着網絡深度的加深,應該訓練的越來越好纔對,但是實際上,如果沒有殘差網絡,對於一個普通的網絡來說,深度越深意味着用優化算法越難訓練。但是有了ResNet就不一樣了,即使網絡再深,訓練的表現卻不錯,比如說錯誤會減少,就算訓練深度達到100層的網絡也不例外。 這種方式確實有助於解決梯度消失和梯度爆炸問題,讓我們在訓練更深網絡的同時,又能保證良好的性能。
注:上圖中,Plain network指的是沒有加上藍色單箭頭線的網絡;ResNet指的是畫上藍色箭頭線的網絡。
爲什麼ResNet能有如此好的表現?
上面講到,一個網絡越深,它在訓練集上訓練網絡的效率會有所減弱,這也是有時候我們不希望加深網絡的原因,但是ResNet卻能克服這個問題。
假設有一個大型的神經網絡,其輸入爲X,輸出激活值a[l],如果你想增加這個神經網絡的深度,比如下圖,在原網絡後面再加上兩層全連接層,得到新的激活函數a[l+2]。
Shortcut使得我們很容易得出a[l+2]=a[l],這意味着即使給神經網絡增加了這兩層,它的效率也並不遜色於更簡單的神經網絡。因爲只要使得新添加的兩層的權重和偏置爲0,那麼新網絡就跟原始網絡效果是一樣的。但是如果新添加的這些隱層單元學到一些有用信息,那麼它可能比學習恆等函數表現更好。
具體可以看這篇文章:http://www.cnblogs.com/hejunlin1992/p/7751516.html
假設z[l+2]與a[l]具有相同維度,所以ResNet使用了許多相同卷積
如果輸入與輸出有不同的維度,比如說輸入的維度是128,a[l]的維度是256,再增加一個矩陣Ws,Ws是一個256x128維度的矩陣,所以Ws乘以a[l]的維度是256,你不需要對Ws做任何操作,它是通過學習得到的矩陣或參數,它是一個固定的矩陣,padding的值爲0