1. 程式人生 > >機器學習13:卷積神經網路(CNN)

機器學習13:卷積神經網路(CNN)

一、Why CNN for Image?

1、對於一幅影象來說,用DNN全連線的話,引數會很多,而影象實際上是有很多冗餘的,有些地方的特徵可能不需要。而CNN其實是拿掉了DNN的一些引數。

2、識別工作中,有時候並不需要看整張圖,而只需要看部分位置如鳥嘴。不管鳥嘴出現在影象的哪個位置,只要用相同的神經元引數偵測到這個鳥嘴的存在,就可以判斷這是一隻鳥,因此,不同位置的鳥嘴的神經元可以共用同一組引數。

3、對於影象識別來說,通常下采樣並不會影響你對影象中的物體進行識別,因此可以通過下采樣將圖片變小,從而減少引數:

二、CNN結構

影象識別的三個特徵:1、某個重要特徵只佔影象的一小部分;2、同一個特徵可能出現在不同的區域,而他們可以共用引數;3、下采樣一般不會影響影象識別。特徵1、2可以有卷積層處理,特徵3由maxpooling處理。

三、卷積層操作

其實就是卷積核滑窗進行濾波,檢測各個位置是否存在跟卷積核具有相同特點的部分。當具有相同特點時,當前位置輸出值一般較大,例如圖中左上角和左下角的3.一個filter滑窗檢測下來得到4*4的矩陣。選擇不同的filter重複操作得到多個4*4矩陣。

CNN的卷積層實際上是將DNN的一層拿掉部分weight之後的結果。使得能夠用較少的引數獲得好的效果。

如圖所示,對於每一次卷積,影象的9個畫素作為輸入,卷積核相當於weight,然後輸出到一個神經元“3”,這裡,“3”這個神經元只與第一層的9個神經元連線,權重直接由卷積核決定。以此類推,每移動一次卷積核,另外九個畫素與另外一個神經元連線

對於同一個卷積核滑窗連線到的神經元,它們的weight都相同(稱為共享weight,因為weight就是卷積核)。

四、Max Pooling層操作

Max Pooling比較簡單,就是將卷積層的輸出按均勻大小進行分塊,每塊取最大值組成新的矩陣,進一步將矩陣變小。

最終,例子中的6*6的影象輸出得到2*2的影象,但是,由於採用不同的filter,每個fitler都輸出一個2*2的影象,設有n個filter,則得到n維2*2的影象。可以認為有n個通道。

五、Flatten

將輸出得到的n維矩陣進行拉直得到一個列矩陣,輸入到全連線層。其實就是把每個畫素當作一個神經元進行輸入。

六、訓練示例

1、對於一幅圖片,如果圖片是灰度的(如手寫數字),圖片尺寸是28*28,那麼輸入型別就是input_shape=(1,28,28);如果是RGB影象,則影象輸入包含三個通道,為input_shape=(3,28,28).

2、第一層卷積中,Convolution2D的前三個引數為25,3,3,表示使用了25個filter(卷積核),卷積核的大小是3*3,那麼每一個卷積核就有9個引數,25個核總共有225個引數。

3、對於第一層卷積的輸出,得到25個26*26的圖片,即每個filter輸出一個一幅圖,這裡圖片的個數我們也稱為深度。

4、通過池化操作,得到25*13*13,即25個13*13的圖片。

5、再進行第二層卷積操作,這個時候,卷積核是個立體的,每幅圖片都有一個3*3的卷積核,那麼每次卷積操作都包含25*3*3=225個引數。圖中第二層卷積使用了50個卷積核,那麼總共下來的引數是50*25*3*3=11250個引數。說直接點,就是對第一層輸出的25張圖片的每一張都進行了50*3*3的卷積操作,那麼25張圖片都操作一次引數也是25*50*3*3.第二層卷積之後的輸出是25*50個11*11的圖片(PS:感覺ppt中的輸出存在問題,如果是50*11*11,那麼應該是50個立體的11*11,立體的深度是25)

七、CNN學習到什麼?

1、卷積層學習

學習過程中,對於每個filter,將其輸出的矩陣元素相加,使其最大化,那麼就算出了filter的引數。

下圖是採用上述方法得到的一組filter,表示的是原始影象出現filter影象特徵的地方比較多。

2、full connect層學習

最大化該層的輸出和,得到圖中的一些特徵圖。代表的是全連線層學習到的特徵。

3、輸出層

同樣最大化每一個neural的輸出值,得到如圖的輸出圖,顯然,人眼看不出圖片是手寫數字,極有可能隨便拿一張圖,網路就給判斷成某個數字了。

輸出的影象與實際數字完全不符合,這裡,我們利用實際影象的已知資訊,加入正則化項,如:手寫數字佔整個影象的畫素較小,那麼可以減去畫素值,表示求得輸出資訊最大化的同時,畫素值最小化(使得畫素值較小)。如圖所示。