1. 程式人生 > >卷積神經網絡(CNN)

卷積神經網絡(CNN)

進行 參數 一個 目的 下一步 方便 logs 很多 好的

最近可能會用到CNN,今天回顧一下,並找到了一些大神的精華帖,順便做個總結。

CNN是時下非常火的一種深度學習算法,它是一種前饋神經網絡,即神經元只與前後層有聯系,在同一層的神經元無聯系。筆者用下面這張圖用來說明卷積神經網絡的工作原理

技術分享

這是一個識別字母的CNN結構圖,最左邊是32*32像素的輸入,然後經過了6個隱含層,最終得到輸出,輸出有10個類別,分別是要識別的10個字母的標記。假設我們已經訓練好CNN,那麽從輸入到C1層有6個特征映射,也就是分別用6個訓練好的卷積核分別對32*32的輸入做了4個特征抽取(或者稱為4次掃描),掃描的過程是這樣的:將卷積核左上角與輸入圖片左上角重疊,然後向右或向下依次移動striding個單位(這裏以strding=1為例來說明),這樣可以得到28*28的輸出,下面這張圖表示了卷積計算的過程:

技術分享

卷積核與輸入像素對應位置的值相乘,然後求和就得到了一次卷積計算的輸出。實際得到的特征輸出還需要在此基礎上加一個偏置(bias),然後以此作為sigmoid函數的參數,計算得到的sigmoid函數的輸出才是對應特征輸出的結果,這樣做目測是為了方便後續的訓練,因為訓練過程需要各種求導。。

我們做卷積運算也只是對輸入圖片做了一次模糊處理(可以叫特征抽象),這一步操作可以取到一些邊緣特征。這樣做在得到6組28*28的特征輸出之後,還需要對卷積計算後的28*28的特征做一次池化(pooling),得到了S2層,這樣做的目的是可以保證旋轉不變形,(比如克服貓耳朵旋轉或者因為拍攝角度不同而造成的影響)。池化有很多種方法,比如可以選擇Max-Pooling(範圍內最大值)或者L2-Pooling(範圍內每個值的平方和的平方根),這裏得到S2層選擇的是一個2*2的鄰域做池化。

第一次池化完成後可以跟著連續n個卷積-池化的操作,從最後的隱含層到輸出層的時候是一個類似於BP神經網絡的全連接(每個隱含層的神經元與輸出神經元的全連接)。

在卷積-池化的過程中,可以想象某一次的卷積操作完全覆蓋了字母A的特征,那麽下一步的池化可以保證字母A一動一下位置也能識別,這樣保證了平移不變性(個人理解)>

CNN的訓練和BP神經網絡一樣也是反向傳播,關於反向傳播,可以參考上一篇BP神經網絡,這裏不再贅述。

總之,CNN的過程特征抽象與特征泛化的交替進行,有了池化,才不至於過擬合!

卷積神經網絡(CNN)