卷積神經(jīng)網(wǎng)絡是當今大多數(shù)機器學習實踐者的重要工具。但是,理解卷積神經(jīng)網(wǎng)絡并開始嘗試運用著實是一個痛苦的過程。本文的主要目的是了解卷積神經(jīng)網(wǎng)絡如何處理圖像。
什么是卷積神經(jīng)網(wǎng)絡,它為何重要?
卷積神經(jīng)網(wǎng)絡(也稱作ConvNets或CNN)是神經(jīng)網(wǎng)絡的一種,它在圖像識別和分類等領(lǐng)域已被證明非常有效。 卷積神經(jīng)網(wǎng)絡除了為機器人和自動駕駛汽車的視覺助力之外,還可以成功識別人臉,物體和交通標志。
圖1
如圖1所示,卷積神經(jīng)網(wǎng)絡能夠識別圖片的場景并且提供相關(guān)標題(“足球運動員正在踢足球”),圖2則是利用卷積神經(jīng)網(wǎng)絡識別日常物品、人類和動物的例子。最近,卷積神經(jīng)網(wǎng)絡在一些自然語言處理任務(如語句分類)中也發(fā)揮了很大作用。
圖2
因此,卷積神經(jīng)網(wǎng)絡是當今大多數(shù)機器學習實踐者的重要工具。但是,理解卷積神經(jīng)網(wǎng)絡并開始嘗試運用著實是一個痛苦的過程。本文的主要目的是了解卷積神經(jīng)網(wǎng)絡如何處理圖像。
對于剛接觸神經(jīng)網(wǎng)絡的人,我建議大家先閱讀這篇關(guān)于多層感知機的簡短教程,了解其工作原理之后再繼續(xù)閱讀本文。多層感知機即本文中的“完全連接層”。
LeNet 框架(20世紀90年代)
LeNet 是最早推動深度學習領(lǐng)域發(fā)展的卷積神經(jīng)網(wǎng)絡之一。這項由 Yann LeCun 完成的開創(chuàng)性工作自1988年以來多次成功迭代之后被命名為LeNet5。當時 LeNet 框架主要用于字符識別任務,例如閱讀郵政編碼,數(shù)字等。
接下來,我們將直觀地了解 LeNet 框架如何學習識別圖像。 近年來有人提出了幾種基于 LeNet 改進的新框架,但是它們的基本思路與 LeNet 并無差別,如果您清楚地理解了 LeNet,那么對這些新的框架理解起來就相對容易很多。
圖3: 一個簡單的卷積神經(jīng)網(wǎng)絡
圖3中的卷積神經(jīng)網(wǎng)絡在結(jié)構(gòu)上與原始的 LeNet 類似,并將輸入圖像分為四類:狗,貓,船或鳥(原始的 LeNet 主要用于字符識別任務)。 從上圖可以看出,接收船只圖像作為輸入時,神經(jīng)網(wǎng)絡在四個類別中正確地給船只分配了最高概率值(0.94)。輸出層中所有概率的總和應該是1(之后會做解釋)。
圖3的卷積神經(jīng)網(wǎng)絡中有四個主要操作:
卷積
非線性變換(ReLU)
池化或子采樣
分類(完全連接層)
這些操作是所有卷積神經(jīng)網(wǎng)絡的基本組成部分,因此了解它們的工作原理是理解卷積神經(jīng)網(wǎng)絡的重要步驟。下面我們將嘗試直觀地理解每個操作。
一張圖片就是一個由像素值組成的矩陣
實質(zhì)上,每張圖片都可以表示為由像素值組成的矩陣。
圖4: 每張圖片就是一個像素矩陣
通道(channel)是一個傳統(tǒng)術(shù)語,指圖像的一個特定成分。標準數(shù)碼相機拍攝的照片具有三個通道——紅,綠和藍——你可以將它們想象為三個堆疊在一起的二維矩陣(每種顏色一個),每個矩陣的像素值都在0到255之間。
而灰度圖像只有一個通道。 鑒于本文的科普目的,我們只考慮灰度圖像,即一個代表圖像的二維矩陣。矩陣中每個像素值的范圍在0到255之間——0表示黑色,255表示白色。
卷積
卷積神經(jīng)網(wǎng)絡的名字來源于“卷積”運算。在卷積神經(jīng)網(wǎng)絡中,卷積的主要目的是從輸入圖像中提取特征。通過使用輸入數(shù)據(jù)中的小方塊來學習圖像特征,卷積保留了像素間的空間關(guān)系。我們在這里不會介紹卷積的數(shù)學推導,但會嘗試理解它是如何處理圖像的。
正如前文所說,每個圖像可以被看做像素值矩陣??紤]一個像素值僅為0和1的5 × 5大小的圖像(注意,對于灰度圖像,像素值范圍從0到255,下面的綠色矩陣是像素值僅為0和1的特殊情況):
另外,考慮另一個 3×3 矩陣,如下圖所示:
上述5 x 5圖像和3 x 3矩陣的卷積計算過程如圖5中的動畫所示:
圖5:卷積操作。輸出矩陣稱作“卷積特征”或“特征映射”
我們來花點時間理解一下上述計算是如何完成的。將橙色矩陣在原始圖像(綠色)上以每次1個像素的速率(也稱為“步幅”)移動,對于每個位置,計算兩個矩陣相對元素的乘積并相加,輸出一個整數(shù)并作為最終輸出矩陣(粉色)的一個元素。注意,3 × 3矩陣每個步幅僅能“看到”輸入圖像的一部分。
在卷積神經(jīng)網(wǎng)路的術(shù)語中,這個3 × 3矩陣被稱為“過濾器”或“核”或“特征探測器”,通過在圖像上移動過濾器并計算點積得到的矩陣被稱為“卷積特征”或“激活映射”或“特征映射”。重要的是要注意,過濾器的作用就是原始輸入圖像的特征檢測器。
從上面的動畫可以明顯看出,對于同一張輸入圖像,不同的過濾器矩陣將會產(chǎn)生不同的特征映射。例如,考慮如下輸入圖像:
在下表中,我們可以看到上圖在不同過濾器下卷積的效果。如圖所示,只需在卷積運算前改變過濾器矩陣的數(shù)值就可以執(zhí)行邊緣檢測,銳化和模糊等不同操作 [8] —— 這意味著不同的過濾器可以檢測圖像的不同特征,例如邊緣, 曲線等。更多此類示例可在這里8.2.4節(jié)中找到。
另一個理解卷積操作的好方法可以參考下面文字:
一個過濾器(紅色邊框)在輸入圖像上移動(卷積操作)以生成特征映射。在同一張圖像上,另一個過濾器(綠色邊框)的卷積生成了不同的特征圖,如圖所示。需要注意到,卷積操作捕獲原始圖像中的局部依賴關(guān)系很重要。還要注意這兩個不同的過濾器如何從同一張原始圖像得到不同的特征圖。請記住,以上圖像和兩個過濾器只是數(shù)值矩陣。
實際上,卷積神經(jīng)網(wǎng)絡在訓練過程中會自己學習這些過濾器的值(盡管在訓練過程之前我們?nèi)孕枰付ㄖT如過濾器數(shù)目、大小,網(wǎng)絡框架等參數(shù))。我們擁有的過濾器數(shù)目越多,提取的圖像特征就越多,我們的網(wǎng)絡在識別新圖像時效果就會越好。
特征映射(卷積特征)的大小由我們在執(zhí)行卷積步驟之前需要決定的三個參數(shù)[4]控制:
深度:深度對應于我們用于卷積運算的過濾器數(shù)量。在圖6所示的網(wǎng)絡中,我們使用三個不同的過濾器對初始的船圖像進行卷積,從而生成三個不同的特征圖??梢詫⑦@三個特征地圖視為堆疊的二維矩陣,因此,特征映射的“深度”為3。
圖6
步幅:步幅是我們在輸入矩陣上移動一次過濾器矩陣的像素數(shù)量。當步幅為1時,我們一次將過濾器移動1個像素。當步幅為2時,過濾器每次移動2個像素。步幅越大,生成的特征映射越小。
零填充:有時,將輸入矩陣邊界用零來填充會很方便,這樣我們可以將過濾器應用于輸入圖像矩陣的邊界元素。零填充一個很好的特性是它允許我們控制特征映射的大小。添加零填充也稱為寬卷積,而不使用零填充是為窄卷積。 這在[14]中有清楚的解釋。
非線性部分介紹(ReLU)
如上文圖3所示,每次卷積之后,都進行了另一項稱為 ReLU 的操作。ReLU 全稱為修正線性單元(Rectified Linear Units),是一種非線性操作。 其輸出如下圖所示:
圖7: ReLU 函數(shù)
ReLU 是一個針對元素的操作(應用于每個像素),并將特征映射中的所有負像素值替換為零。ReLU 的目的是在卷積神經(jīng)網(wǎng)絡中引入非線性因素,因為在實際生活中我們想要用神經(jīng)網(wǎng)絡學習的數(shù)據(jù)大多數(shù)都是非線性的(卷積是一個線性運算 —— 按元素進行矩陣乘法和加法,所以我們希望通過引入 ReLU 這樣的非線性函數(shù)來解決非線性問題)。
從圖8可以很清楚地理解 ReLU 操作。它展示了將 ReLU 作用于某個特征映射得到的結(jié)果。這里的輸出特征映射也被稱為“修正”特征映射。
圖8: ReLU 操作
其他非線性函數(shù)諸如tanh或sigmoid也可以用來代替 ReLU,但是在大多數(shù)情況下,ReLU 的表現(xiàn)更好。
池化
空間池化(也稱為子采樣或下采樣)可降低每個特征映射的維度,并保留最重要的信息??臻g池化有幾種不同的方式:最大值,平均值,求和等。
在最大池化的情況下,我們定義一個空間鄰域(例如,一個2 × 2窗口),并取修正特征映射在該窗口內(nèi)最大的元素。當然我們也可以取該窗口內(nèi)所有元素的平均值(平均池化)或所有元素的總和。在實際運用中,最大池化的表現(xiàn)更好。
圖9展示了通過2 × 2窗口在修正特征映射(卷積+ ReLU 操作后得到)上應用最大池化操作的示例。
圖9: 最大池化
我們將2 x 2窗口移動2個單元格(也稱為“步幅”),并取每個區(qū)域中的最大值。如圖9所示,這樣就降低了特征映射的維度。
在圖10所示的網(wǎng)絡中,池化操作分別應用于每個特征映射(因此,我們從三個輸入映射中得到了三個輸出映射)。
圖10: 在修正特征映射上應用池化
圖11展示了我們對圖8中經(jīng)過 ReLU 操作之后得到的修正特征映射應用池化之后的效果。
圖11: 池化
池化的作用是逐步減少輸入的空間大小[4]。具體來說有以下四點:
使輸入(特征維度)更小,更易于管理
減少網(wǎng)絡中的參數(shù)和運算次數(shù),因此可以控制過擬合[4]
使網(wǎng)絡對輸入圖像微小的變換、失真和平移更加穩(wěn)?。ㄝ斎雸D片小幅度的失真不會改池化的輸出結(jié)果 —— 因為我們?nèi)×肃徲虻淖畲笾?平均值)。
可以得到尺度幾乎不變的圖像(確切的術(shù)語是“等變”)。這是非常有用的,這樣無論圖片中的物體位于何處,我們都可以檢測到,(詳情參閱[18]和[19])。
至此…
圖12
目前為止,我們已經(jīng)了解了卷積,ReLU 和池化的工作原理。這些是卷積神經(jīng)網(wǎng)絡的基本組成部分,理解這一點很重要。如圖13所示,我們有兩個由卷積,ReLU 和 Pooling 組成的中間層 —— 第二個卷積層使用六個過濾器對第一層的輸出執(zhí)行卷積,生成六個特征映射。然后將 ReLU 分別應用于這六個特征映射。接著,我們對六個修正特征映射分別執(zhí)行最大池化操作。
這兩個中間層的作用都是從圖像中提取有用的特征,在網(wǎng)絡中引入非線性因素,同時對特征降維并使其在尺度和平移上等變[18]。
第二個池化層的輸出即完全連接層的輸入,我們將在下一節(jié)討論。
完全連接層
完全連接層是一個傳統(tǒng)的多層感知器,它在輸出層使用 softmax 激活函數(shù)(也可以使用其他分類器,比如 SVM,但在本文只用到了 softmax)。“完全連接”這個術(shù)語意味著前一層中的每個神經(jīng)元都連接到下一層的每個神經(jīng)元。 如果對多層感知器不甚了解,我建議您閱讀這篇文章。
卷積層和池化層的輸出代表了輸入圖像的高級特征。完全連接層的目的是利用這些基于訓練數(shù)據(jù)集得到的特征,將輸入圖像分為不同的類。例如,我們要執(zhí)行的圖像分類任務有四個可能的輸出,如圖13所示(請注意,圖14沒有展示出完全連接層中節(jié)點之間的連接)
圖13: 完全連接層——每個節(jié)點都與相鄰層的其他節(jié)點連接
除分類之外,添加完全連接層也是一個(通常來說)比較簡單的學習這些特征非線性組合的方式。卷積層和池化層得到的大部分特征對分類的效果可能也不錯,但這些特征的組合可能會更好[11]。
完全連接層的輸出概率之和為1。這是因為我們在完全連接層的輸出層使用了 softmax 激活函數(shù)。Softmax 函數(shù)取任意實數(shù)向量作為輸入,并將其壓縮到數(shù)值在0到1之間,總和為1的向量。
正式開始——使用反向傳播進行訓練
如上所述,卷積+池化層用來從輸入圖像提取特征,完全連接層用來做分類器。
注意,在圖14中,由于輸入圖像是船,對于船類目標概率為1,其他三個類為0
輸入圖像 = 船
目標向量 = [0, 0, 1, 0]
圖14:訓練卷積神經(jīng)網(wǎng)絡
卷積網(wǎng)絡的整體訓練過程概括如下:
步驟1:用隨機值初始化所有過濾器和參數(shù)/權(quán)重
步驟2:神經(jīng)網(wǎng)絡將訓練圖像作為輸入,經(jīng)過前向傳播步驟(卷積,ReLU 和池化操作以在完全連接層中的前向傳播),得到每個類的輸出概率。
假設上面船只圖像的輸出概率是 [0.2,0.4,0.1,0.3]
由于權(quán)重是隨機分配給第一個訓練樣本,因此輸出概率也是隨機的。
步驟3:計算輸出層的總誤差(對所有4個類進行求和)
總誤差=∑ ?(目標概率 – 輸出概率)2
步驟4:使用反向傳播計算網(wǎng)絡中所有權(quán)重的誤差梯度,并使用梯度下降更新所有過濾器值/權(quán)重和參數(shù)值,以最小化輸出誤差。
根據(jù)權(quán)重對總誤差的貢獻對其進行調(diào)整。
當再次輸入相同的圖像時,輸出概率可能就變成了 [0.1,0.1,0.7,0.1],這更接近目標向量 [0,0,1,0]。
這意味著網(wǎng)絡已經(jīng)學會了如何通過調(diào)整其權(quán)重/過濾器并減少輸出誤差的方式對特定圖像進行正確分類。
過濾器數(shù)量、大小,網(wǎng)絡結(jié)構(gòu)等參數(shù)在步驟1之前都已經(jīng)固定,并且在訓練過程中不會改變 —— 只會更新濾器矩陣和連接權(quán)值。
步驟5:對訓練集中的所有圖像重復步驟2-4。
通過以上步驟就可以訓練出卷積神經(jīng)網(wǎng)絡 —— 這實際上意味著卷積神經(jīng)網(wǎng)絡中的所有權(quán)重和參數(shù)都已經(jīng)過優(yōu)化,可以對訓練集中的圖像進行正確分類。
當我們給卷積神經(jīng)網(wǎng)絡中輸入一個新的(未見過的)圖像時,網(wǎng)絡會執(zhí)行前向傳播步驟并輸出每個類的概率(對于新圖像,計算輸出概率所用的權(quán)重是之前優(yōu)化過,并能夠?qū)τ柧毤耆_分類的)。如果我們的訓練集足夠大,神經(jīng)網(wǎng)絡會有很好的泛化能力(但愿如此)并將新圖片分到正確的類里。
注1:為了給大家提供一個直觀的訓練過程,上述步驟已經(jīng)簡化了很多,并且忽略了數(shù)學推導過程。如果想要數(shù)學推導以及對卷積神經(jīng)網(wǎng)絡透徹的理解,請參閱 [4] 和 [12]。
注2:上面的例子中,我們使用了兩組交替的卷積和池化層。但請注意,這些操作可以在一個卷積神經(jīng)網(wǎng)絡中重復執(zhí)行多次。實際上,現(xiàn)在效果最好的一些卷積神經(jīng)網(wǎng)絡都包含幾十個卷積和池化層! 另外,每個卷積層之后的池化層不是必需的。從下面的圖15中可以看出,在進行池化操作之前,我們可以連續(xù)進行多個卷積 + ReLU 操作。另外請注意圖16卷積神經(jīng)網(wǎng)絡的每一層是如何展示的。
圖15
卷積神經(jīng)網(wǎng)絡的可視化
一般來說,卷積步驟越多,神經(jīng)網(wǎng)絡能夠?qū)W習識別的特征就更復雜。例如,在圖像分類中,卷積神經(jīng)網(wǎng)絡在第一層可能會學習檢測原始像素的邊緣,然后在第二層利用這些邊緣檢測簡單形狀,然后在更高級的層用這些形狀來檢測高級特征,例如面部形狀 [14]。圖16演示了這個過程 —— 這些特征是使用卷積深度信念網(wǎng)絡學習的,這張圖片只是為了演示思路(這只是一個例子:實際上卷積過濾器識別出來的對象可能對人來說并沒有什么意義)。
圖16: 卷積深度信念網(wǎng)絡學習特征
Adam Harley 創(chuàng)建了一個基于 MNIST 手寫數(shù)字數(shù)據(jù)集 [13]訓練卷積神經(jīng)網(wǎng)絡的可視化。我強烈推薦大家使用它來了解卷積神經(jīng)網(wǎng)絡的工作細節(jié)。
我們在下圖中可以看到神經(jīng)網(wǎng)絡對于輸入數(shù)字“8”的具體操作細節(jié)。請注意,圖18中并未單獨顯示ReLU操作。
圖17:基于手寫數(shù)字訓練卷積神經(jīng)網(wǎng)絡的可視化
輸入圖像包含 1024 個像素點(32 × 32 圖像),第一個卷積層(卷積層1)由六個不同的5 × 5(步幅為1)過濾器與輸入圖像卷積而成。如圖所示,使用六個不同的過濾器得到深度為六的特征映射。
卷積層1之后是池化層1,它在卷積層1中的六個特征映射上分別進行2 × 2最大池化(步幅為2)。將鼠標指針移動到池化層的任意像素上,可以觀察到它來自于2 x 2網(wǎng)格在前一個卷積層中的作用(如圖18所示)。注意到2 x 2網(wǎng)格中具有最大值(最亮的那個)的像素點會被映射到池化層。
圖18:池化操作可視化
池化層1之后是十六個執(zhí)行卷積操作的5 × 5(步幅為1)卷積過濾器。然后是執(zhí)行2 × 2最大池化(步幅為2)的池化層2。 這兩層的作用與上述相同。
然后有三個完全連接(FC)層:
第一個FC層中有120個神經(jīng)元
第二個FC層中有100個神經(jīng)元
第三個FC層中的10個神經(jīng)元對應于10個數(shù)字 —— 也稱為輸出層
注意,在圖19中,輸出層的10個節(jié)點每一個都連接到第二個完全連接層中的全部100個節(jié)點(因此稱為完全連接)。
另外,注意為什么輸出層中唯一明亮的節(jié)點是’8’ —— 這意味著神經(jīng)網(wǎng)絡對我們的手寫數(shù)字進行了正確分類(節(jié)點亮度越高表示它的輸出更高,即8在所有數(shù)字中具有最高的概率)。
圖19:完全連接層可視化
該可視化系統(tǒng)的 3D 版本在此。
其他卷積神經(jīng)網(wǎng)絡框架
卷積神經(jīng)網(wǎng)絡始于20世紀90年代初。我們已經(jīng)討論了LeNet,它是最早的卷積神經(jīng)網(wǎng)絡之一。下面列出了其他一些有影響力的神經(jīng)網(wǎng)絡框架 [3] [4]。
LeNet (20世紀90年代):本文已詳述。
20世紀90年代到2012年:從20世紀90年代后期到2010年初,卷積神經(jīng)網(wǎng)絡正處于孵化期。隨著越來越多的數(shù)據(jù)和計算能力的提升,卷積神經(jīng)網(wǎng)絡可以解決的任務變得越來越有趣。
AlexNet(2012)– 2012年,Alex Krizhevsky(和其他人)發(fā)布了AlexNet,它是提升了深度和廣度版本的 LeNet,并在2012年以巨大優(yōu)勢贏得了 ImageNet 大規(guī)模視覺識別挑戰(zhàn)賽(ILSVRC)。這是基于之前方法的重大突破,目前 CNN 的廣泛應用都要歸功于 AlexNet。
ZF Net(2013)– 2013年 ILSVRC 獲獎者來自 Matthew Zeiler 和 Rob Fergus 的卷積網(wǎng)絡。它被稱為ZFNet(Zeiler 和 Fergus Net 的簡稱)。它在 AlexNet 的基礎(chǔ)上通過調(diào)整網(wǎng)絡框架超參數(shù)對其進行了改進。
GoogLeNet(2014)– 2014年 ILSVRC 獲獎者是 Google 的Szegedy 等人的卷積網(wǎng)絡。其主要貢獻是開發(fā)了一個初始模塊,該模塊大大減少了網(wǎng)絡中的參數(shù)數(shù)量(4M,而 AlexNet 有60M)。
VGGNet(2014)– 2014年 ILSVRC 亞軍是名為VGGNet的網(wǎng)絡。其主要貢獻在于證明了網(wǎng)絡深度(層數(shù))是影響性能的關(guān)鍵因素。
ResNets(2015)– 何凱明(和其他人)開發(fā)的殘差網(wǎng)絡是2015年 ILSVRC 的冠軍。ResNets 是迄今為止最先進的卷積神經(jīng)網(wǎng)絡模型,并且是大家在實踐中使用卷積神經(jīng)網(wǎng)絡的默認選擇(截至2016年5月)。
DenseNet(2016年8月)– 最近由黃高等人發(fā)表,密集連接卷積網(wǎng)絡的每一層都以前饋方式直接連接到其他層。 DenseNet 已經(jīng)在五項競爭激烈的對象識別基準測試任務中證明自己比之前最先進的框架有了顯著的改進。
-
神經(jīng)網(wǎng)絡
+關(guān)注
關(guān)注
42文章
4734瀏覽量
100420 -
圖像識別
+關(guān)注
關(guān)注
9文章
518瀏覽量
38212
原文標題:直白介紹自動駕駛中感知卷積神經(jīng)網(wǎng)絡(CNN)
文章出處:【微信號:IV_Technology,微信公眾號:智車科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論