在卷積神經網路(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
4)CS231n Convolutional Neural Networks for Visual Recognition, Stanford