1. 程式人生 > >卷積神經網路(CNN)基礎

卷積神經網路(CNN)基礎

CNN的基本結構

原文地址:https://www.jianshu.com/p/da0c4cc76a06

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時,對原始資料的操作如圖所示:


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

具體結構為:
AlexNet
一些細節:

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)



作者:WZFish0408
連結:https://www.jianshu.com/p/da0c4cc76a06
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。