卷積神經網絡(CNN)模型結構

    在前面咱們講述了DNN的模型與前向反向傳播算法。而在DNN大類中,卷積神經網絡(Convolutional Neural Networks,如下簡稱CNN)是最爲成功的DNN特例之一。CNN普遍的應用於圖像識別,固然如今也應用於NLP等其餘領域,本文咱們就對CNN的模型結構作一個總結。html

    在學習CNN前,推薦你們先學習DNN的知識。若是不熟悉DNN而去直接學習CNN,難度會比較的大。這是我寫的DNN的教程:git

深度神經網絡(DNN)模型與前向傳播算法github

深度神經網絡(DNN)反向傳播算法(BP)算法

深度神經網絡(DNN)損失函數和激活函數的選擇網絡

深度神經網絡(DNN)的正則化函數

1. CNN的基本結構

    首先咱們來看看CNN的基本結構。一個常見的CNN例子以下圖:post

    圖中是一個圖形識別的CNN模型。能夠看出最左邊的船的圖像就是咱們的輸入層,計算機理解爲輸入若干個矩陣,這點和DNN基本相同。學習

    接着是卷積層(Convolution Layer),這個是CNN特有的,咱們後面專門來說。卷積層的激活函數使用的是ReLU。咱們在DNN中介紹過ReLU的激活函數,它其實很簡單,就是$ReLU(x) = max(0,x)$。在卷積層後面是池化層(Pooling layer),這個也是CNN特有的,咱們後面也會專門來說。須要注意的是,池化層沒有激活函數。htm

    卷積層+池化層的組合能夠在隱藏層出現不少次,上圖中出現兩次。而實際上這個次數是根據模型的須要而來的。固然咱們也能夠靈活使用使用卷積層+卷積層,或者卷積層+卷積層+池化層的組合,這些在構建模型的時候沒有限制。可是最多見的CNN都是若干卷積層+池化層的組合,如上圖中的CNN結構。blog

    在若干卷積層+池化層後面是全鏈接層(Fully Connected Layer, 簡稱FC),全鏈接層其實就是咱們前面講的DNN結構,只是輸出層使用了Softmax激活函數來作圖像識別的分類,這點咱們在DNN中也有講述。

    從上面CNN的模型描述能夠看出,CNN相對於DNN,比較特殊的是卷積層和池化層,若是咱們熟悉DNN,只要把卷積層和池化層的原理搞清楚了,那麼搞清楚CNN就容易不少了。

2. 初識卷積

    首先,咱們去學習卷積層的模型原理,在學習卷積層的模型原理前,咱們須要瞭解什麼是卷積,以及CNN中的卷積是什麼樣子的。

    你們學習數學時都有學過卷積的知識,微積分中卷積的表達式爲:$$S(t) = \int x(t-a)w(a) da$$

    離散形式是:$$s(t) = \sum\limits_ax(t-a)w(a)$$

    這個式子若是用矩陣表示能夠爲:$$s(t)=(X*W)(t)$$

    其中星號表示卷積。

    若是是二維的卷積,則表示式爲:$$s(i,j)=(X*W)(i,j) = \sum\limits_m \sum\limits_n x(i-m,j-n) w(m,n)$$

    在CNN中,雖然咱們也是說卷積,可是咱們的卷積公式和嚴格意義數學中的定義稍有不一樣,好比對於二維的卷積,定義爲:$$s(i,j)=(X*W)(i,j) = \sum\limits_m \sum\limits_n x(i+m,j+n) w(m,n)$$

    這個式子雖然從數學上講不是嚴格意義上的卷積,可是大牛們都這麼叫了,那麼咱們也跟着這麼叫了。後面講的CNN的卷積都是指的上面的最後一個式子。

    其中,咱們叫W爲咱們的卷積核,而X則爲咱們的輸入。若是X是一個二維輸入的矩陣,而W也是一個二維的矩陣。可是若是X是多維張量,那麼W也是一個多維的張量。

3. CNN中的卷積層

    有了卷積的基本知識,咱們如今來看看CNN中的卷積,假如是對圖像卷積,回想咱們的上一節的卷積公式,其實就是對輸入的圖像的不一樣局部的矩陣和卷積核矩陣各個位置的元素相乘,而後相加獲得。

    舉個例子以下,圖中的輸入是一個二維的3x4的矩陣,而卷積核是一個2x2的矩陣。這裏咱們假設卷積是一次移動一個像素來卷積的,那麼首先咱們對輸入的左上角2x2局部和卷積核卷積,即各個位置的元素相乘再相加,獲得的輸出矩陣S的$S_{00}$的元素,值爲$aw+bx+ey+fz$。接着咱們將輸入的局部向右平移一個像素,如今是(b,c,f,g)四個元素構成的矩陣和卷積核來卷積,這樣咱們獲得了輸出矩陣S的$S_{01}$的元素,一樣的方法,咱們能夠獲得輸出矩陣S的$S_{02},S_{10},S_{11}, S_{12}$的元素。

     最終咱們獲得卷積輸出的矩陣爲一個2x3的矩陣S。

    再舉一個動態的卷積過程的例子以下:

    咱們有下面這個綠色的5x5輸入矩陣,卷積核是一個下面這個黃色的3x3的矩陣。卷積的步幅是一個像素。則卷積的過程以下面的動圖。卷積的結果是一個3x3的矩陣。

    上面舉的例子都是二維的輸入,卷積的過程比較簡單,那麼若是輸入是多維的呢?好比在前面一組卷積層+池化層的輸出是3個矩陣,這3個矩陣做爲輸入呢,那麼咱們怎麼去卷積呢?又好比輸入的是對應RGB的彩色圖像,便是三個分佈對應R,G和B的矩陣呢?

     在斯坦福大學的cs231n的課程上,有一個動態的例子,連接在這。建議你們對照着例子中的動圖看下面的講解。

    你們打開這個例子能夠看到,這裏面輸入是3個7x7的矩陣。實際上原輸入是3個5x5的矩陣。只是在原來的輸入周圍加上了1的padding,即將周圍都填充一圈的0,變成了3個7x7的矩陣。
    例子裏面使用了兩個卷積核,咱們先關注於卷積核W0。和上面的例子相比,因爲輸入是3個7x7的矩陣,或者說是7x7x3的張量,則咱們對應的卷積核W0也必須最後一維是3的張量,這裏卷積核W0的單個子矩陣維度爲3x3。那麼卷積核W0其實是一個3x3x3的張量。同時和上面的例子比,這裏的步幅爲2,也就是每次卷積後會移動2個像素的位置。
    最終的卷積過程和上面的2維矩陣相似,上面是矩陣的卷積,即兩個矩陣對應位置的元素相乘後相加。這裏是張量的卷積,即兩個張量的3個子矩陣卷積後,再把卷積的結果相加後再加上偏倚b。
    7x7x3的張量和3x3x3的卷積核張量W0卷積的結果是一個3x3的矩陣。因爲咱們有兩個卷積核W0和W1,所以最後卷積的結果是兩個3x3的矩陣。或者說卷積的結果是一個3x3x2的張量。
    仔細回味下卷積的過程,輸入是7x7x3的張量,卷積核是兩個3x3x3的張量。卷積步幅爲2,最後獲得了輸出是3x3x2的張量。若是把上面的卷積過程用數學公式表達出來就是:$$s(i,j)=(X*W)(i,j) + b = \sum\limits_{k=1}^{n\_in}(X_k*W_k)(i,j) +b$$
    其中,$n\_in$爲輸入矩陣的個數,或者是張量的最後一維的維數。$X_k$表明第k個輸入矩陣。$W_k$表明卷積核的第k個子卷積核矩陣。$s(i,j)$即卷積核$W$對應的輸出矩陣的對應位置元素的值。
    經過上面的例子,相信你們對CNN的卷積層的卷積過程有了必定的瞭解。
    對於卷積後的輸出,通常會經過ReLU激活函數,將輸出的張量中的小於0的位置對應的元素值都變爲0。

4. CNN中的池化層

    相比卷積層的複雜,池化層則要簡單的多,所謂的池化,我的理解就是對輸入張量的各個子矩陣進行壓縮。假如是2x2的池化,那麼就將子矩陣的每2x2個元素變成一個元素,若是是3x3的池化,那麼就將子矩陣的每3x3個元素變成一個元素,這樣輸入矩陣的維度就變小了。
    要想將輸入子矩陣的每nxn個元素變成一個元素,那麼須要一個池化標準。常見的池化標準有2個,MAX或者是Average。即取對應區域的最大值或者平均值做爲池化後的元素值。
    下面這個例子採用取最大值的池化方法。同時採用的是2x2的池化。步幅爲2。
    首先對紅色2x2區域進行池化,因爲此2x2區域的最大值爲6.那麼對應的池化輸出位置的值爲6,因爲步幅爲2,此時移動到綠色的位置去進行池化,輸出的最大值爲8.一樣的方法,能夠獲得黃色區域和藍色區域的輸出值。最終,咱們的輸入4x4的矩陣在池化後變成了2x2的矩陣。進行了壓縮。
 

5. CNN模型結構小結

    理解了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

相關文章
相關標籤/搜索