1. 程式人生 > >卷積神經網路(CNN)學習筆記

卷積神經網路(CNN)學習筆記

卷積神經網路(CNN)

卷積神經網路(Convolutional Neural Network )是一種深度前饋神經網路,廣泛應用於影象識別和自然語言處理等方向,本文基於初學者的視角簡單描述卷積神經網路的概念和原理,包含個人主觀理解,如有錯誤懇請指正。

為何選用CNN來處理影象

傳統的全連線(fully connected)網路結構在處理影象時,由於圖片的二維結構,導致神經元數量大大增加,即使是100X100的圖片也需要單層10000個引數,要想處理圖片,必須採用新的網路架構來減少引數,避免權重爆炸的現象發生。

基於人類的常識,可以判斷出在影象辨識中,某些細節往往比整張圖片的其餘部分重要得多,例如辨別一張圖片中的鳥,我們往往觀察到的是屬於鳥的特徵(pattrens)

,例如鳥喙,翅膀,爪子而非圖片中的背景。CNN的設計即是這種思想的體現。

CNN的元件和基本架構

一個完整的卷積神經網路包括卷積層(Convolution)池化層(MaxPooling)全連線層(Fully Connected)。其中卷積層和池化層可以迴圈任意次。

和傳統的神經網路一樣,CNN神經元也需要激勵函式(Activation Funtion),通常使用ReLU(Rectified linear unit)函式作為激勵函式,其具有引數更新快,高效收斂的優點,但要小心設定學習率以避免神經元壞死。

卷積層

濾波器(filter)

CNN的卷積層神經元相當於是一個特徵探測器(detector),每個神經元的前饋輸入對應一個濾波器(filter)


可以指定濾波器的尺寸和每次移動的步長(stride),濾波器的設計由卷積核決定,濾波器每次移動時在原圖矩陣上覆蓋的部分與卷積核做卷積,之後按照步長移動濾波器,直到覆蓋整個矩陣。
下圖展示了一個3X3的濾波器在5X5的原圖上做卷積的過程:

這裡寫圖片描述

這樣做正是基於特徵只出現在部分割槽域的前提,也因此每個濾波器只需要關聯影象的一部分而不是全部。對應到網路的架構上,則實現了引數共享(parameter sharing):擁有相同功能的濾波器共用引數,減少連線。

  • 每個卷積層神經元對應濾波器與覆蓋位置的卷積
  • 卷積層神經元僅與覆蓋位置連線
    這裡寫圖片描述

在出現與濾波器相似的特徵時,卷積的值會明顯變大,利用此特性可以識別對應特徵出現的位置。

池化層

池化層的思想事實上對應影象的取樣(subsampling),目的是為了在保留影象特徵的前提下降低維度,同時防止overfitting的現象發生。具體操作是劃分卷積層得到的小矩陣,每一個劃分中用最大的元素代替,得到更小的新矩陣 (該過程可微分)

這裡寫圖片描述
對每個卷積核,都做同樣的MaxPooling,將其疊加,就成為了新的影象
這裡寫圖片描述
可以看出,新的影象在長寬尺寸上小於原圖,而在第三維即特徵維大於原圖,進行一次卷積-池化後的圖片相當於進行了一次特徵提取,特徵的數量取決於卷積核的數量,而在卷積神經網路的架構中,這樣的過程會反覆多次,從中不斷抽取更加高階的抽象的特徵。
這裡寫圖片描述

卷積-池化迭代次數對結果的影響

迴圈次數太少,會導致全連線層的影象過大,增加訓練的難度,迴圈次數太多,可能使影象中物件的幾何關係減弱,使影象的特徵受損。因此需要結合計算資源、先驗估計等因素選擇合適的迭代次數。

全連線層

經過卷積-池化迴圈得到的最終影像,將被展平(flatten)作為全連線層的輸入單元。
例如5X5X50的影象,將產生1250個輸入神經元,訓練仍基於反向傳播進行。
對於MINST資料集,最終輸出為10個神經元,對於所給影象產生興奮的神經元對應的數字即為識別結果。

這裡寫圖片描述

CNN in MINST(Keras)

用Keras程式碼簡單模擬CNN在MINST資料集上的工作流程,便於直觀理解

卷積層:

model.add(Convolution2D(25,3,3,input_shape=(1,28,28))) 

(卷積引數:filter數量,filter長,fliter寬,輸入影象的三維(RGB,長,寬))

得到25X26X26的image

池化層:

model.add(MaxPooling2D((2,2)))  

(池化引數:劃分的尺寸)

得到25X13X13的image

二次卷積,50個3x3的fliter

得到50X11X11的image

二次池化, 2X2尺寸

得到50X5X5的image

展平50X5X5即1250個神經元

model.add(Flatten())

投入全連線網路

model.add(Dense(output_dim=100))
model.add(Activation('relu'))
model.add(Dense(output_dim=10))
model.add(Activation('softmax'))

CNN的改進

訓練好的CNN模型對於手寫數字影象有很好的分類效果
但使輸出層神經元興奮的不一定是數字,可能是其他滿足啟用條件的噪聲影象,因此模型只能做識別而不能生成手寫數字。

對於這種情形,可以通過先驗知識加上合適的限制條件
即在損失函式中加入正則項來減弱影響。

  • 本文所用圖片摘自李巨集毅老師的投影片,完整投影片在這裡開放下載