1. 程式人生 > >1. CNN卷積網絡初識

1. CNN卷積網絡初識

非線性 識別 mage 每一個 alt file img 重要 http

1. 前言

卷積神經網絡是一種特殊的深層的神經網絡模型,它的特殊性體現在兩個方面,

  1. 它的神經元間的連接是非全連接的,
  2. 同一層中某些神經元之間的連接的權重是共享的(即相同的)。

它的非全連接和權值共享的網絡結構使之更類似於生物 神經網絡,降低了網絡模型的復雜度(對於很難學習的深層結構來說,這是非常重要的),減少了權值的數量。

2. CNN卷積網絡結構

我們先重整體的角度觀察一下CNN卷積網絡的結構:

技術分享圖片

上圖的結構從左到右是,輸入層、卷積層(Convolution Layer)、池化層(Pooling layer)、卷積層、池化層、全連接層(Fully Connected Layer)、全鏈接層、輸出層。

卷積層+池化層的組合可以在隱藏層出現很多次,上圖中出現兩次。而實際上這個次數是根據模型的需要而來的。當然我們也可以靈活使用使用卷積層+卷積層,或者卷積層+卷積層+池化層的組合,這些在構建模型的時候沒有限制。但是最常見的CNN都是若幹卷積層+池化層的組合,如上圖中的CNN結構。

在若幹卷積層+池化層後面是全連接層(Fully Connected Layer, 簡稱FC),全連接層其實就是我們前面講的DNN結構,只是輸出層使用了Softmax激活函數來做圖像識別的分類,這點我們在DNN中也有講述。

從上面CNN的模型描述可以看出,CNN相對於DNN,比較特殊的是卷積層和池化層,如果我們熟悉DNN,只要把卷積層和池化層的原理搞清楚了,那麽搞清楚CNN就容易很多了。

3. 卷積層(Convolution Layer)

卷積層的實現是通過一個卷積核的方式實現的。一個卷積層對應一個卷積核,通過卷積核實現權值共享。

通過一張圖我們就能了解卷積層的工作原理。

技術分享圖片

我們卷積層的輸入是[3*4]的矩陣,卷積核是[2*2]的矩陣,輸出是[2*3]的矩陣。每一個輸出的值都是通過輸入層的[2*2]的值和卷積核相乘的和。

再舉一個動態的卷積過程的例子如下:

我們有下面這個綠色的5x5輸入矩陣,卷積核是一個下面這個黃色的3x3的矩陣。卷積的步幅是一個像素。則卷積的過程如下面的動圖。卷積的結果是一個3x3的矩陣。

技術分享圖片

技術分享圖片

通過這幾個卷積層的例子想必大家對卷積核的計算方式有了一定的了解。

卷積層的公式如下:

\[ s(i,j)=(X*W)(i,j) + b = \sum\limits_{k=1}^{n\_in}(X_k*W_k)(i,j) +b \]
其中,\(n\_in\)為輸入矩陣的個數,或者是張量的最後一維的維數。\(X_k\)代表第\(k\)個輸入矩陣。Wk代表卷積核的第k個子卷積核矩陣。\(s(i,j)\)即卷積核W對應的輸出矩陣的對應位置元素的值。

卷積層的輸出經常加一個激活函數,似的整個網絡具有非線性的結構。

4. 池化層(Pooling Layer)

如果說卷積層已經理解了,那池化層久更好理解了。池化層的任務是選出最具代表性的特征,同時縮小數據的維度,使得後面的的網絡處理起來更快,效率更高。池化層主要是通過一個過濾器去掃描輸入的數據,從每次掃描的過程中生成輸出數據。現在池化層主要生成數據的方式有2種

  1. 最大池化層(max pooling layer):max pooling是選擇過濾器中最大的那個值。
  2. 平均池化層(average pooling layer):選擇過濾器中所有值的平均值作為輸出。

介紹了這麽多,還不如來張圖簡明扼要。

技術分享圖片

5. 總結

在上面提到的卷積層和池化層還有兩個概念沒有提到。

  1. 步長(stride):stride的意思是過濾器的每次移動的步長,它直接影響最後輸出的數據的維度。
  2. padding:padding的意思是給數據周圍補0,使得周圍的數據和中間的數據權重相同。

了解了stride和padding,我們就能計算出輸出的維度:

輸入:數據維度為\([W,W]\),Filter大小\([F,F]\),步長\(S\),padding的像素數\(P\),可以得出\([N,N]\)

\[ N = \frac{W - F + 2P }{S+1} \]

(歡迎轉載,轉載請註明出處。歡迎溝通交流: [email protected]

1. CNN卷積網絡初識