1. 程式人生 > >乾貨 | 深度學習之卷積神經網路(CNN)的模型結構

乾貨 | 深度學習之卷積神經網路(CNN)的模型結構

微信公眾號

關鍵字全網搜尋最新排名

【機器學習演算法】:排名第一

【機器學習】:排名第一

【Python】:排名第三

【演算法】:排名第四

前言

在前面我們講述了DNN的模型與前向反向傳播演算法。而在DNN大類中,卷積神經網路(Convolutional Neural Networks,以下簡稱CNN)是最為成功的DNN特例之一。CNN廣泛的應用於影象識別,當然現在也應用於NLP等其他領域,本文我們就對CNN的模型結構做一個總結。

在學習CNN前,推薦大家先學習DNN的知識。可以檢視之前的文章

CNN的基本結構

一個常見的CNN例子如下圖:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

上圖是一個圖形識別的CNN模型。可以看出最左邊的影象就是我們的輸入層,計算機理解為輸入若干個矩陣,

這點和DNN基本相同。

接著是卷積層(Convolution Layer),這個是CNN特有的,我們後面專門來講。卷積層的啟用函式使用的是ReLU。我們在DNN中介紹過ReLU的啟用函式,它其實很簡單,就是ReLU(x)=max(0,x)。在卷積層後面是池化層(Pooling layer),這個也是CNN特有的,我們後面也會專門來講。需要注意的是,池化層沒有啟用函式。

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

在若干卷積層+池化層後面是全連線層(Fully Connected Layer, 簡稱FC),全連線層其實就是我們前面講的DNN結構,只是輸出層使用了Softmax啟用函式來做影象識別的分類,這點我們在DNN中也有講述。

從上面CNN的模型描述可以看出,CNN相對於DNN,比較特殊的是卷積層和池化層,如果我們熟悉DNN,只要把卷積層和池化層的原理搞清楚了,那麼搞清楚CNN就容易很多了。

初識卷積

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

大家學習數學時都有學過卷積的知識,微積分中卷積的表示式為:

0?wx_fmt=png

離散形式為:

0?wx_fmt=png

矩陣形式為:

0?wx_fmt=png

如果是二維的卷積,則表示式為:

0?wx_fmt=png

在CNN中,雖然我們也是說卷積,但是我們的卷積公式和嚴格意義數學中的定義稍有不同,比如對於二維的卷積,定義為:

0?wx_fmt=png

這個式子雖然從數學上講不是嚴格意義上的卷積,但是大牛們都這麼叫了,那麼我們也跟著這麼叫了。後面講的CNN的卷積都是指的上面的最後一個式子。其中,我們叫W為我們的卷積核,而X則為我們的輸入。如果X是一個二維輸入的矩陣,而W也是一個二維的矩陣。但是如果X是多維張量,那麼W也是一個多維的張量。

CNN的卷積層

有了卷積的基本知識,我們現在來看看CNN中的卷積,假如是對影象卷積,回想我們的上一節的卷積公式,其實就是對輸出的影象的不同區域性的矩陣和卷積核矩陣各個位置的元素相乘,然後相加得到。

舉個例子如下:圖中的輸入是一個二維的3x4的矩陣,而卷積核是一個2x2的矩陣。這裡我們假設卷積是一次移動一個畫素來卷積的,那麼首先我們對輸入的左上角2x2區域性和卷積核卷積,即各個位置的元素相乘再相加,得到的輸出矩陣S的S00的元素,值為aw+bx+ey+fz。接著我們將輸入的區域性向右平移一個畫素,現在是(b,c,f,g)四個元素構成的矩陣和卷積核來卷積,這樣我們得到了輸出矩陣S的S01的元素,同樣的方法,我們可以得到輸出矩陣S的S02,S10,S11,S12的元素。

0?wx_fmt=png

最終我們得到卷積輸出的矩陣為一個2x3的矩陣S。

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

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

0?wx_fmt=png 0?wx_fmt=png0?wx_fmt=gif

上面舉的例子都是二維的輸入,卷積的過程比較簡單,那麼如果輸入是多維的呢?比如在前面一組卷積層+池化層的輸出是3個矩陣,這3個矩陣作為輸入呢,那麼我們怎麼去卷積呢?又比如輸入的是對應RGB的彩色影象,即是三個分佈對應R,G和B的矩陣呢?

在斯坦福大學的cs231n的課程上,有一個動態的例子,連結在這。

http://cs231n.github.io/assets/conv-demo/index.html

CNN的池化層

相比卷積層的複雜,池化層則要簡單的多,所謂的池化,個人理解就是對輸入張量的各個子矩陣進行壓縮。假如是2x2的池化,那麼就將子矩陣的每2x2個元素變成一個元素,如果是3x3的池化,那麼就將子矩陣的每3x3個元素變成一個元素,這樣輸入矩陣的維度就變小了。

要想將輸入子矩陣的每nxn個元素變成一個元素,那麼需要一個池化標準。常見的池化標準有2個,MAX或者是Average。即取對應區域的最大值或者平均值作為池化後的元素值。

下面這個例子採用取最大值的池化方法。同時採用的是2x2的池化。步幅為2。

首先對紅色2x2區域進行池化,由於此2x2區域的最大值為6.那麼對應的池化輸出位置的值為6,由於步幅為2,此時移動到綠色的位置去進行池化,輸出的最大值為8.同樣的方法,可以得到黃色區域和藍色區域的輸出值。最終,我們的輸入4x4的矩陣在池化後變成了2x2的矩陣。進行了壓縮。

0?wx_fmt=png

小結

理解了CNN模型中的卷積層和池化層,就基本理解了CNN的基本原理,後面再去理解CNN模型的前向傳播演算法和反向傳播演算法就容易了。

歡迎分享給他人讓更多的人受益

0?wx_fmt=png

參考:

  1. 周志華《機器學習》

  2. Neural Networks and Deep Learning by By Michael Nielsen

  3. 部落格園

    http://www.cnblogs.com/pinard/p/6140514.html

  4. 李航《統計學習方法》

0?wx_fmt=png

加我微信:guodongwe1991,備註姓名-單位-研究方向(加入微信機器學習交流1群)

招募 志願者

廣告、商業合作

請加QQ:[email protected]

0?wx_fmt=jpeg

喜歡,別忘關注~

幫助你在AI領域更好的發展,期待與你相遇!