1. 程式人生 > >乾貨 | 深度學習之卷積神經網路(CNN)的前向傳播演算法詳解

乾貨 | 深度學習之卷積神經網路(CNN)的前向傳播演算法詳解

微信公眾號

關鍵字全網搜尋最新排名

【機器學習演算法】:排名第一

【機器學習】:排名第一

【Python】:排名第三

【演算法】:排名第四

前言

在(乾貨 | 深度學習之卷積神經網路(CNN)的模型結構)中,我們對CNN的模型結構做了總結,這裡我們就在CNN的模型基礎上,看看CNN的前向傳播演算法是什麼樣子的。重點會和傳統的DNN比較討論。

深度學習系列

CNN結構回顧

在(乾貨 | 深度學習之卷積神經網路(CNN)的模型結構)裡,已經講到了CNN的結構,包括輸出層,若干的卷積層+ReLU啟用函式,若干的池化層,DNN全連線層,以及最後的用Softmax啟用函式的輸出層。這裡我們用一個彩色的汽車樣本的影象識別再從感官上回顧下CNN的結構。圖中的CONV即為卷積層,POOL即為池化層,而FC即為DNN全連線層,包括了我們上面最後的用Softmax啟用函式的輸出層。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

CNN結構示意圖

從上圖可以看出,要理順CNN的前向傳播演算法,重點是輸入層的前向傳播,卷積層的前向傳播以及池化層的前向傳播。而DNN全連線層和用Softmax啟用函式的輸出層的前向傳播演算法我們在講DNN時已經講到了。

CNN輸入層到卷積層的前向傳播

輸入層的前向傳播是CNN前向傳播演算法的第一步。一般輸入層對應的都是卷積層,因此我們標題是輸入層前向傳播到卷積層。

這裡還是以影象識別為例

先考慮最簡單的,樣本都是二維的黑白圖片。這樣輸入層X就是一個矩陣,矩陣的值等於圖片的各個畫素位置的值。這時和卷積層相連的卷積核W就也是矩陣。如果樣本都是有RGB的彩色圖片,這樣輸入X就是3個矩陣,即分別對應R,G和B的矩陣,或者說是一個張量。這時和卷積層相連的卷積核W就也是張量,對應的最後一維的維度為3.即每個卷積核都是3個子矩陣組成。同樣的方法,對於3D的彩色圖片之類的樣本,我們的輸入X可以是4維,5維的張量,那麼對應的卷積核W也是個高維的張量。

不管維度多高,對於我們的輸入,前向傳播的過程可以表示為:

0?wx_fmt=png

其中,上標代表層數,星號代表卷積,而 b 代表我們的偏倚, σ 為啟用函式,一般都是ReLU。

和DNN的前向傳播比較一下,其實形式非常的像,只是我們這兒是張量的卷積,而不是矩陣的乘法。同時由於W是張量,那麼同樣的位置,W引數的個數就比DNN多很多了。

為了簡化我們的描述,本文後面如果沒有特殊說明,我們都預設輸入是3維的張量,即用RBG可以表示的彩色圖片。

定義的CNN模型引數

1) 一般我們的卷積核不止一個,比如有K個,那麼我們輸入層的輸出,或者說第二層卷積層的對應的輸入就K個。

2) 卷積核中每個子矩陣的的大小,一般都用子矩陣為方陣的卷積核,比如FxF的子矩陣。

3) 填充padding(以下簡稱P),我們卷積的時候,為了可以更好的識別邊緣,一般都會在輸入矩陣在周圍加上若干圈的0再進行卷積,加多少圈則P為多少。

4) 步幅stride(以下簡稱S),即在卷積過程中每次移動的畫素距離大小。

CNN隱層到卷積層的前向傳播

現在再來看普通隱藏層前向傳播到卷積層時的前向傳播演算法。

假設隱藏層的輸出是M個矩陣對應的三維張量,則輸出到卷積層的卷積核也是M個子矩陣對應的三維張量。這時表示式和輸入層的類似,也是

0?wx_fmt=png

其中,上標代表層數,星號代表卷積,而b代表我們的偏倚, σ為啟用函式,一般是ReLU。也可以寫成M個子矩陣子矩陣卷積後對應位置相加的形式,即

0?wx_fmt=png

和上面唯一的區別僅僅在於,輸入是隱藏層來的,而不是我們輸入的原始圖片樣本形成的矩陣。需要我們定義的CNN模型引數也和上一節一樣,這裡我們需要定義卷積核的個數K,卷積核子矩陣的維度F,填充大小P以及步幅S。

CNN隱層到池化層的前向傳播

池化層的處理邏輯是比較簡單的,目的就是對輸入的矩陣進行縮小概括。比如輸入的若干矩陣是NxN維的,而我們的池化大小是k x k的區域,則輸出的矩陣都是N/k × N/k維的。

這裡需要需要我們定義的CNN模型引數是:

1)池化區域的大小k

2)池化的標準,一般是MAX或者Average。

CNN隱層到全連線層的前向傳播

由於全連線層就是普通的DNN模型結構,因此我們可以直接使用DNN的前向傳播演算法邏輯,即:

0?wx_fmt=png

這裡的啟用函式一般是sigmoid或者tanh。經過了若干全連線層之後,最後的一層為Softmax輸出層。此時輸出層和普通的全連線層唯一的區別是,啟用函式是softmax函式。這裡需要定義的CNN模型引數是:

1)全連線層的啟用函式

2)全連線層各層神經元的個數

CNN前向傳播演算法小結

現在總結下CNN的前向傳播演算法。

演算法流程

輸入:1個圖片樣本,CNN模型的層數L和所有隱藏層的型別,對於卷積層,要定義卷積核的大小K,卷積核子矩陣的維度F,填充大小P,步幅S。對於池化層,要定義池化區域大小k和池化標準(MAX或Average),對於全連線層,要定義全連線層的啟用函式(輸出層除外)和各層的神經元個數。

輸出:CNN模型的輸出a^L

1)  根據輸入層的填充大小P,填充原始圖片的邊緣,得到輸入張量a^1。

2)初始化所有隱藏層的引數W,b  

3)for l=2 to L−1:

a)  如果第l層是卷積層,則輸出為

0?wx_fmt=png

b)  如果第l層是池化層,則輸出為al=pool(al−1), 這裡的pool指按照池化區域大小k和池化標準將輸入張量縮小的過程。

c)  如果第l層是全連線層,則輸出為

0?wx_fmt=png

4) 對於輸出層第L層:

0?wx_fmt=png

以上就是CNN前向傳播演算法的過程總結。有了CNN前向傳播演算法的基礎,後面再來理解CNN的反向傳播演算法就簡單多了。

歡迎分享給他人讓更多的人受益

0?wx_fmt=png

參考:

  1. 周志華《機器學習》

  2. Neural Networks and Deep Learning by By Michael Nielsen

  3. 部落格園

    http://www.cnblogs.com/pinard/p/6489633.html

  4. 李航《統計學習方法》

  5. Deep Learning, book by Ian Goodfellow, Yoshua Bengio, and Aaron Courville

  6. UFLDL Tutorial

  7. CS231n Convolutional Neural Networks for Visual Recognition, Stanford

0?wx_fmt=png

加我微信:guodongwe1991,備註姓名-單位-研究方向(加入微信機器學習交流1群)

招募 志願者

廣告、商業合作

請加QQ:[email protected]

0?wx_fmt=jpeg

喜歡,別忘關注~

幫助你在AI領域更好的發展,期待與你相遇!