當前位置:
首頁 > 知識 > 直白介紹卷積神經網路(CNN)

直白介紹卷積神經網路(CNN)


(點擊

上方公眾號

,可快速關注)





編譯: Python開發者 - 

 

MentosZ  英文:ujjwalkarn.me


http://blog.jobbole.com/113819/




什麼是卷積神經網路,它為何重要?


卷積神經網路(也稱作 

ConvNets

 或 

CNN

)是

神經網路

的一種,它在圖像識別和分類等領域已被證明非常有效。 卷積神經網路除了為機器人和自動駕駛汽車的視覺助力之外,還可以成功識別人臉,物體和交通標誌。





圖1


圖1

所示,卷積神經網路能夠識別圖片的場景並且提供相關標題(「足球運動員正在踢足球」),

圖2

則是利用卷積神經網路識別日常物品、人類和動物的例子。最近,卷積神經網路在一些自然語言處理任務(如語句分類)中也發揮了很大作用。



圖2


因此,卷積神經網路是當今大多數機器學習實踐者的重要工具。但是,理解卷積神經網路並開始嘗試運用著實是一個痛苦的過程。本文的主要目的是了解卷積神經網路如何處理圖像。


對於剛接觸神經網路的人,我建議大家先閱讀這篇

關於多層感知機的簡短教程

 ,了解其工作原理之後再繼續閱讀本文。多層感知機即本文中的「完全連接層」。


LeNet 框架(20世紀90年代)


LeNet 是最早推動深度學習領域發展的卷積神經網路之一。這項由 Yann LeCun 完成的開創性工作自1988年以來多次成功迭代之後被命名為 

LeNet5

。當時 LeNet 框架主要用於字元識別任務,例如閱讀郵政編碼,數字等。


接下來,我們將直觀地了解 LeNet 框架如何學習識別圖像。 近年來有人提出了幾種基於 LeNet 改進的新框架,但是它們的基本思路與 LeNet 並無差別,如果您清楚地理解了 LeNet,那麼對這些新的框架理解起來就相對容易很多。



圖3: 一個簡單的卷積神經網路


3

中的卷積神經網路在結構上與原始的 LeNet 類似,並將輸入圖像分為四類:狗,貓,船或鳥(原始的 LeNet 主要用於字元識別任務)。 從上圖可以看出,接收船隻圖像作為輸入時,神經網路在四個類別中正確地給船隻分配了最高概率值(0.94)。輸出層中所有概率的總和應該是1(之後會做解釋)。


的卷積神經網路中有四個主要操作:




  1. 卷積



  2. 非線性變換(ReLU)



  3. 池化或子採樣



  4. 分類(完全連接層)


這些操作是所有卷積神經網路的基本組成部分,因此了解它們的工作原理是理解卷積神經網路的重要步驟。下面我們將嘗試直觀地理解每個操作。


一張圖片就是一個由像素值組成的矩陣


實質上,每張圖片都可以表示為由像素值組成的矩陣。


圖4: 每張圖片就是一個像素矩陣


通道

(channel)是一個傳統術語,指圖像的一個特定成分。標準數碼相機拍攝的照片具有三個通道——紅,綠和藍——你可以將它們想像為三個堆疊在一起的二維矩陣(每種顏色一個),每個矩陣的像素值都在0到255之間。


灰度

圖像只有一個通道。 鑒於本文的科普目的,我們只考慮灰度圖像,即一個代表圖像的二維矩陣。矩陣中每個像素值的範圍在0到255之間——0表示黑色,255表示白色。

卷積


卷積神經網路的名字來源於

「卷積」運算

。在卷積神經網路中,卷積的主要目的是從輸入圖像中提取特徵。通過使用輸入數據中的小方塊來學習圖像特徵,卷積保留了像素間的空間關係。我們在這裡不會介紹卷積的數學推導,但會嘗試理解它是如何處理圖像的。


正如前文所說,每個圖像可以被看做像素值矩陣。考慮一個像素值僅為0和1的5 × 5大小的圖像(注意,對於灰度圖像,像素值範圍從0到255,下面的綠色矩陣是像素值僅為0和1的特殊情況):



另外,考慮另一個 3×3 矩陣,如下圖所示:



上述5 x 5圖像和3 x 3矩陣的卷積計算過程如

5

中的動畫所示:



圖5:卷積操作。輸出矩陣稱作「卷積特徵」或「特徵映射」


我們來花點時間理解一下上述計算是如何完成的。將橙色矩陣在原始圖像(綠色)上以每次1個像素的速率(也稱為「步幅」)移動,對於每個位置,計算兩個矩陣相對元素的乘積並相加,輸出一個整數並作為最終輸出矩陣(粉色)的一個元素。注意,3 × 3矩陣每個步幅僅能「看到」輸入圖像的一部分。


在卷積神經網路的術語中,這個3 × 3矩陣被稱為「

過濾器

」或「核」或「特徵探測器」,通過在圖像上移動過濾器並計算點積得到的矩陣被稱為「卷積特徵」或「激活映射」或「

特徵映射

」。重要的是要注意,過濾器的作用就是原始輸入圖像的特徵檢測器。


從上面的動畫可以明顯看出,對於同一張輸入圖像,不同的過濾器矩陣將會產生不同的特徵映射。例如,考慮如下輸入圖像:



在下表中,我們可以看到上圖在不同過濾器下卷積的效果。如圖所示,只需在卷積運算前改變過濾器矩陣的數值就可以執行邊緣檢測,銳化和模糊等不同操作 [

8

] —— 這意味著不同的過濾器可以檢測圖像的不同特徵,例如邊緣, 曲線等。更多此類示例可在 

這裡

 8.2.4節中找到。



另一個理解卷積操作的好方法可以參考下面

6

中的動畫:




圖6: 卷積操作


一個過濾器(紅色邊框)在輸入圖像上移動(卷積操作)以生成特徵映射。在同一張圖像上,另一個過濾器(綠色邊框)的卷積生成了不同的特徵圖,如圖所示。需要注意到,卷積操作捕獲原始圖像中的局部依賴關係很重要。還要注意這兩個不同的過濾器如何從同一張原始圖像得到不同的特徵圖。請記住,以上圖像和兩個過濾器只是數值矩陣。


實際上,卷積神經網路在訓練過程中會自己學習這些過濾器的值(儘管在訓練過程之前我們仍需要指定諸如過濾器數目、大小,網路框架等參數)。我們擁有的過濾器數目越多,提取的圖像特徵就越多,我們的網路在識別新圖像時效果就會越好。


特徵映射(卷積特徵)的大小由我們在執行卷積步驟之前需要決定的三個參數[

4

]控制:




  • 深度:

    深度對應於我們用於卷積運算的過濾器數量。在

    7

    所示的網路中,我們使用三個不同的過濾器對初始的船圖像進行卷積,從而生成三個不同的特徵圖。可以將這三個特徵地圖視為堆疊的二維矩陣,因此,特徵映射的「深度」為3。



圖7




  • 步幅:

    步幅是我們在輸入矩陣上移動一次過濾器矩陣的像素數量。當步幅為1時,我們一次將過濾器移動1個像素。當步幅為2時,過濾器每次移動2個像素。步幅越大,生成的特徵映射越小。



  • 零填充:

    有時,將輸入矩陣邊界用零來填充會很方便,這樣我們可以將過濾器應用於輸入圖像矩陣的邊界元素。零填充一個很好的特性是它允許我們控制特徵映射的大小。添加零填充也稱為寬卷積,而不使用零填充是為窄卷積。 這在[

    14

    ]中有清楚的解釋。


非線性部分介紹(ReLU)


如上文

3

所示,每次卷積之後,都進行了另一項稱為 ReLU 的操作。ReLU 全稱為修正線性單元(Rectified Linear Units),是一種非線性操作。 其輸出如下圖所示:



圖8: ReLU 函數


ReLU 是一個針對元素的操作(應用於每個像素),並將特徵映射中的所有負像素值替換為零。ReLU 的目的是在卷積神經網路中引入非線性因素,因為在實際生活中我們想要用神經網路學習的數據大多數都是非線性的(卷積是一個線性運算 —— 按元素進行矩陣乘法和加法,所以我們希望通過引入 ReLU 這樣的非線性函數來解決非線性問題)。


9

可以很清楚地理解 ReLU 操作。它展示了將 ReLU 作用於

6

中某個特徵映射得到的結果。這裡的輸出特徵映射也被稱為「修正」特徵映射。



圖9: ReLU 操作


其他非線性函數諸如 

tanh

 或 

sigmoid

 也可以用來代替 ReLU,但是在大多數情況下,ReLU 的表現更好。


池化


空間池化(也稱為子採樣或下採樣)可降低每個特徵映射的維度,並保留最重要的信息。空間池化有幾種不同的方式:最大值,平均值,求和等。


在最大池化的情況下,我們定義一個空間鄰域(例如,一個2 × 2窗口),並取修正特徵映射在該窗口內最大的元素。當然我們也可以取該窗口內所有元素的平均值(平均池化)或所有元素的總和。在實際運用中,最大池化的表現更好。


10

展示了通過2 × 2窗口在修正特徵映射(卷積+ ReLU 操作後得到)上應用最大池化操作的示例。



圖10: 最大池化


我們將2 x 2窗口移動2個單元格(也稱為「步幅」),並取每個區域中的最大值。如

10

所示,這樣就降低了特徵映射的維度。


11

所示的網路中,池化操作分別應用於每個特徵映射(因此,我們從三個輸入映射中得到了三個輸出映射)。



圖11: 在修正特徵映射上應用池化


12

展示了我們對

9

中經過 ReLU 操作之後得到的修正特徵映射應用池化之後的效果。



圖12: 池化


池化的作用是逐步減少輸入的空間大小[

4

]。具體來說有以下四點:




  • 使輸入(特徵維度)更小,更易於管理



  • 減少網路中的參數和運算次數,因此可以控制

    過擬合

     [

    4

    ]



  • 使網路對輸入圖像微小的變換、失真和平移更加穩健(輸入圖片小幅度的失真不會改池化的輸出結果 —— 因為我們取了鄰域的最大值/平均值)。



  • 可以得到尺度幾乎不變的圖像(確切的術語是「等變」)。這是非常有用的,這樣無論圖片中的物體位於何處,我們都可以檢測到,(詳情參閱[

    18

    ]和[

    19

    ])。


至此…



圖13


目前為止,我們已經了解了卷積,ReLU 和池化的工作原理。這些是卷積神經網路的基本組成部分,理解這一點很重要。如

13

所示,我們有兩個由卷積,ReLU 和 Pooling 組成的中間層 —— 第二個卷積層使用六個過濾器對第一層的輸出執行卷積,生成六個特徵映射。然後將 ReLU 分別應用於這六個特徵映射。接著,我們對六個修正特徵映射分別執行最大池化操作。


這兩個中間層的作用都是從圖像中提取有用的特徵,在網路中引入非線性因素,同時對特徵降維並使其在尺度和平移上等變[

18

]。


第二個池化層的輸出即完全連接層的輸入,我們將在下一節討論。


完全連接層


完全連接層是一個傳統的多層感知器,它在輸出層使用 softmax 激活函數(也可以使用其他分類器,比如 SVM,但在本文只用到了 softmax)。「完全連接」這個術語意味著前一層中的每個神經元都連接到下一層的每個神經元。 如果對多層感知器不甚了解,我建議您閱讀

這篇文章


卷積層和池化層的輸出代表了輸入圖像的高級特徵。完全連接層的目的是利用這些基於訓練數據集得到的特徵,將輸入圖像分為不同的類。例如,我們要執行的圖像分類任務有四個可能的輸出,如

14

所示(請注意,圖14沒有展示出完全連接層中節點之間的連接)



圖14: 完全連接層——每個節點都與相鄰層的其他節點連接


除分類之外,添加完全連接層也是一個(通常來說)比較簡單的學習這些特徵非線性組合的方式。卷積層和池化層得到的大部分特徵對分類的效果可能也不錯,但這些特徵的組合可能會更好[

11

]。


完全連接層的輸出概率之和為1。這是因為我們在完全連接層的輸出層使用了 softmax 激活函數。Softmax 函數取任意實數向量作為輸入,並將其壓縮到數值在0到1之間,總和為1的向量。


正式開始——使用反向傳播進行訓練


如上所述,卷積+池化層用來從輸入圖像提取特徵,完全連接層用來做分類器。


注意,在

15

中,由於輸入圖像是船,對於船類目標概率為1,其他三個類為0




  • 輸入圖像 = 船



  • 目標向量 = [0, 0, 1, 0]



圖15:訓練卷積神經網路


卷積網路的整體訓練過程概括如下:




  • 步驟1:用隨機值初始化所有過濾器和參數/權重



  • 步驟2:神經網路將訓練圖像作為輸入,經過前向傳播步驟(卷積,ReLU 和池化操作以在完全連接層中的前向傳播),得到每個類的輸出概率。



  • 假設上面船隻圖像的輸出概率是 [0.2,0.4,0.1,0.3]



  • 由於權重是隨機分配給第一個訓練樣本,因此輸出概率也是隨機的。



  • 步驟3:計算輸出層的總誤差(對所有4個類進行求和)



  • 總誤差

    =∑ ?(目標概率 – 輸出概率)2



  • 步驟4:使用反向傳播計算網路中所有權重的誤差梯度,並使用梯度下降更新所有過濾器值/權重和參數值,以最小化輸出誤差。



  • 根據權重對總誤差的貢獻對其進行調整。



  • 當再次輸入相同的圖像時,輸出概率可能就變成了 [0.1,0.1,0.7,0.1],這更接近目標向量 [0,0,1,0]。



  • 這意味著網路已經學會了如何通過調整其權重/過濾器並減少輸出誤差的方式對特定圖像進行正確分類。



  • 過濾器數量、大小,網路結構等參數在步驟1之前都已經固定,並且在訓練過程中不會改變 —— 只會更新濾器矩陣和連接權值。



  • 步驟5:對訓練集中的所有圖像重複步驟2-4。


 


通過以上步驟就可以訓練出卷積神經網路 —— 這實際上意味著卷積神經網路中的所有權重和參數都已經過優化,可以對訓練集中的圖像進行正確分類。


當我們給卷積神經網路中輸入一個新的(未見過的)圖像時,網路會執行前向傳播步驟並輸出每個類的概率(對於新圖像,計算輸出概率所用的權重是之前優化過,並能夠對訓練集完全正確分類的)。如果我們的訓練集足夠大,神經網路會有很好的泛化能力(但願如此)並將新圖片分到正確的類里。


注1

為了給大家提供一個直觀的訓練過程,上述步驟已經簡化了很多,並且忽略了數學推導過程。如果想要數學推導以及對卷積神經網路透徹的理解,請參閱 [

4

] 和 [

12

]。


2

上面的例子中,我們使用了兩組交替的卷積和池化層。但請注意,這些操作可以在一個卷積神經網路中重複執行多次。實際上,現在效果最好的一些卷積神經網路都包含幾十個卷積和池化層! 另外,每個卷積層之後的池化層不是必需的。從下面的

16

中可以看出,在進行池化操作之前,我們可以連續進行多個卷積 + ReLU 操作。另外請注意圖16卷積神經網路的每一層是如何展示的。



圖16


卷積神經網路的可視化


一般來說,卷積步驟越多,神經網路能夠學習識別的特徵就更複雜。例如,在圖像分類中,卷積神經網路在第一層可能會學習檢測原始像素的邊緣,然後在第二層利用這些邊緣檢測簡單形狀,然後在更高級的層用這些形狀來檢測高級特徵,例如面部形狀 [

14

]。

17

演示了這個過程 —— 這些特徵是使用

卷積深度信念網路

學習的,這張圖片只是為了演示思路(這只是一個例子:實際上卷積過濾器識別出來的對象可能對人來說並沒有什麼意義)。



圖17: 卷積深度信念網路學習特徵


Adam Harley 創建了一個基於 MNIST 手寫數字數據集 [

13

]訓練卷積神經網路的可視化。我強烈推薦大家 

使用它

來了解卷積神經網路的工作細節。


我們在下圖中可以看到神經網路對於輸入數字「8」的具體操作細節。請注意,

18

中並未單獨顯示ReLU操作。



圖18:基於手寫數字訓練卷積神經網路的可視化


輸入圖像包含 1024 個像素點(32 × 32 圖像),第一個卷積層(卷積層1)由六個不同的5 × 5(步幅為1)過濾器與輸入圖像卷積而成。如圖所示,使用六個不同的過濾器得到深度為六的特徵映射。


卷積層1之後是池化層1,它在卷積層1中的六個特徵映射上分別進行2 × 2最大池化(步幅為2)。將滑鼠指針移動到池化層的任意像素上,可以觀察到它來自於2 x 2網格在前一個卷積層中的作用(如

19

所示)。注意到2 x 2網格中具有最大值(最亮的那個)的像素點會被映射到池化層。



圖19:池化操作可視化


池化層1之後是十六個執行卷積操作的5 × 5(步幅為1)卷積過濾器。然後是執行2 × 2最大池化(步幅為2)的池化層2。 這兩層的作用與上述相同。


然後有三個完全連接(FC)層:




  • 第一個FC層中有120個神經元



  • 第二個FC層中有100個神經元



  • 第三個FC層中的10個神經元對應於10個數字 —— 也稱為輸出層


注意,在

20

中,輸出層的10個節點每一個都連接到第二個完全連接層中的全部100個節點(因此稱為完全連接)。


另外,注意為什麼輸出層中唯一明亮的節點是』8』 —— 這意味著神經網路對我們的手寫數字進行了正確分類(節點亮度越高表示它的輸出更高,即8在所有數字中具有最高的概率)。



圖20:完全連接層可視化


該可視化系統的 3D 版本

在此


其他卷積神經網路框架


卷積神經網路始於20世紀90年代初。我們已經討論了LeNet,它是最早的卷積神經網路之一。下面列出了其他一些有影響力的神經網路框架 [

3

] [

4

]。




  • LeNet (20

    世紀90

    年代)

    本文已詳述。



  • 20

    世紀

    90

    年代到

    2012

    年:

    從20世紀90年代後期到2010年初,卷積神經網路正處於孵化期。隨著越來越多的數據和計算能力的提升,卷積神經網路可以解決的任務變得越來越有趣。



  • AlexNet

    (2012

     – 2012年,Alex Krizhevsky(和其他人)發布了 

    AlexNet

    ,它是提升了深度和廣度版本的 LeNet,並在2012年以巨大優勢贏得了 ImageNet 大規模視覺識別挑戰賽(ILSVRC)。這是基於之前方法的重大突破,目前 CNN 的廣泛應用都要歸功於 AlexNet。



  • ZF Net

    (2013

     – 2013年 ILSVRC 獲獎者來自 Matthew Zeiler 和 Rob Fergus 的卷積網路。它被稱為 

    ZFNet

    (Zeiler 和 Fergus Net 的簡稱)。它在 AlexNet 的基礎上通過調整網路框架超參數對其進行了改進。



  • GoogLeNet

    2014

     – 2014年 ILSVRC 獲獎者是 Google 的 

    Szegedy 等人

    的卷積網路。其主要貢獻是開發了一個初始模塊,該模塊大大減少了網路中的參數數量(4M,而 AlexNet 有60M)。



  • VGGNet

    2014

     – 2014年 ILSVRC 亞軍是名為 

    VGGNet

     的網路。其主要貢獻在於證明了網路深度(層數)是影響性能的關鍵因素。



  • ResNets

    2015

     – 何凱明(和其他人)開發的

    殘差網路

    是2015年 ILSVRC 的冠軍。ResNets 是迄今為止最先進的卷積神經網路模型,並且是大家在實踐中使用卷積神經網路的默認選擇(截至2016年5月)。



  • DenseNet

    2016

    8

    月)

     – 最近由黃高等人發表,密集連接卷積網路的每一層都以前饋方式直接連接到其他層。 DenseNet 已經在五項競爭激烈的對象識別基準測試任務中證明自己比之前最先進的框架有了顯著的改進。具體實現請參考

    這個網址


結論


本文中,我嘗試著用一些簡單的術語解釋卷積神經網路背後的主要概念,同時簡化/略過了幾個細節部分,但我希望這篇文章能夠讓你直觀地理解其工作原理。


本文最初是受 Denny Britz 《

理解卷積神經網路在自然語言處理上的運用

》這篇文章的啟發(推薦閱讀),文中的許多解釋是基於這篇文章的。為了更深入地理解其中一些概念,我鼓勵您閱讀

斯坦福大學卷積神經網路課程

筆記

以及一下參考資料中提到的其他很棒的資源。如果您對上述概念的理解遇到任何問題/建議,請隨時在下面留言。


文中所使用的所有圖像和動畫均屬於其各自的作者,陳列如下。


參考




  1. karpathy/neuraltalk2

    : Efficient Image Captioning code in Torch, 

    Examples



  2. Shaoqing Ren, et al, 「Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks」, 2015, 

    arXiv:1506.01497



  3. Neural Network Architectures

    , Eugenio Culurciello』s blog



  4. CS231n Convolutional Neural Networks for Visual Recognition, Stanford



  5. Clarifai/Technology



  6. Machine Learning is Fun! Part 3: Deep Learning and Convolutional Neural Networks



  7. Feature extraction using convolution, Stanford



  8. Wikipedia article on Kernel (image processing)



  9. Deep Learning Methods for Vision, CVPR 2012 Tutorial



  10. Neural Networks by Rob Fergus, Machine Learning Summer School 2015



  11. What do the fully connected layers do in CNNs?



  12. Convolutional Neural Networks, Andrew Gibiansky



  13. W. Harley, 「An Interactive Node-Link Visualization of Convolutional Neural Networks,」 in ISVC, pages 867-877, 2015 (

    link

    ). 

    Demo



  14. Understanding Convolutional Neural Networks for NLP



  15. Backpropagation in Convolutional Neural Networks



  16. <a href="https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner" s-guide-to-understanding-convolutional-neural-networks-part-2="" "="" style_="border: 0px; color: rgb(0, 153, 204);">A Beginner』s Guide To Understanding Convolutional Neural Networks



  17. Vincent Dumoulin, et al, 「A guide to convolution arithmetic for deep learning」, 2015, 

    arXiv:1603.07285



  18. What is the difference between deep learning and usual machine learning?



  19. How is a convolutional neural network able to learn invariant features?



  20. A Taxonomy of Deep Convolutional Neural Nets for Computer Vision



  21. Honglak Lee, et al, 「Convolutional Deep Belief Networks for Scalable Unsupervised Learning of Hierarchical Representations」 (

    link

    )




看完本文有收穫?請轉

發分享給更多人


關注「P

ython開發者」,提升Python技能


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發者 的精彩文章:

用 Python 構建一個極小的區塊鏈
5 種使用 Python 代碼輕鬆實現數據可視化的方法

TAG:Python開發者 |