1. 程式人生 > >深度學習CNN演算法原理

深度學習CNN演算法原理

深度學習CNN演算法原理

一 卷積神經網路

卷積神經網路(CNN)是一種前饋神經網路,通常包含資料輸入層、卷積計算層、ReLU啟用層、池化層、全連線層(INPUT-CONV-RELU-POOL-FC),是由卷積運算來代替傳統矩陣乘法運算的神經網路。CNN常用於影象的資料處理,常用的LenNet-5神經網路模型如下圖所示:

 

       該模型由2個卷積層、2個抽樣層(池化層)、3個全連線層組成。

1.1 卷積層

       用途:進行特徵提取

https://images2015.cnblogs.com/blog/1062917/201611/1062917-20161117195004607-577964604.png

       如上圖所示:若輸入影象是32*32*3(3是它的深度(即R、G、B),卷積層是一個5*5*3的filter(感受野)。注意感受野的深度必須和輸入影象的深度相同。通過一個filter與輸入影象的卷積可以得到一個28*28*1的特徵圖,上圖是用了兩個filter得到了兩個特徵圖;在實際的運用過程中,通常會使用多層卷積層來得到更深層次的特徵圖。

       卷積層是通過一個可調引數的卷積核與上一層特徵圖進行滑動卷積運算,再加上一個偏置量得到一個淨輸出,然後呼叫啟用函式得出卷積結果,通過對全圖的滑動卷積運算輸出新的特徵圖,

ujl=i∈Mixijl-1*kijl+bjl

xjl=f(ujl)

       式中xijl-1l-1層特徵圖被第j個卷積所覆蓋的元素;kijll層卷積核中的元素;bjl為第j個卷積結果的偏置量;Mi為第i個卷積核所覆蓋的區域;ujll層卷積的淨輸入;fujl為啟用函式;xjll層第j個卷積的輸入。

https://images2015.cnblogs.com/blog/1062917/201611/1062917-20161117195503451-270982131.png

如圖中所示,filter w0的第一層深度和輸入影象的藍色方框中對應元素相乘再求和得到0,其他兩個深度得到20,則有0+2+0+1=3即圖中右邊特徵圖的第一個元素3.,卷積過後輸入影象的藍色方框再滑動,stride=2

,如下圖。

https://images2015.cnblogs.com/blog/1062917/201611/1062917-20161117200000888-1689372810.png

       卷積層還有一個特性就是權值共享原則。如沒有這個原則,則特徵圖由1032*32*1的特徵圖組成,即每個特徵圖上有1024個神經元,每個神經元對應輸入影象上一塊5*5*3的區域,即一個神經元和輸入影象的這塊區域有75個連線,即75個權值引數,則共有75*1024*10=768000個權值引數,這是非常複雜的,因此卷積神經網路引入權值共享原則,即一個特徵圖上每個神經元對應的75個權值引數被每個神經元共享,這樣則只需75*10=750個權值引數,而每個特徵圖的閾值也共享,即需要10個閾值,則總共需要750+10=760個引數。

 

補充:

       (1)對於多通道影象做1*1卷積,其實就是將輸入影象的每個通道乘以係數後加在一起,即相當於將原圖中本來各個獨立的通道“聯通”在了一起;

       (2)權值共享時,只是在每一個filter上的每一個channel中是共享的;

1.2 抽樣層(池化層)

       抽樣層是將輸入的特徵圖用nxn的視窗劃分成多個不重疊的區域,然後對每個區域計算出最大值或者均值,使影象縮小了n倍,最後加上偏置量通過啟用函式得到抽樣資料。

       用途:對輸入的特徵圖進行壓縮,一方面使特徵圖變小,簡化網路計算複雜度;一方面進行特徵壓縮,提取主要特徵。

https://images2015.cnblogs.com/blog/1062917/201611/1062917-20161117211920029-1784506227.png

       池化操作一般有兩種,一種是Avy Pooling,一種是max Pooling,如下:

https://images2015.cnblogs.com/blog/1062917/201611/1062917-20161117212026498-272435652.png

       同樣地採用一個2*2filter,max pooling是在每一個區域中尋找最大值,這裡的stride=2,最終在原特徵圖中提取主要特徵得到右圖。

       Avy pooling現在不怎麼用了(其實就是平均池化層),方法是對每一個2*2的區域元素求和,再除以4,得到主要特徵),而一般的filter2*2,最大取3*3,stride2,壓縮為原來的1/4.

       注意:這裡的pooling操作是特徵圖縮小,有可能影響網路的準確度,因此可以通過增加特徵圖的深度來彌補(這裡的深度變為原來的2倍)。

1.3 全連線輸出層

全連線層則是通過提取的特徵引數對原始影象進行分類。常用的分類方法如下式

yl=f(wlxl-1+bl)

式中xl-1為前一層的特徵圖,通過卷積核抽樣提取出來的特徵引數;wl為全連線層的權重係數;bll層的偏置量。

用途:連線所有的特徵,將輸出值送給分類器(如softmax分類器)。

1.4 總結

CNN網路中前幾層的卷積層引數量佔比小,計算量佔比大;而後面的全連線層正好相反,大部分CNN網路都具有這個特點。因此我們在進行計算加速優化時,重點放在卷積層;進行引數優化、權值裁剪時,重點放在全連線層。

二 Backpropagation Pass反向傳播

         反向傳播回來的誤差可以看做是每個神經元的基的靈敏度sensitivities(靈敏度的意思就是我們的基b變化多少,誤差會變化多少,也就是誤差對基的變化率,也就是導數了),定義如下:(第二個等號是根據求導的鏈式法則得到的)

https://img-blog.csdn.net/20130816002850203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem91eHkwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

         因為∂u/∂b=1,所以∂E/∂b=∂E/∂u=δ,也就是說bias基的靈敏度∂E/∂b=δ和誤差E對一個節點全部輸入u的導數∂E/∂u是相等的。這個導數就是讓高層誤差反向傳播到底層的神來之筆。反向傳播就是用下面這條關係式:(下面這條式子表達的就是第l層的靈敏度,就是)

https://img-blog.csdn.net/20130816002937765?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem91eHkwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast公式(1

         這裡的“◦”表示每個元素相乘。輸出層的神經元的靈敏度是不一樣的:

https://img-blog.csdn.net/20130816002950875?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem91eHkwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

         最後,對每個神經元運用delta(即δ)規則進行權值更新。具體來說就是,對一個給定的神經元,得到它的輸入,然後用這個神經元的delta(即δ)來進行縮放。用向量的形式表述就是,對於第l層,誤差對於該層每一個權值(組合為矩陣)的導數是該層的輸入(等於上一層的輸出)與該層的靈敏度(該層每個神經元的δ組合成一個向量的形式)的叉乘。然後得到的偏導數乘以一個負學習率就是該層的神經元的權值的更新了:

https://img-blog.csdn.net/20130816003002437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem91eHkwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast公式(2

         對於bias基的更新表示式差不多。實際上,對於每一個權值(W)ij都有一個特定的學習率ηIj。

 

三 Computing the Gradients梯度計算

       假定每個卷積層l都會接一個下采樣層l+1 。對於BP來說,我們知道,要想求得層l的每個神經元對應的權值的權值更新,就需要先求層l的每一個神經節點的靈敏度δ(也就是權值更新的公式(2))。為了求這個靈敏度我們就需要先對下一層的節點(連線到當前層l的感興趣節點的第l+1層的節點)的靈敏度求和(得到δl+1),然後乘以這些連線對應的權值(連線第l層感興趣節點和第l+1層節點的權值)W。再乘以當前層l的該神經元節點的輸入u的啟用函式f的導數值(也就是那個靈敏度反向傳播的公式(1)的δl的求解),這樣就可以得到當前層l每個神經節點對應的靈敏度δl了。

       因為下采樣的存在,取樣層的一個畫素(神經元節點)對應的靈敏度δ對應於卷積層(上一層)的輸出map的一塊畫素(取樣視窗大小)。因此,層l中的一個map的每個節點只與l+1層中相應map的一個節點連線。

     為了有效計算層l的靈敏度,我們需要上取樣upsample 這個下采樣downsample層對應的靈敏度map(特徵map中每個畫素對應一個靈敏度,所以也組成一個map),這樣才使得這個靈敏度map大小與卷積層的map大小一致,然後再將層lmap的啟用值的偏導數與從第l+1層的上取樣得到的靈敏度map逐元素相乘(也就是公式(1))。

       下采樣層map的權值都取一個相同值β,而且是一個常數。所以我們只需要將上一個步驟得到的結果乘以一個β就可以完成第l層靈敏度δ的計算

       參考網址:https://blog.csdn.net/u010555688/article/details/38780767

二 實驗分析

       在本文中,實驗結果和過程基於Tensorflow深度學習框架進行實現,資料來源使用MNIST資料集,分別採用softmax迴歸演算法和CNN深度學習進行模型訓練。

2.1 CNN模型實現

結合LenNet-5神經網路模型,基於Tensorflow深度學習模型實現方式如下:

2.2 模型評價指標

       採用常用的成本函式“交叉熵”,如下式所示:

Hy'y=-iyi'log⁡(yi)

       式中,y為預測的概率分佈,y’為實際輸入值。實現方法如下:(1)建立佔位符輸入正確值;(2)計算交叉熵

2.3 模型檢驗

       預測結果檢驗方法: