卷積神經網絡<Convolutional Neural Networks>簡稱ConvNets 或CNNs 屬於分類神經網絡,在某些領域已經被驗證很是有效,好比圖像識別、分類領域。ConvNets 不只僅在人臉、物體、交通標誌識別成功並且還助力於機器視覺與自動駕駛。php
圖 1: 來源 [1]html
在上圖 圖1 中ConvNet 能夠識別場景而且系統能夠創建相關關聯(「一個足球運動員在踢足球」),然而在下圖 圖2 的示例中展現了ConvNets 用於識別物體、人和動物。最近,ConvNets 在某些天然語言處理任務(例如句子分類)中也有效。[ 注:微軟小冰、蘋果Siri 等,讀者也能夠調用微軟AI搭建本身的應用程序。譯者加]python
圖 2: 來源 [2]git
所以,ConvNets 對於大多機器學習從業者來講是一個很重要的工具。 然而有時候對於首次理解ConvNets、學習使用ConvNets 來講可能使人生畏。本博客主要目的是加深理解 ConvNet 如何處理圖片。github
一般來講若是你對神經網絡不熟悉,我推薦在繼續閱讀以前 閱讀 this short tutorial on Multi Layer Perceptrons 以熟悉瞭解 ConvNe t的工做原理。多層感知器在本文中稱爲 「Fully Connected Layers」 。web
LeNet 是最先推進深度學習領域的卷積神經網絡之一。這項開創性工做自1988年[3]以來,在屢次迭代成功以後被 Yann LeCun 命名爲 LeNet5 . 在當時 LeNet 結構主要被用於字符任務,好比讀取郵政編碼、數字等。網絡
下面,我門將直觀的介紹 LeNet結構 學習如何識別圖像。近年來有幾種新的體系結構對 LeNet 進行了改進,然而它們都使用了LeNet 的主要概念,若是你對LeNet 有清晰的理解,則相對容易理解如下內容。架構
圖 3: 一個簡單卷積神經網絡. 來源[5]app
圖3 中的卷積神經網絡在結構上與原始LeNet 相似,有四個輸入分類:狗、貓、船和鳥(原始LeNet 主要用於字符識別任務)。從上圖明顯能夠看出,在獲得一個船的圖片做爲輸入,該網絡在全部分類中正確的標記最高的可能性爲船(0.94)。輸出層中全部輸出可能性之和應該爲1.(稍後解釋爲何總和應該爲1)機器學習
以上圖3 顯示了 ConvNet 中的4個主要操做。
一、卷積 - Convolution
二、非線性 - ReLU
三、池化 - Pooling
四、分類 - Classification
每個卷積神經網絡都包含了這些基本構築塊,所以理解以上步驟原理,對於理解ConvNet 是很是重要的一步。咱們將在下面嘗試直觀的理解這些步驟背後的操做。
本質上,每個圖片都能用一個像素矩陣表示。 [注:這是ConvNet 的基礎 。譯者加]
圖4: 圖片-像素矩陣. 來源[6]
通道-Channel 是用於指代圖片某一部分的常規術語。標準數碼相機中的圖像具備3個通道 紅、綠、藍,能夠想象爲3個2維矩陣的疊加(每種顏色一矩陣),每個像素值在0到255之間,包含0和255。
灰度圖-grayscale 只有一個通道。出於本文目的,咱們將只考慮灰度圖像,所以咱們將一個二維矩陣表明一個圖片。矩陣中的每個值都在0到255之間,0 表示黑色,255 表示 白色 。
ConvNet 得名於它的 「卷積-convolution」 操做。對於 ConvNet 來講,卷積操做主要是爲了從輸入圖像中提取特徵。卷積經過使用輸入數據的小方塊學習圖像特徵,保留像素之間的空間關係。在這裏咱們不討論卷積的具體數學原理,只是瞭解卷積在圖像處理上的原理。
如上述討論,每個圖片均可視爲一個像素矩陣。以下一個 5 * 5 的圖像,像素值只包含0 和 1 (注:對於灰度圖,像素值在0到255,下圖是一個特例僅包含0和1):
同時,考慮另一個 3 * 3 矩陣 以下圖所示:
而後,能夠計算出 5 * 5 圖像 和 3 * 3 矩陣卷積結果,以下動圖 圖5 所示:
圖 5: 卷積操做. 來源[7]
花點時間理解一下上面卷積過程的計算是如何完成的。咱們將橙色矩陣在原始圖像(綠色)上滑動一個像素(也成爲「跨度」),針對每個位置咱們計算元素的「wise」乘法(兩個矩陣之間)而後將乘法輸出相加獲取最終的整數結果,該結果做爲輸出矩陣的單個元素(粉紅色矩陣)。請注意, 每一步中 3 * 3 矩陣僅僅是輸入圖像的一分部。
3 * 3 矩陣,在 CNN 術語中被稱爲:「過濾器-filter」 或 「內核-kernel」 或 「特徵檢測器-feature detector」;經過在原始圖上滑動 「過濾器-filter」 並計算點積所造成的矩陣稱爲:「卷積特徵-Convolved Feature」 或 「激活圖-Activation Map」 或 「特徵圖-Feature Map」。請注意,在原始輸入圖像中過濾行爲做爲特徵檢測很是重要。
從上面的動畫圖能夠看出,對於同一個輸入圖像,不一樣的過濾矩陣產生不一樣的特徵圖。例如,考慮如下輸入圖像:
在下圖表中,咱們能夠看到使用不一樣的過濾器在圖上的卷積效果。如圖所示,在卷積操做[8]以前咱們能夠經過改變過濾器矩陣的數值執行操諸如 邊緣檢測-Edge Detection、銳化-Sharpen和模糊-Blur 之類的操做,這意味着不一樣的濾鏡能夠檢測圖像中的不一樣特徵,例如邊緣、曲線等。更多的此類示例能夠在8.2.4 節獲取。[注:https://docs.gimp.org/en/plug-in-convmatrix.html 連接Not Found ,譯者加]
也能夠經過下圖 圖6 動畫所示,直觀的理解卷積操做。
圖 6: 卷積操做. 來源[9]
一個過濾器(紅色輪廓矩形)劃過輸入圖像(卷積操做)產生一個特徵圖。如圖,卷積操做的另一個過濾器(綠色輪廓矩形)在同一張圖上獲得了一個不一樣的特徵圖。特別注意,卷積操做會捕獲原圖像中的局部依賴。同時也要注意,這兩個不一樣的過濾器如何從同一張原始圖像中生成不一樣的特徵圖。記住,我麼討論的前提是,原始圖像和兩個過濾器都是數字矩陣。
實際上,CNN 在訓練過程當中會自行學習這些過濾器的值(儘管如此,在訓練模型以前咱們仍須要指定參數例如:過濾器數量、過濾器大小、網絡結構等)。過濾器越多,將會提取到越多的圖像特徵,這樣咱們的網絡在識別未知圖像時更有效。
特徵圖(卷積特徵)的大小取決於執行卷積步驟前肯定的 3 個參數[4] :
• 深度-Depth : 深度對應咱們用於卷積操做的濾波器數量。 圖7 所示神經網絡中,咱們在原始圖像中使用 3 個不一樣的過濾器,所以產生了三個不一樣的特徵圖。你可將這 3 個特徵圖想象爲堆疊的 2 維矩陣,所以 該特徵圖的深度就是 3。
圖 7
• 跨度-Stride: 跨度就是咱們的過濾矩陣每次劃過原始輸入矩陣的像素數。當跨度爲 1 時,咱們的過濾器每次移動一個像素。當跨度爲 2 時,此時過濾器每次滑動跳過兩個像素。跨度較大產生的特徵圖較小。
• 零填充-Zero-padding: 有時候,使用 0 填充輸入矩陣的邊界很是方便,所以咱們能夠應用過濾器做爲輸入圖像矩陣的邊界元素。Zero-padding 一個優勢就是容許咱們控制特徵圖的大小。添加 Zero-padding 也成爲寬卷積,反之不使用 Zero-padding 稱爲 窄卷積。在 [14] 中對此做了明確的解釋。
在上面 圖3 中每一次卷積操做以後都使用了一個叫 ReLu 的附加操做。ReLU 表明 Rectified Linear Unit ,它是非線性操做。它的輸出以下圖:
圖8: ReLU 操做
ReLu 是一個元素 「wise operation」(應用於每個像素),在特徵圖中將負像素所有替換爲零。ReLU 的目的是在咱們的 ConVNet 中引入非線性,由於大多數真實世界中的數據,所以咱們但願 ConvNet 學習是非線性的(卷積操做是 「element wise」 的矩陣乘法和加法 屬於線性操做 ,所以咱們引入如ReLU之類的非線性函數解決非線性問題)。
下圖 圖9 能夠明瞭的理解 ReLU 操做。它展現了上圖 圖6中獲取特徵圖之一的 ReLU 操做。要輸出的特徵圖 在這裏也被稱爲 「Rectified」 特徵圖 。
圖9: ReLU 操做. 來源[10]
可使用其它非線性函數例如:tanh 、sigmoid 替代 ReLU ,然而 ReLU 被髮如今大多數場景下表現更爲出色。
空間池化(也稱子採樣或向下採樣) 下降了每一個特徵圖的維度同時保留了最重要信息。空間池化有不一樣的類型:Max、Average、Sum 等。
在 Max pooling 中,咱們定義了一個空間鄰域(例如:2 * 2 區域)在該空間鄰域內校訂後的特徵圖中獲取最大值。除了獲取該鄰域的最大元素值,咱們也能夠獲取平均值(Average Pooling)或 總和。在實踐中, Max Pooling 表現的更爲出色 。
圖 10 中展現了在「校訂特徵圖-Rectified Feature map」(卷積操做+ReLU 操做) 上使用 2 * 2 過濾器的 Max Pooling 操做。
圖 10: Max Pooling. 來源[4]
咱們每次滑動 2 * 2 過濾器 2小格(也稱「跨度」),同時取出每一個區域的最大值。如 圖 10 所示,Max Pooling 操做會下降特徵圖的維度。
下圖 圖11 所示的神經網絡中,池化操做應用於每一個不一樣的特徵圖(注意所以,從三個輸入圖 獲得三個輸出圖)。
圖11: 校訂特徵圖-Rectified Feature Maps 池化
圖 12 展現了池化操做對 圖9 進行ReLU 操做後校訂特徵圖-Rectified Feature Map 的做用結果。
圖12: 池化. 來源[10]
池化的做用是逐漸減小輸入維度的大小[4]。池化有如下要點:
• 使輸入描述- input representations(特徵尺寸)更小且易於管理-more manageable。
• 減小神經網絡中的參數和計算量,所以,要注意控制過擬合-Overfitting[4]。
• 使網絡中對輸入圖像中 降維-small transformations、失真-distortions、平移-translations保持不變(咱們獲取領域中的 最大/平均值,所以輸入中的少許失真不會改變池化輸出)。
• 幫助咱們獲取圖像的幾乎不變的不變表示(「等變-equivariant」)。這對咱們檢測到圖像中的任意地方的對象很是有用(詳情閱讀[18] 和[19])。
圖 13
截止目前爲止,咱們已經瞭解了 卷積、ReLU、池化的工做原理。這對咱們理解任意 CNN(卷積神經網絡)的基本構造塊和層很是有用。如 圖13 所示咱們有2組 卷積、ReLU 和池化層,第二個卷積層對第一個池化層的輸出使用6個過濾器產生六個特徵圖;而後,ReLU 做用於第二層卷積輸出的6個特徵圖;而後咱們使用 Max Pooling 操做上步驟處理以後的6個校訂特徵圖- rectified feature maps。
這些層組合在一塊兒,對於從圖像中提取特徵很是有用,在神經網路中引用非線性-non-linearity和減少特徵尺度,同時旨在有些特徵在進行縮放和平移時保持等變[18]。
咱們將在下一節討論,第二個池化層的輸出充當徹底鏈接層-Fully Connected Layer的輸入。
徹底鏈接層是一個傳統的多層感知器,在輸出層使用 softmax 激活函數(也可使用諸如 SVM 的分離器,然而本文使用 softmax)。術語「Fully Connected」 意味着上層的每一個神經元都鏈接到下一層的每一個神經元。若是你對多層感知器不熟悉,推薦閱讀 A Quick Introduction to Neural Networks 。
卷積和池化層的輸出表明輸入圖像的高層次特徵-high-level features。徹底鏈接層的做用是根據訓練集的這些特徵將輸入圖像進行分類。例如,圖14 展現咱們執行圖像分類任務有四個可能的輸出(請注意,圖14沒有展現徹底鏈接層之間的節點連接)。
圖 14: 徹底鏈接層的每一個節點都鏈接到相鄰層每一個節點
除了分類問題,添加一個徹底鏈接層是一般一種廉價的方式去學習組合這些非線性特徵。卷積和池化層獲得的大多數特徵也許有助於分類任務,可是將這些特徵進行組合也許會獲取更好的結果[11]。
徹底鏈接層輸出的機率總和爲 1 ,這確保了徹底鏈接層做爲輸出層使用 Softmax 激活函數。Softmax 函數接受任意實數分數向量而且壓縮它的向量值在 0 和 1 之間 總和爲 1.
由以上討論能夠得出,卷積和池化層充當輸入圖像特徵提取器,徹底鏈接層充當分類器。請注意下圖 圖15中,因爲輸入圖像是船,船的目標機率是 1 其它三類的機率爲 0 。
• 輸入圖像 = 船
• 目標矢量 = [0,0,1,0]
圖15: 訓練 ConvNet
卷積神經網絡的訓練過程總結以下:
• Step1: 使用隨機值初始化全部的過濾器、參數、權重
• Step2: 網絡使用訓練圖像做爲輸入,通過向前傳播步驟(卷積、ReLU、池化操做以及徹底鏈接層中的向前傳播)並找到每一個類別的輸出機率。
• 能夠說上面船圖像的輸出機率爲 [0.2,0.4,0.1,0.3]
• 因爲第一次訓練樣本分配的是隨機權重,所以輸出機率也是隨機。
• Step3: 計算輸出層的總偏差(全部4個分類之和)
• Total Error = ∑ ½ (target probability – output probability) ²
• Step4: 使用反向傳播-Backpropagation 在網絡中計算全部權重的梯度偏差,而且使用 梯度降低更新全部的過濾器、權重、參數值使得輸出偏差最小。
• 根據對總偏差的貢獻大小調整權重。
• 當再次使用同一個輸入圖像,輸出機率如今多是 [0.1,0.1,0.7,0.1],輸出機率接近於目標矢量[0,0,1,0]。
• 這意味着網絡已經學會經過調整它的權重、過濾器、正確分類特定圖像,從而減少輸出偏差。
• 訓練過程當中網絡參數過濾器數量、過濾器大小、網絡結構等,都在步驟1中已肯定不會改變,只有過濾器矩陣的值和鏈接權重會更新。
• Step5: 對訓練集中的全部圖像重複步驟2-4 。
上面的訓練 ConvNet 的步驟,意味着 ConvNet 全部的權重參數現已經通過優化,能夠對訓練集中的圖像進行正確的分類。
當一個新圖像(未通過訓練)輸入到 ConvNet ,網絡將經過向前傳播步驟而且輸出每一個類別的機率(對於新圖像,網絡使用以前訓練樣本優化過的權重計算輸出機率)。若是你的訓練集足夠大,網絡將對新圖像 友好-generalize well 並將它們正確的分類。
注 1:上面的步驟已經通過簡化而且隱藏了數學細節,對訓練過程提供一個直觀理解。有關數學公式及更深入的理解查看[4] 和[12] 。
注 2:上面的例子中咱們使用了兩組交替的卷積和池化層。請注意在單個 ConvNet 中這些操做均可重複若干次。事實上,當前一些表現良好的 ConvNets 存在數十個 卷積和池化層。每一個卷積層以後不必定要存在一個池化層。從下圖 圖16 能夠看出,在進行一次池化操做以前咱們能夠連續使用多個卷積和 ReLU 操做。同時注意 下圖 圖16中 ConVNet 每一層的可視化。
圖16: 來源[4]
通常來講,更多的卷積步驟,意味着網絡能夠學習識別更多複雜的特徵。例如,圖像分類中一個 ConvNet 在第一層從原始像素中能夠學習邊緣檢測-detect edges ,而後使用邊緣在第二層檢測簡單形狀,而後使用這些形狀圖肯定高層次特徵,好比較高層中的面部形狀[14]。以下圖17所示,這些使用 Convolutional Deep Belief Network 學習這些特徵,此圖在這裏僅僅爲了展現這個思想(這僅僅是一個例子:實際上卷積過濾器檢測到的對象可能毫無心義)。
圖17: 從 Convolutional Deep Belief Network 學習特徵. 來源[21]
Adam Harley 在訓練MNIST手寫數字集卷積神經網絡時,創造了驚人的可視化效果 [13]。強烈建議使用playing around 理解CNN 的工做原理。
咱們能夠看到網絡對於輸入「8」的處理方式。注意圖18可視化未單獨展現ReLU操做。
圖18: 可視化 ConvNet 訓練手寫數字. 來源[13]
輸入圖像包含 1024 個像素(32 * 32 圖片), 6 個 5 * 5(跨度1) 過濾器卷積輸入圖像造成第一個卷積層。能夠看出,使用 6 個不一樣的過濾器產生深度爲 6 的特徵圖。
卷積層1 以後是池化層,池化層 使用 2 * 2 max pooling(跨度爲2)分別做用於卷積層1中的 6 個特徵圖。你能夠在池化層中的任意移動鼠標指針,在前一個卷積層觀察 2 * 2 的小格(如圖19所示)。你會注意到 2 * 2 小格的最大像素值被填充到池化層。
圖19: 可視化Pooling 操做. 來源[13]
第一個池化層以後 使用了 16 個 5 * 5 (跨度 1)卷積過濾器執行卷積操做。接下來對第二層進行 2 * 2 max pooling(跨度 2)池化操做。 這兩層使用了與上述相同的概念。
此時咱們有三個徹底鏈接層(FC)。它們是:
• 第一層徹底鏈接層,具備 120 個神經元
• 第二層徹底鏈接層,具備 100 個神經元
• 第三層徹底鏈接層,具備 10 個神經元對應 10 個數字,也稱輸出層
觀察下圖 圖20 中的方式,輸出層 10 個節點的每個節點都鏈接 第二層徹底鏈接層的全部 100 個節點(所以,命名爲全鏈接)。
同時注意,輸出層的惟一亮點怎樣與 「8」 對應,這意味着咱們的網絡對手寫數字進行了正確分類(較亮的的節點表示較高的輸出,也就是說 8 在全部數字中有最高的機率)。
圖20: 可視化徹底鏈接層. 來源[13]
此處提供了相同可視化的 3D 版本 here 。
11、 其它 convNet 結構
卷積神經網絡最先可追溯到 1990年。以上咱們討論的 LeNet 屬於最先的神經網絡之一。下面羅列了一些其它有影響的網絡結構[3] [4]。
• LeNet (1990年):本文已經介紹。
• 1990 到2012年:自從1990 年之後到2010年早些時候卷積神經網絡獲得了發展。隨着可用愈來愈多的數據量和強大的計算能力,卷積神經網絡能夠解決的任務愈來愈有趣。
• AlexNet (2012):在2012年,Alex Krizhevsky (和其餘人)發佈了 AlexNet ,該網絡是在 LeNet 基礎上更深更廣的版本,而且在2012年贏得了 ImageNet 大規模視覺識別挑戰賽(ILSVRC)。與之前的網絡相比這是里程碑式的突破,當前 CNN 的普遍應用均可以歸功於此項工做。
• ZF Net (2013):Matthew Zeiler 和 Rob Fergus 的卷積神經網絡 贏得了2013年的ILSVRC 。它被稱爲 ZFNet(Zeiler 和 Fergus Net的簡寫)。經過對 AlexNet 超參數的調整提高該網絡。
• GoogLeNet (2014):2014年ILSVRC 的贏得這是來自谷歌Szegedy等人的卷積神經網絡。它的主要是貢獻是開發了一個 Inception 模塊,該模塊大大減小了網絡中的參數數量(相比較AlexNet 的60M 它只有4M)。
• VGGNet (2014):VGGNet 贏得了2014年 ILSVRC 的亞軍。它的主要貢獻是代表網絡深度(層數)是得到良好性能的關鍵要素。
• ResNets (2015):Kaiming He (和其餘人) 開發的 Residual Network 贏得了2015年的 ILSVRC 。ResNets 是目前最早進的卷積神經網絡模型,實踐中默認使用的 ConvNets 模型(截止2016年5月)。
• DenseNet (August 2016) :最近由Gao Huang (和其餘人)發佈的 Densely Connected Convolutional Network,該網絡使用前饋的方式直接鏈接到其它每一層。事實證實,DenseNet在先前最新先進架構識別五個高度競爭對象的基準任務上有顯著提高。此處查看Torch 的實現 here 。
本文中,我試圖使用簡單的術語解釋卷積神經網絡的主要概念。這裏簡化、跳過了一些細節,可是但願本文能讓你直觀的理解它們如何工做。
本文最初由Denny Britz的《Understanding Convolutional Neural Networks for NLP》(推薦閱讀)啓發而來,這裏許多解釋都源於該文章。爲了更深刻理解這些概念,鼓勵你體驗 斯坦福 ConvNets課程 筆記 以及下面參考文獻中的有些資源。若是你理解上述概念遇到任何問題或者 有問題或建議,隨時在下面發表評論。
該文所引用到的圖片動圖均屬於原做者,如如下參考文獻所羅列。