卷積神經網路(CNN)學習筆記
卷積神經網路(CNN)
卷積神經網路(Convolutional Neural Network )是一種深度前饋神經網路,廣泛應用於影象識別和自然語言處理等方向,本文基於初學者的視角簡單描述卷積神經網路的概念和原理,包含個人主觀理解,如有錯誤懇請指正。
為何選用CNN來處理影象
傳統的全連線(fully connected)網路結構在處理影象時,由於圖片的二維結構,導致神經元數量大大增加,即使是100X100的圖片也需要單層10000個引數,要想處理圖片,必須採用新的網路架構來減少引數,避免權重爆炸的現象發生。
基於人類的常識,可以判斷出在影象辨識中,某些細節往往比整張圖片的其餘部分重要得多,例如辨別一張圖片中的鳥,我們往往觀察到的是屬於鳥的特徵(pattrens)
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模型對於手寫數字影象有很好的分類效果
但使輸出層神經元興奮的不一定是數字,可能是其他滿足啟用條件的噪聲影象,因此模型只能做識別而不能生成手寫數字。
對於這種情形,可以通過先驗知識加上合適的限制條件
即在損失函式中加入正則項來減弱影響。
- 本文所用圖片摘自李巨集毅老師的投影片,完整投影片在這裡開放下載