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


    在卷積神經網絡(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM