卷積神經網路(CNN)前向傳播演算法

劉建平Pinard發表於2017-03-02

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

1. 回顧CNN的結構

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

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

2. CNN輸入層前向傳播到卷積層

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

    我們這裡還是以影象識別為例。

    先考慮最簡單的,樣本都是二維的黑白圖片。這樣輸入層$X$就是一個矩陣,矩陣的值等於圖片的各個畫素位置的值。這時和卷積層相連的卷積核$W$就也是矩陣。

    如果樣本都是有RGB的彩色圖片,這樣輸入$X$就是3個矩陣,即分別對應R,G和B的矩陣,或者說是一個張量。這時和卷積層相連的卷積核$W$就也是張量,對應的最後一維的維度為3.即每個卷積核都是3個子矩陣組成。

    同樣的方法,對於3D的彩色圖片之類的樣本,我們的輸入$X$可以是4維,5維的張量,那麼對應的卷積核$W$也是個高維的張量。

    不管維度多高,對於我們的輸入,前向傳播的過程可以表示為:$$ a^2= \sigma(z^2) = \sigma(a^1*W^2 +b^2)$$

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

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

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

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

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

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

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

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

    這些引數我們在上一篇都有講述。

3. 隱藏層前向傳播到卷積層

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

    假設隱藏層的輸出是M個矩陣對應的三維張量,則輸出到卷積層的卷積核也是M個子矩陣對應的三維張量。這時表示式和輸入層的很像,也是$$ a^l= \sigma(z^l) = \sigma(a^{l-1}*W^l +b^l)$$

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

    也可以寫成M個子矩陣子矩陣卷積後對應位置相加的形式,即:$$ a^l= \sigma(z^l) = \sigma(\sum\limits_{k=1}^{M}z_k^l) = \sigma(\sum\limits_{k=1}^{M}a_k^{l-1}*W_k^l +b^l)$$

    和上一節唯一的區別僅僅在於,這裡的輸入是隱藏層來的,而不是我們輸入的原始圖片樣本形成的矩陣。

    需要我們定義的CNN模型引數也和上一節一樣,這裡我們需要定義卷積核的個數K,卷積核子矩陣的維度F,填充大小P以及步幅S。

4. 隱藏層前向傳播到池化層

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

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

    1)池化區域的大小k

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

5. 隱藏層前向傳播到全連線層

    由於全連線層就是普通的DNN模型結構,因此我們可以直接使用DNN的前向傳播演算法邏輯,即:$$a^l = \sigma(z^l) = \sigma(W^la^{l-1} + b^l)$$

    這裡的啟用函式一般是sigmoid或者tanh。

    經過了若干全連線層之後,最後的一層為Softmax輸出層。此時輸出層和普通的全連線層唯一的區別是,啟用函式是softmax函式。

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

    1)全連線層的啟用函式

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

 6. 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$層是卷積層,則輸出為$$ a^l= ReLU(z^l) = ReLU(a^{l-1}*W^l +b^l)$$  

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

      c) 如果第$l$層是全連線層,則輸出為$$ a^l= \sigma(z^l) = \sigma(W^la^{l-1} +b^l)$$

    4)對於輸出層第L層: $$ a^L= softmax(z^L) = softmax(W^La^{L-1} +b^L)$$

 

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

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com) 

參考資料:

1) Neural Networks and Deep Learning by By Michael Nielsen

2) Deep Learning, book by Ian Goodfellow, Yoshua Bengio, and Aaron Courville

3) UFLDL Tutorial

4)CS231n Convolutional Neural Networks for Visual Recognition, Stanford

 

相關文章