TensorFlow系列專題(十二):CNN最全原理剖析

一、 前言

卷積神經網絡(convolutional neural network,CNN)是一種專門用來處理網格結構數據(例如圖像數據)的前饋神經網絡,是由生物學家Hubel和Wiesel在早期關於貓腦視覺皮層的研究發展而來。Hubel和Wiesel通過對貓腦視覺皮層的研究,發現初級視覺皮層中的神經元會響應視覺環境中特定的特徵(稱之為感受野機制),他們注意到了兩種不同類型的細胞,簡單細胞和複雜細胞。其中,簡單細胞只對特定的空間位置和方向具有強烈的反應,而複雜細胞具有更大的接受域,其對於特徵位置的微小偏移具有不變性。

通過之前的介紹,我們瞭解到全連接神經網絡的工作原理。後一層中的每一個神經元的都和上一層的所有神經元之間有連接。雖然這種方式能夠最大程度地讓整個網絡中的神經元都接收到各個維度的信息,但是它的缺點也很明顯。首先,全連接網絡的參數較多,這會增加模型訓練的時間和難度,其次過多的參數會導致過擬合問題,使得模型的泛化能力不強。另外對於二維圖像數據來說,其所具有的局部不變性特徵對於全連接神經網絡來說是難以被提取到的。

卷積神經網絡一直是深度學習領域研究的核心,雖然早在上世紀90年代卷積神經網絡就已經有一些實際場景的應用,但是其之所以能得到大範圍的研究和使用,主要歸功於近些年所取得的巨大進展。一個重要的節點是Hinton和他的學生Alex Krizhevsky利用他們設計的AlexNet[1]網絡獲得了2012年ImageNet競賽的冠軍。他們把圖片分類的誤差從原來的26%降低到15%,這在計算機視覺領域引起了不小的轟動,也是在那年之後,更多更深的神經網路一一被提出。直到現在,深度卷積神經網絡已經發展成為計算機視覺領域中非常重要的一部分。

二、 卷積神經網絡的特性

圖像識別、分類是計算機視覺領域中比較常見的問題。對於計算機來說,一張圖片就是一個大小為M*N*3的像素矩陣(以三通道圖像為例),像素矩陣中每個像素的值在0到255之間。在給定這個像素矩陣作為輸入後,要計算輸出該圖像所屬的類別,這並不是一件十分簡單的事。

當我們人在看到一幅圖像時,首先都會關注圖像中比較突出的、信息量比較大的局部特徵,例如當我們看到一張寵物狗的圖片時,我們的目光一般首先會落在狗的臉部以及四條腿等部位,然後根據經驗,我們知道這是一張狗的圖片。卷積神經網絡借鑑了人類視覺系統的工作原理,卷積神經網絡首先通過尋找這副圖片的邊緣或者曲線等得到一些低級特徵,然後再通過一系列卷積層將這些低級的特徵匯聚成更加高級的特徵,由於這些高級的特徵是由多個低級特徵卷積構成,因此高級特徵能覆蓋原始圖片更多的信息。

卷積神經網絡主要有以下三大特性:

1. 局部連接

在第三章中,我們介紹的前饋神經網絡,其相鄰的兩層之間,前一層的每一個神經元(或者是輸入層的每一個單元)與後一層的每一個神經元都有連接,這種情況稱為全連接。全連接網絡的一個缺點就是參數太多,假設我們輸入到神經網絡中的是一張三通道的彩色圖像,圖像大小為128*128,因此輸入層就有128*128*3=49150個單元。使用全連接網絡的話,輸入層到第一層隱藏層的每一個神經元都有49150個連接,隨著網絡層數的增加和每一層中神經元數量的增加,網絡中的參數也會急劇增加。大量的參數不僅會拉低神經網絡訓練的效率,也很容易導致過擬合。

在卷積神經網絡中,層與層之間不再是全連接,而是局部連接,具體的實現方法就是我們在4.2節中會介紹的卷積操作。

2. 權值共享

在卷積神經網絡中,每一層卷積層中都會有一個或者多個卷積核(也稱為濾波器),這些卷積核可以識別圖像中某些特定的特徵,每個卷積核會去滑動卷積上一層的特徵圖,在卷積的過程中卷積核的參數是不變且共享的。這樣在訓練過程中,與之前的全連接神經網絡訓練大尺度輸入樣本時需要大量參數相比,卷積神經網絡只需要相對少很多的參數就可以完成訓練。

3. 子採樣

子採樣層(subsampling layer)也稱作池化層(pooling layer), 其作用是對上一卷積層進行聚合,使得上一層卷積層的輸入特徵圖尺寸在經過該子採樣層的聚合(也就是我們說的池化)後減小,從而降低特徵數量,減少參數的數量。子採樣層所做的事其實就是對上一層卷積層進行掃描,每次掃描特定區域,然後計算該區域特徵的最大值(最大池化(maximum pooling))或者平均值(平均池化(mean pooling)),作為該區域特徵的表示。

以上三個特徵使得卷積神經網絡具有一定程度上的縮放、平移和旋轉不變性,並且相較於全連接神經網絡,其網絡參數也少了很多。

三、 卷積層

1. 什麼是卷積

卷積(Convolution)是分析數學中一種重要的運算,有著非常廣泛的運用,在圖像處理中,常用的是二維卷積。以單通道的灰度圖像為例,對圖像進行卷積操作,就是使用一個卷積核(也稱濾波器,在本書中統一稱為卷積核)分別與圖像的同大小區域進行點乘,卷積核依次從左往右從上往下滑過該圖像的所有區域,點乘後得到的矩陣其各個位置上的值累加,作為卷積後圖像上的像素值。這種將圖像和卷積核進行按位點乘後求和的操作,就是卷積神經網絡中的卷積操作。

假定有一個圖像X,其大小為M*N,給定一個卷積核W,其大小為m*n,則卷積的公式可定義為:

TensorFlow系列專題(十二):CNN最全原理剖析

我們看一個簡單的例子,如圖1所示。我們有一張大小為5*5的圖像(單通道),X是其像素矩陣,矩陣W為卷積核,其大小為3*3,矩陣Y是卷積得到的結果,稱為特徵映射或特徵圖(feature map)。根據上式,我們可以計算y11的值為:

TensorFlow系列專題(十二):CNN最全原理剖析

TensorFlow系列專題(十二):CNN最全原理剖析

圖1 二維濾波器的卷積運算示例

需要說明的是,這裡我們所說的卷積實際上是互相關(cross-correlation)。兩者的區別在於,卷積的計算需要將卷積核進行翻轉(相當於旋轉180度),互相關也可以理解為不對卷積核進行翻轉的卷積。

這裡不需要對卷積核進行翻轉的原因是卷積核是否進行翻轉並不影響神經網絡對特徵的抽取,另外卷積神經網絡中的卷積核是需要學習的參數,因此卷積和互相關在這裡其實是等價的。由於互相關的計算更加簡便,所以目前我們在深度學習中都是使用互相關操作來替代卷積。

在圖像處理中,卷積是用來做特徵提取的一個有效方法。不同的卷積核可以用來檢測圖像中不同的特徵,以手寫數字識別為例,如圖2左側所示是一個手寫數字"1",右側是它的像素值。

TensorFlow系列專題(十二):CNN最全原理剖析

(左圖:手寫數字原始圖像;右圖:手寫數字的像素值)

現在我們要用卷積操作來提取這個數字的特徵,假設我們有如圖3所示的兩個卷積核。

TensorFlow系列專題(十二):CNN最全原理剖析

圖3用來識別手寫數字的兩個不同的卷積核a(左)和b(右)

如圖4所示,當我們用卷積核a對原始圖像做卷積操作時,根據前面介紹的卷積計算方式,其結果為:

TensorFlow系列專題(十二):CNN最全原理剖析

TensorFlow系列專題(十二):CNN最全原理剖析

圖4使用卷積核a對原始圖像做卷積操作 (左:原始圖像的像素表示;右:卷積核a)

我們再換用卷積核b對原始圖像進行卷積,如圖5所示。

TensorFlow系列專題(十二):CNN最全原理剖析

圖5使用卷積核b對原始圖像做卷積操作

卷積得到的結果為:

TensorFlow系列專題(十二):CNN最全原理剖析

從計算結果來看,卷積核a與原始圖像卷積計算得到的值要遠大於卷積核b。通過觀察也能發現,卷積核a的形狀與原始圖像的重合度較高,這也是卷積核提取圖像特徵的關鍵,如果圖像的某一區域與卷積核所能檢測的特徵很相似,那麼該區域就會激活卷積核,得到一個很高的值,反之,如果圖像的某一區域與卷積核所能檢測的特徵不相似,卷積操作之後,該區域的值就會相對較低。

如圖6所示是圖像處理中常用的幾種卷積核,圖中最上面的卷積核是高斯卷積核,其作用是對圖像進行平滑降噪處理,第二和第三個卷積核可以用來進行邊緣檢測。

TensorFlow系列專題(十二):CNN最全原理剖析

圖6圖像處理中的幾種濾波器示例(圖片引用自:https://nndl.github.io/)

(圖片引用自:https://nndl.github.io/)

現實中我們不可能針對每一種情況去設計一個卷積核,而卷積神經網絡的強大就在於它可以學習到需要的卷積核,卷積神經網絡通過從訓練數據中學習到所需的卷積核,從而實現圖像檢測、分類的任務。

在卷積神經網絡中,為了達到更靈活的特徵抽取,我們引入了卷積核的滑動步長(Stride)和零填充(Zero-padding)來增加捲積的多樣性。

卷積核的滑動步長是指卷積核在卷積操作中每次移動的距離,如圖7的上半部分所示是滑動步長為1時候的情況。如果將滑動步長設為2,則卷積核每次在橫向(或縱向)移動的距離就為2,如圖4-7的下半部分所示。

TensorFlow系列專題(十二):CNN最全原理剖析

TensorFlow系列專題(十二):CNN最全原理剖析

圖7滑動步長分別為1(上)和2(下)的卷積過程示例

(本小節圖片均引用自:Dumoulin V , Visin F .

A guide to convolution arithmetic for deep learning[J]. 2016.)

零填充是指在輸入矩陣的四周填充零,如圖8所示在輸入矩陣的周圍填充了寬度為2的零。

TensorFlow系列專題(十二):CNN最全原理剖析

圖8寬度為2的零填充示例

在卷積神經網絡中,按照不同的零填充的方式可以劃分為不同的卷積,如下是三種較為常用的卷積(假設輸入矩陣的大小為m*m,卷積核的大小為n*n,滑動步長為s,零填充的寬度為p。):

1)窄卷積(narrow convolution):圖7上半部分所示的情況就是窄卷積,其中滑動步長s=1,不進行零填充,卷積後輸出的特徵圖大小為(m-n+1)*(m-n+1)。

2)寬卷積(wide convolution):圖9所示是寬卷積的示例,其中滑動步長s=1,零填充的寬度為p=n-1,卷積後輸出的特徵圖大小為(m+n-1)*(m+n-1)。

3)等寬卷積(equal-width convolution):圖10所示是等寬卷積的示例,其中滑動步長s=1,零填充的寬度為p=(n-1)/2,卷積後輸出的特徵圖大小為m*m,等寬卷積得到的特徵圖和輸入的原圖大小一致。

TensorFlow系列專題(十二):CNN最全原理剖析

圖9寬卷積示例

TensorFlow系列專題(十二):CNN最全原理剖析

圖10等寬卷積示例

四、 總結

由於卷積神經網絡內容篇幅較大,故在此將卷積神經網絡內容拆分為三部分,首先本篇幅介紹了卷積神經網絡的發展,卷積神經網絡模型的特性以及卷積層的特點。下一部分將介紹卷積層的結構和池化層的結構。最後將結合代碼以一個實際比賽冰山雷達波圖像識別結尾。

五、 參考文獻

[1]Alex Krizhevsky: ImageNet Classification with Deep Convolutional Neural Networks .NIPS 2012


分享到:


相關文章: