前言
在七月初七情人節,牛郎織女相見的一天,我終于學習了CNN(來自CS231n),感覺感觸良多,所以趕快記下來,別忘了,最后祝大家情人節快樂5555555.正題開始!
CNN的基本結構
CNN分為幾層
CNN一共有卷積層(CONV)、ReLU層(ReLU)、池化層(Pooling)、全連接層(FC(Full Connection))下面是各個層的詳細解釋。
卷積層(CONV)
卷積,尤其是圖像的卷積,需要一個濾波器,用濾波器對整個圖像進行遍歷,我們假設有一個32*32*3的原始圖像A,濾波器的尺寸為5*5*3,用w表示,濾波器中的數據就是CNN的參數的一部分,那么在使用濾波器w對A進行濾波的話,可以用下面的式子表示:
其中x為原始圖像的5*5*3的一部分,b是偏置項置為1。在對A進行濾波之后,產生的是一個28*28*1的數據。那么假設我們存在6個濾波器,這六個濾波器之間彼此是獨立的,也就是他們內部的數據是不同的且沒有相關性的。可以理解為一個濾波器查找整幅圖像的垂直邊緣,一個查找水平邊緣,一個查找紅色,一個查找黑色這樣。那么我就可以產生6個28*28*1的數據,將它們組合到一起就可以產生28*28*6的數據,這就是卷積層主要做的工作。
CNN可以看作一系列的卷積層和ReLU層對原始數據結構進行處理的神經網絡,處理的過程可以用下面這幅圖表示
特別要注意的是濾波器的深度一定要與上一層傳來的數據的深度相同,就像上圖的第二個卷積層在處理傳來的28*28*6的數據時要使用5*5*6的濾波器.
步長stride
濾波器在圖像上不斷移動對圖像濾波,自然存在步長的問題,在上面我們舉的例子都是步長為1的情況,如果步長為3的話,32*32*3的圖像經過5*5*3的濾波器卷積得到的大小是(32-5)/3+1=10,注:步長不能為2因為(32-5)/2+1=14.5是小數。
所以當圖像大小是N,濾波器尺寸為F時,步長S,那么卷積后大小為(N-F)/S+1
關于控件尺寸的減小
我們從上面的圖中可以看到圖像的長和寬在逐漸的減小,在經過超過5層之后極可能只剩下1*1的空間尺度,這樣是十分不好的,而且也不利于我們接下來的計算,所以我們想讓卷積層處理完之后圖像在空間尺度上大小不變,所以我們引入了pad the border的操作。pad其實就是在圖像周圍補0,擴大圖像的尺寸,使得卷積后圖像大小不變。在CNN中,主要存在4個超參數,濾波器個數K,濾波器大小F,pad大小P和步長S,其中P是整數,當P=1時,對原始數據的操作如圖所示:
那么在pad操作后卷積后的圖像大小為:(N-F+2*P)/S+1
而要想讓卷積層處理后圖像空間尺度不變,P的值可以設為P=(F-1)/2
總結
卷積層輸入W1*H1*D1大小的數據,輸出W2*H2*D2的數據,此時的卷積層共有4個超參數:
K:濾波器個數
P:pad屬性值
S:濾波器每次移動的步長
F:濾波器尺寸
此時輸出的大小可以用輸入和超參計算得到:
W2=(W1-F+2P)/S+1
H2=(H1-F+2P)/S+1
D2=D1
一些補充
1*1的濾波器也是有意義的,它在深度方向做卷積,例如1*1*64的濾波器對56*56*64的數據卷積得到56*56的數據
F通常是奇數,這樣可以綜合考慮上下左右四個方向的數據。
用神經元的角度看待卷積層
卷積層從神經元的角度看待可以有兩個性質:參數共享和局域連接。對待一個濾波器,例如5*5*3的一個濾波器,對32*32*3的數據卷積得到28*28的數據,可以看作存在28*28個神經元,每個對原圖像5*5*3的區域進行計算,這28*28個神經元由于使用同一個濾波器,所以參數相同,我們稱這一特性為參數共享。
針對不同的濾波器,我們可以看到他們會看到同一區域的圖像,相當于在深度方向存在多個神經元,他們看著相同區域叫做局域連接
參數共享減少了參數的數量,防止了過擬合
局域連接為查找不同特征更豐富的表現圖像提供了可能。
卷積就像是對原圖像的另一種表達。
ReLU層
激活函數,對于每一個維度經過ReLU函數輸出即可。不改變數據的空間尺度。
池化層
通過pad操作,輸出圖像在控件上并沒有變化,但是深度發生了變化,越來越龐大的數據給計算帶來了困難,也出現了冗余的特征,所以需要進行池化操作,池化不改變深度,只改變長寬,主要有最大值和均值兩種方法,一般的池化濾波器大小F為2步長為2,對于最大值池化可以用下面的圖像清晰的表示:
總結
卷積層輸入W1*H1*D1大小的數據,輸出W2*H2*D2的數據,此時的卷積層共有2個超參數:
S:濾波器每次移動的步長
F:濾波器尺寸
此時輸出的大小可以用輸入和超參計算得到:
W2=(W1-F)/S+1
H2=(H1-F)/S+1
D2=D1
全連接層
將最后一層(CONV、ReLU或Pool)處理后的數據輸入全連接層,對于W2*H2*D2數據,我們將其展成1*1*W2*H2*D2大小的數據,輸入層共有W2*H2*D2個神經元,最后根據問題確定輸出層的規模,輸出層可以用softmax表示。也就是說,全連接層就是一個常見的BP神經網絡。而這個網絡也是參數最多的部分,是接下來想要去掉的部分。完整的神經網絡可以用下面的圖表示:
CNN結構:
[(CONV-ReLU)*N-POOL?]*M-(FC-RELU)*K,SoftMax
CNN趨勢
1.更小的濾波器與更深的網絡
2.只有CONV層而去掉池化與全鏈接
集中CNN網絡(時間序)
LeNet-5(1998)
最早的CNN,用于識別郵編,結構為:
CONV-POOL-CONV-POOL-CONV-FC
濾波器大小5*5,步長為1,池化層2*2,步長為2
AlexNet(2012)
2012年由于GPU技術所限,原始AlexNet為兩個GPU分開計算,這里介紹合起來的結構。
輸入圖像為227*227*3
具體結構為:
一些細節:
1.首次使用ReLU
2.使用Norm layers,現在已經拋棄,因為效果不大
3.數據經過預處理(例如大小變化,顏色變化等)
4.失活比率0.5
5.batch size 128
6.SGD Momentum 參數0.9(SGD和Momentum見我的其他文章)
7.學習速率 0.01,準確率不在提升時減少10倍,1-2次后達到收斂
8.L2權重減少0.0005
9.錯誤率15.4%
ZFNet(2013)
改進自AlexNet,主要改變:
1.CONV1的濾波器從11*11步長S=4改為7*7步長為2.
2.CONV3,4,5濾波器數量有384,384,256改為512,1024,512(濾波器數量為2的n次冪有利于計算機計算可以提高效率)
錯誤率:14.8%后繼續改進至11.2%
VGGNet(2014)
當前最好的最易用的CNN網絡,所有卷積層濾波器的大小均為3*3,步長為1,pad=1,池化層為2*2的最大值池化,S=2。
主要結構:
主要參數來自全連接層,這也是想要去掉FC的原因。
具有高度的統一性和線性的組合,易于理解,十分方便有VGG-16,VGG-19等多種結構。
錯誤率7.3%
GoogleNet(2014)
完全移除FC層,參數只有500萬,使用Inception模塊(不太理解,有時間繼續看)
準確率6.67%
ResNet殘差神經網絡
準確率3.6%
擁有極深的網絡結構,且越深準確率越高。是傳統CNN不具備的特點,傳統CNN并非越深越準確。需要訓練時間較長但是快于VGG
相關細節
1.每個卷積層使用Batch Normalization
2.Xavier/2初始化
3.SGD+Momentum(0.9)
4.Learning rate:0.1,準確率不變減小10倍(因為Batch Normalization所以比AlexNet大)
5.mini-batch size 256
6.Weight decay of 0.00001
7.不適用失活(因為Batch Normalization)
具體的梯度過程學完ResNet再說吧。