from http://blog.jobbole.com/113819/?utm_source=blog.jobbole.com&utm_medium=relatedPostsphp
卷積神經網絡(也稱做 ConvNets 或 CNN)是神經網絡的一種,它在圖像識別和分類等領域已被證實很是有效。 卷積神經網絡除了爲機器人和自動駕駛汽車的視覺助力以外,還能夠成功識別人臉,物體和交通標誌。html
圖1python
如圖1所示,卷積神經網絡可以識別圖片的場景而且提供相關標題(「足球運動員正在踢足球」),圖2則是利用卷積神經網絡識別平常物品、人類和動物的例子。最近,卷積神經網絡在一些天然語言處理任務(如語句分類)中也發揮了很大做用。git
圖2github
所以,卷積神經網絡是當今大多數機器學習實踐者的重要工具。可是,理解卷積神經網絡並開始嘗試運用着實是一個痛苦的過程。本文的主要目的是瞭解卷積神經網絡如何處理圖像。web
對於剛接觸神經網絡的人,我建議你們先閱讀這篇關於多層感知機的簡短教程 ,瞭解其工做原理以後再繼續閱讀本文。多層感知機即本文中的「徹底鏈接層」。網絡
LeNet 是最先推進深度學習領域發展的卷積神經網絡之一。這項由 Yann LeCun 完成的開創性工做自1988年以來屢次成功迭代以後被命名爲 LeNet5。當時 LeNet 框架主要用於字符識別任務,例如閱讀郵政編碼,數字等。框架
接下來,咱們將直觀地瞭解 LeNet 框架如何學習識別圖像。 近年來有人提出了幾種基於 LeNet 改進的新框架,可是它們的基本思路與 LeNet 並沒有差異,若是您清楚地理解了 LeNet,那麼對這些新的框架理解起來就相對容易不少。機器學習
圖3中的卷積神經網絡在結構上與原始的 LeNet 相似,並將輸入圖像分爲四類:狗,貓,船或鳥(原始的 LeNet 主要用於字符識別任務)。 從上圖能夠看出,接收船隻圖像做爲輸入時,神經網絡在四個類別中正確地給船隻分配了最高几率值(0.94)。輸出層中全部機率的總和應該是1(以後會作解釋)。
圖3 的卷積神經網絡中有四個主要操做:
這些操做是全部卷積神經網絡的基本組成部分,所以瞭解它們的工做原理是理解卷積神經網絡的重要步驟。下面咱們將嘗試直觀地理解每一個操做。
實質上,每張圖片均可以表示爲由像素值組成的矩陣。
通道(channel)是一個傳統術語,指圖像的一個特定成分。標準數碼相機拍攝的照片具備三個通道——紅,綠和藍——你能夠將它們想象爲三個堆疊在一塊兒的二維矩陣(每種顏色一個),每一個矩陣的像素值都在0到255之間。
而灰度圖像只有一個通道。 鑑於本文的科普目的,咱們只考慮灰度圖像,即一個表明圖像的二維矩陣。矩陣中每一個像素值的範圍在0到255之間——0表示黑色,255表示白色。
卷積神經網絡的名字來源於「卷積」運算。在卷積神經網絡中,卷積的主要目的是從輸入圖像中提取特徵。經過使用輸入數據中的小方塊來學習圖像特徵,卷積保留了像素間的空間關係。咱們在這裏不會介紹卷積的數學推導,但會嘗試理解它是如何處理圖像的。
正如前文所說,每一個圖像能夠被看作像素值矩陣。考慮一個像素值僅爲0和1的5 × 5大小的圖像(注意,對於灰度圖像,像素值範圍從0到255,下面的綠色矩陣是像素值僅爲0和1的特殊狀況):
另外,考慮另外一個 3×3 矩陣,以下圖所示:
上述5 x 5圖像和3 x 3矩陣的卷積計算過程如圖5中的動畫所示:
咱們來花點時間理解一下上述計算是如何完成的。將橙色矩陣在原始圖像(綠色)上以每次1個像素的速率(也稱爲「步幅」)移動,對於每一個位置,計算兩個矩陣相對元素的乘積並相加,輸出一個整數並做爲最終輸出矩陣(粉色)的一個元素。注意,3 × 3矩陣每一個步幅僅能「看到」輸入圖像的一部分。
在卷積神經網路的術語中,這個3 × 3矩陣被稱爲「過濾器」或「核」或「特徵探測器」,經過在圖像上移動過濾器並計算點積獲得的矩陣被稱爲「卷積特徵」或「激活映射」或「特徵映射」。重要的是要注意,過濾器的做用就是原始輸入圖像的特徵檢測器。
從上面的動畫能夠明顯看出,對於同一張輸入圖像,不一樣的過濾器矩陣將會產生不一樣的特徵映射。例如,考慮以下輸入圖像:
在下表中,咱們能夠看到上圖在不一樣過濾器下卷積的效果。如圖所示,只需在卷積運算前改變過濾器矩陣的數值就能夠執行邊緣檢測,銳化和模糊等不一樣操做 [8] —— 這意味着不一樣的過濾器能夠檢測圖像的不一樣特徵,例如邊緣, 曲線等。更多此類示例可在 這裏 8.2.4節中找到。
另外一個理解卷積操做的好方法能夠參考下面圖6中的動畫:
一個過濾器(紅色邊框)在輸入圖像上移動(卷積操做)以生成特徵映射。在同一張圖像上,另外一個過濾器(綠色邊框)的卷積生成了不一樣的特徵圖,如圖所示。須要注意到,卷積操做捕獲原始圖像中的局部依賴關係很重要。還要注意這兩個不一樣的過濾器如何從同一張原始圖像獲得不一樣的特徵圖。請記住,以上圖像和兩個過濾器只是數值矩陣。
實際上,卷積神經網絡在訓練過程當中會本身學習這些過濾器的值(儘管在訓練過程以前咱們仍須要指定諸如過濾器數目、大小,網絡框架等參數)。咱們擁有的過濾器數目越多,提取的圖像特徵就越多,咱們的網絡在識別新圖像時效果就會越好。
特徵映射(卷積特徵)的大小由咱們在執行卷積步驟以前須要決定的三個參數[4]控制:
如上文圖3所示,每次卷積以後,都進行了另外一項稱爲 ReLU 的操做。ReLU 全稱爲修正線性單元(Rectified Linear Units),是一種非線性操做。 其輸出以下圖所示:
ReLU 是一個針對元素的操做(應用於每一個像素),並將特徵映射中的全部負像素值替換爲零。ReLU 的目的是在卷積神經網絡中引入非線性因素,由於在實際生活中咱們想要用神經網絡學習的數據大多數都是非線性的(卷積是一個線性運算 —— 按元素進行矩陣乘法和加法,因此咱們但願經過引入 ReLU 這樣的非線性函數來解決非線性問題)。
從圖9能夠很清楚地理解 ReLU 操做。它展現了將 ReLU 做用於圖6中某個特徵映射獲得的結果。這裏的輸出特徵映射也被稱爲「修正」特徵映射。
其餘非線性函數諸如 tanh 或 sigmoid 也能夠用來代替 ReLU,可是在大多數狀況下,ReLU 的表現更好。
空間池化(也稱爲子採樣或下采樣)可下降每一個特徵映射的維度,並保留最重要的信息。空間池化有幾種不一樣的方式:最大值,平均值,求和等。
在最大池化的狀況下,咱們定義一個空間鄰域(例如,一個2 × 2窗口),並取修正特徵映射在該窗口內最大的元素。固然咱們也能夠取該窗口內全部元素的平均值(平均池化)或全部元素的總和。在實際運用中,最大池化的表現更好。
圖10展現了經過2 × 2窗口在修正特徵映射(卷積+ ReLU 操做後獲得)上應用最大池化操做的示例。
咱們將2 x 2窗口移動2個單元格(也稱爲「步幅」),並取每一個區域中的最大值。如圖10所示,這樣就下降了特徵映射的維度。
在圖11所示的網絡中,池化操做分別應用於每一個特徵映射(所以,咱們從三個輸入映射中獲得了三個輸出映射)。
圖12展現了咱們對圖9中通過 ReLU 操做以後獲得的修正特徵映射應用池化以後的效果。
池化的做用是逐步減小輸入的空間大小[4]。具體來講有如下四點:
目前爲止,咱們已經瞭解了卷積,ReLU 和池化的工做原理。這些是卷積神經網絡的基本組成部分,理解這一點很重要。如圖13所示,咱們有兩個由卷積,ReLU 和 Pooling 組成的中間層 —— 第二個卷積層使用六個過濾器對第一層的輸出執行卷積,生成六個特徵映射。而後將 ReLU 分別應用於這六個特徵映射。接着,咱們對六個修正特徵映射分別執行最大池化操做。
這兩個中間層的做用都是從圖像中提取有用的特徵,在網絡中引入非線性因素,同時對特徵降維並使其在尺度和平移上等變[18]。
第二個池化層的輸出即徹底鏈接層的輸入,咱們將在下一節討論。
徹底鏈接層是一個傳統的多層感知器,它在輸出層使用 softmax 激活函數(也可使用其餘分類器,好比 SVM,但在本文只用到了 softmax)。「徹底鏈接」這個術語意味着前一層中的每一個神經元都鏈接到下一層的每一個神經元。 若是對多層感知器不甚瞭解,我建議您閱讀這篇文章。
卷積層和池化層的輸出表明瞭輸入圖像的高級特徵。徹底鏈接層的目的是利用這些基於訓練數據集獲得的特徵,將輸入圖像分爲不一樣的類。例如,咱們要執行的圖像分類任務有四個可能的輸出,如圖14所示(請注意,圖14沒有展現出徹底鏈接層中節點之間的鏈接)
除分類以外,添加徹底鏈接層也是一個(一般來講)比較簡單的學習這些特徵非線性組合的方式。卷積層和池化層獲得的大部分特徵對分類的效果可能也不錯,但這些特徵的組合可能會更好[11]。
徹底鏈接層的輸出機率之和爲1。這是由於咱們在徹底鏈接層的輸出層使用了 softmax 激活函數。Softmax 函數取任意實數向量做爲輸入,並將其壓縮到數值在0到1之間,總和爲1的向量。
如上所述,卷積+池化層用來從輸入圖像提取特徵,徹底鏈接層用來作分類器。
注意,在圖15中,因爲輸入圖像是船,對於船類目標機率爲1,其餘三個類爲0
卷積網絡的總體訓練過程歸納以下:
經過以上步驟就能夠訓練出卷積神經網絡 —— 這實際上意味着卷積神經網絡中的全部權重和參數都已通過優化,能夠對訓練集中的圖像進行正確分類。
當咱們給卷積神經網絡中輸入一個新的(未見過的)圖像時,網絡會執行前向傳播步驟並輸出每一個類的機率(對於新圖像,計算輸出機率所用的權重是以前優化過,並可以對訓練集徹底正確分類的)。若是咱們的訓練集足夠大,神經網絡會有很好的泛化能力(希望如此)並將新圖片分到正確的類裏。
注1:爲了給你們提供一個直觀的訓練過程,上述步驟已經簡化了不少,而且忽略了數學推導過程。若是想要數學推導以及對卷積神經網絡透徹的理解,請參閱 [4] 和 [12]。
注2:上面的例子中,咱們使用了兩組交替的卷積和池化層。但請注意,這些操做能夠在一個卷積神經網絡中重複執行屢次。實際上,如今效果最好的一些卷積神經網絡都包含幾十個卷積和池化層! 另外,每一個卷積層以後的池化層不是必需的。從下面的圖16中能夠看出,在進行池化操做以前,咱們能夠連續進行多個卷積 + ReLU 操做。另外請注意圖16卷積神經網絡的每一層是如何展現的。
通常來講,卷積步驟越多,神經網絡可以學習識別的特徵就更復雜。例如,在圖像分類中,卷積神經網絡在第一層可能會學習檢測原始像素的邊緣,而後在第二層利用這些邊緣檢測簡單形狀,而後在更高級的層用這些形狀來檢測高級特徵,例如面部形狀 [14]。圖17演示了這個過程 —— 這些特徵是使用卷積深度信念網絡學習的,這張圖片只是爲了演示思路(這只是一個例子:實際上卷積過濾器識別出來的對象可能對人來講並無什麼意義)。
Adam Harley 建立了一個基於 MNIST 手寫數字數據集 [13]訓練卷積神經網絡的可視化。我強烈推薦你們 使用它來了解卷積神經網絡的工做細節。
咱們在下圖中能夠看到神經網絡對於輸入數字「8」的具體操做細節。請注意,圖18中並未單獨顯示ReLU操做。
輸入圖像包含 1024 個像素點(32 × 32 圖像),第一個卷積層(卷積層1)由六個不一樣的5 × 5(步幅爲1)過濾器與輸入圖像卷積而成。如圖所示,使用六個不一樣的過濾器獲得深度爲六的特徵映射。
卷積層1以後是池化層1,它在卷積層1中的六個特徵映射上分別進行2 × 2最大池化(步幅爲2)。將鼠標指針移動到池化層的任意像素上,能夠觀察到它來自於2 x 2網格在前一個卷積層中的做用(如圖19所示)。注意到2 x 2網格中具備最大值(最亮的那個)的像素點會被映射到池化層。
池化層1以後是十六個執行卷積操做的5 × 5(步幅爲1)卷積過濾器。而後是執行2 × 2最大池化(步幅爲2)的池化層2。 這兩層的做用與上述相同。
而後有三個徹底鏈接(FC)層:
注意,在圖20中,輸出層的10個節點每個都鏈接到第二個徹底鏈接層中的所有100個節點(所以稱爲徹底鏈接)。
另外,注意爲何輸出層中惟一明亮的節點是’8’ —— 這意味着神經網絡對咱們的手寫數字進行了正確分類(節點亮度越高表示它的輸出更高,即8在全部數字中具備最高的機率)。
該可視化系統的 3D 版本在此。
卷積神經網絡始於20世紀90年代初。咱們已經討論了LeNet,它是最先的卷積神經網絡之一。下面列出了其餘一些有影響力的神經網絡框架 [3] [4]。
本文中,我嘗試着用一些簡單的術語解釋卷積神經網絡背後的主要概念,同時簡化/略過了幾個細節部分,但我但願這篇文章可以讓你直觀地理解其工做原理。
本文最初是受 Denny Britz 《理解卷積神經網絡在天然語言處理上的運用》這篇文章的啓發(推薦閱讀),文中的許多解釋是基於這篇文章的。爲了更深刻地理解其中一些概念,我鼓勵您閱讀斯坦福大學卷積神經網絡課程的筆記以及一下參考資料中提到的其餘很棒的資源。若是您對上述概念的理解遇到任何問題/建議,請隨時在下面留言。
文中所使用的全部圖像和動畫均屬於其各自的做者,陳列以下。
圖13,第二次作卷積的時候,是對第一次的結果應用6個過濾器嗎?那第二次卷積以後是否是應該有3*6 = 18個特徵映射啊?
在原文博客評論區找到了上面問題的解答,第二次作卷積的時候,對每一個過濾器,把第一次的3個映射作某種處理結合成1個,而後對這1個進行卷積。 詳細可見 論文 http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf 中table1及周圍的說明