深度学习CNN算法原理
深度學習CNN算法原理
一 卷積神經網絡
卷積神經網絡(CNN)是一種前饋神經網絡,通常包含數據輸入層、卷積計算層、ReLU激活層、池化層、全連接層(INPUT-CONV-RELU-POOL-FC),是由卷積運算來代替傳統矩陣乘法運算的神經網絡。CNN常用于圖像的數據處理,常用的LenNet-5神經網絡模型如下圖所示:
?
?????? 該模型由2個卷積層、2個抽樣層(池化層)、3個全連接層組成。
1.1 卷積層
?????? 用途:進行特征提取
?????? 如上圖所示:若輸入圖像是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-1是l-1層特征圖被第j個卷積所覆蓋的元素;kijl為l層卷積核中的元素;bjl為第j個卷積結果的偏置量;Mi為第i個卷積核所覆蓋的區域;ujl為l層卷積的凈輸入;fujl為激活函數;xjl為l層第j個卷積的輸入。
如圖中所示,filter w0的第一層深度和輸入圖像的藍色方框中對應元素相乘再求和得到0,其他兩個深度得到2,0,則有0+2+0+1=3即圖中右邊特征圖的第一個元素3.,卷積過后輸入圖像的藍色方框再滑動,stride=2,如下圖。
?????? 卷積層還有一個特性就是“權值共享”原則。如沒有這個原則,則特征圖由10個32*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倍,最后加上偏置量通過激活函數得到抽樣數據。
?????? 用途:對輸入的特征圖進行壓縮,一方面使特征圖變小,簡化網絡計算復雜度;一方面進行特征壓縮,提取主要特征。
?????? 池化操作一般有兩種,一種是Avy Pooling,一種是max Pooling,如下:
?????? 同樣地采用一個2*2的filter,max pooling是在每一個區域中尋找最大值,這里的stride=2,最終在原特征圖中提取主要特征得到右圖。
?????? (Avy pooling現在不怎么用了(其實就是平均池化層),方法是對每一個2*2的區域元素求和,再除以4,得到主要特征),而一般的filter取2*2,最大取3*3,stride取2,壓縮為原來的1/4.
?????? 注意:這里的pooling操作是特征圖縮小,有可能影響網絡的準確度,因此可以通過增加特征圖的深度來彌補(這里的深度變為原來的2倍)。
1.3 全連接輸出層
全連接層則是通過提取的特征參數對原始圖像進行分類。常用的分類方法如下式
yl=f(wlxl-1+bl)
式中xl-1為前一層的特征圖,通過卷積核抽樣提取出來的特征參數;wl為全連接層的權重系數;bl為l層的偏置量。
用途:連接所有的特征,將輸出值送給分類器(如softmax分類器)。
1.4 總結
CNN網絡中前幾層的卷積層參數量占比小,計算量占比大;而后面的全連接層正好相反,大部分CNN網絡都具有這個特點。因此我們在進行計算加速優化時,重點放在卷積層;進行參數優化、權值裁剪時,重點放在全連接層。
二 Backpropagation Pass反向傳播
?????????反向傳播回來的誤差可以看做是每個神經元的基的靈敏度sensitivities(靈敏度的意思就是我們的基b變化多少,誤差會變化多少,也就是誤差對基的變化率,也就是導數了),定義如下:(第二個等號是根據求導的鏈式法則得到的)
?????????因為?u/?b=1,所以?E/?b=?E/?u=δ,也就是說bias基的靈敏度?E/?b=δ和誤差E對一個節點全部輸入u的導數?E/?u是相等的。這個導數就是讓高層誤差反向傳播到底層的神來之筆。反向傳播就是用下面這條關系式:(下面這條式子表達的就是第l層的靈敏度,就是)
公式(1)
?????????這里的“?”表示每個元素相乘。輸出層的神經元的靈敏度是不一樣的:
?????????最后,對每個神經元運用delta(即δ)規則進行權值更新。具體來說就是,對一個給定的神經元,得到它的輸入,然后用這個神經元的delta(即δ)來進行縮放。用向量的形式表述就是,對于第l層,誤差對于該層每一個權值(組合為矩陣)的導數是該層的輸入(等于上一層的輸出)與該層的靈敏度(該層每個神經元的δ組合成一個向量的形式)的叉乘。然后得到的偏導數乘以一個負學習率就是該層的神經元的權值的更新了:
公式(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大小一致,然后再將層l的map的激活值的偏導數與從第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 模型檢驗
?????? 預測結果檢驗方法:
?
總結
以上是生活随笔為你收集整理的深度学习CNN算法原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 中的 #pragma warni
- 下一篇: 多线程的异常捕捉