1. CNN卷積網絡-初識
2. CNN卷積網絡-前向傳播算法
3. CNN卷積網絡-反向更新
1. 前言
我們已經了解了CNN的結構,CNN主要結構有輸入層,一些卷積層和池化層,后面是DNN全連接層,最后是Softmax激活函數的輸出層。這里我們用一個彩色的汽車樣本的圖像識別再從感官上回顧下CNN的結構。圖中的CONV即為卷積層,POOL即為池化層,而FC即為DNN全連接層,包括了我們上面最后的用Softmax激活函數的輸出層。
2. 卷積層的前向傳播
還是以上面的圖片作為例子。
先考慮最簡單的,樣本都是二維的黑白圖片。這樣輸入層\(X\)就是一個矩陣,矩陣的值等於圖片的各個像素位置的值。這時和卷積層相連的卷積核\(W\)就也是矩陣。
如果樣本都是有RGB的彩色圖片,這樣輸入\(X\)就是3個矩陣,即分別對應\([R,G,B]\)的矩陣,或者說是一個張量。這時和卷積層相連的卷積核\(W\)就也是張量,對應的最后一維的維度為3.即每個卷積核都是3個子矩陣組成。
同樣的方法,對於3D的彩色圖片之類的樣本,我們的輸入\(X\)可以是4維,5維的張量,那么對應的卷積核W也是個高維的張量。
不管維度多高,對於我們的輸入,前向傳播的過程可以表示為:
其中,上標代表層數,星號代表卷積,而\(b\)代表我們的偏倚, \(\sigma\)為激活函數,這里一般都是\(ReLU\)。
和DNN的前向傳播比較一下,其實形式非常的像,只是我們這兒是張量的卷積,而不是矩陣的乘法。同時由於\(W\)是張量,那么同樣的位置,\(W\)參數的個數就比DNN多很多了。
為了簡化我們的描述,本文后面如果沒有特殊說明,我們都默認輸入是3維的張量,即用\(RBG\)可以表示的彩色圖片。
這里需要我們自己定義的CNN模型參數是:
- 一般我們的卷積核不止一個,比如有\(K\)個,那么我們輸入層的輸出,或者說第二層卷積層的對應的輸入就\(K\)個。
- 卷積核中每個子矩陣的的大小,一般我們都用子矩陣為方陣的卷積核,比如\([F,F]\)的子矩陣。
- 填充padding(以下簡稱P),我們卷積的時候,為了可以更好的識別邊緣,一般都會在輸入矩陣在周圍加上若干圈的0再進行卷積,加多少圈則\(P\)為多少。
- 步幅stride(以下簡稱S),即在卷積過程中每次移動的像素距離大小。
3. 池化層的前向傳播
池化層的處理邏輯是比較簡單的,我們的目的就是對輸入的矩陣進行縮小概括。比如輸入的若干矩陣是\([N,N]\)維的,而我們的池化大小是\([k,k]\)的區域,則輸出的矩陣都是\([N_k,N_k]\)維的。
這里需要需要我們定義的CNN模型參數是:
- 池化區域的大小\(k\)
- 池化的標准,一般是MAX或者Average。
4. 全連接層的前向傳播
由於全連接層就是普通的DNN模型結構,因此我們可以直接使用DNN的前向傳播算法邏輯,即:
5. 總結
有了上面的基礎,我們現在總結下CNN的前向傳播算法。
輸入:1個圖片樣本,CNN模型的層數\(L\)和所有隱藏層的類型,對於卷積層,要定義卷積核的大小\(K\),卷積核子矩陣的維度\(F\),填充大小\(P\),步幅\(S\)。對於池化層,要定義池化區域大小k和池化標准(MAX或Average),對於全連接層,要定義全連接層的激活函數(輸出層除外)和各層的神經元個數。
輸出:CNN模型的輸出\(a_L\)
- 根據輸入層的填充大小\(P\),填充原始圖片的邊緣,得到輸入張量\(a_1\)。
- 初始化所有隱藏層的參數\(W,b\)
- \(for\;\;l=2\;\;to\;\;L-1\):
- 如果第\(l\)層是卷積層,則輸出為\(a^l= ReLU(z^l) = ReLU(a^{l-1}*W^l +b^l)\)
- 如果第\(l\)層是池化層,則輸出為\(a_l=pool(a_{l-1})\), 這里的pool指按照池化區域大小\(k\)和池化標准將輸入張量縮小的過程。
- 如果第\(l\)層是全連接層,則輸出為\(a^l= \sigma(z^l) = \sigma(W^la^{l-1} +b^l)\)
- 對於輸出層第\(L\)層:\(a^L= softmax(z^L) = softmax(W^La^{L-1} +b^L)\)
以上就是CNN前向傳播算法的過程總結。有了CNN前向傳播算法的基礎,我們后面再來理解CNN的反向傳播算法就簡單多了。下一篇我們來討論CNN的反向傳播算法。