卷積神經網絡(CNN)

from  http://blog.jobbole.com/113819/?utm_source=blog.jobbole.com&utm_medium=relatedPostsphp

 

什麼是卷積神經網絡,它爲什麼重要?

卷積神經網絡(也稱做 ConvNets 或 CNN)是神經網絡的一種,它在圖像識別和分類等領域已被證實很是有效。 卷積神經網絡除了爲機器人和自動駕駛汽車的視覺助力以外,還能夠成功識別人臉,物體和交通標誌。html

圖1python

圖1所示,卷積神經網絡可以識別圖片的場景而且提供相關標題(「足球運動員正在踢足球」),圖2則是利用卷積神經網絡識別平常物品、人類和動物的例子。最近,卷積神經網絡在一些天然語言處理任務(如語句分類)中也發揮了很大做用。git

圖2github

所以,卷積神經網絡是當今大多數機器學習實踐者的重要工具。可是,理解卷積神經網絡並開始嘗試運用着實是一個痛苦的過程。本文的主要目的是瞭解卷積神經網絡如何處理圖像。web

對於剛接觸神經網絡的人,我建議你們先閱讀這篇關於多層感知機的簡短教程 ,瞭解其工做原理以後再繼續閱讀本文。多層感知機即本文中的「徹底鏈接層」。網絡

LeNet 框架(20世紀90年代)

LeNet 是最先推進深度學習領域發展的卷積神經網絡之一。這項由 Yann LeCun 完成的開創性工做自1988年以來屢次成功迭代以後被命名爲 LeNet5。當時 LeNet 框架主要用於字符識別任務,例如閱讀郵政編碼,數字等。框架

接下來,咱們將直觀地瞭解 LeNet 框架如何學習識別圖像。 近年來有人提出了幾種基於 LeNet 改進的新框架,可是它們的基本思路與 LeNet 並沒有差異,若是您清楚地理解了 LeNet,那麼對這些新的框架理解起來就相對容易不少。機器學習

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

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個類進行求和)
  • 總偏差=∑ ½(目標機率 – 輸出機率)²
  • 步驟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 的基礎上經過調整網絡框架超參數對其進行了改進。
  • GoogLeNet2014 – 2014年 ILSVRC 獲獎者是 Google 的 Szegedy 等人的卷積網絡。其主要貢獻是開發了一個初始模塊,該模塊大大減小了網絡中的參數數量(4M,而 AlexNet 有60M)。
  • VGGNet2014 – 2014年 ILSVRC 亞軍是名爲 VGGNet 的網絡。其主要貢獻在於證實了網絡深度(層數)是影響性能的關鍵因素。
  • ResNets2015 – 何凱明(和其餘人)開發的殘差網絡是2015年 ILSVRC 的冠軍。ResNets 是迄今爲止最早進的卷積神經網絡模型,而且是你們在實踐中使用卷積神經網絡的默認選擇(截至2016年5月)。
  • DenseNet20168月) – 最近由黃高等人發表,密集鏈接卷積網絡的每一層都之前饋方式直接鏈接到其餘層。 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 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)

圖13,第二次作卷積的時候,是對第一次的結果應用6個過濾器嗎?那第二次卷積以後是否是應該有3*6 = 18個特徵映射啊?

在原文博客評論區找到了上面問題的解答,第二次作卷積的時候,對每一個過濾器,把第一次的3個映射作某種處理結合成1個,而後對這1個進行卷積。 詳細可見 論文 http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf 中table1及周圍的說明

相關文章
相關標籤/搜索