卷積神經網絡超詳細介紹

文章目錄

1、卷積神經網絡的概念

2、 發展過程

3、如何利用CNN實現圖像識別的任務

4、CNN的特徵

5、CNN的求解

6、卷積神經網絡注意事項

7、CNN發展綜合介紹

8、LeNet-5結構分析

9、AlexNet

10、ZFNet

10.1 意義

10.2 實現方法

10.3 訓練細節

10.4 卷積網絡可視化

10.6 總結

11、VGGNet

11.1 結構

11.2 網絡特點:

11.3 分類框架:

12、GoogLeNet

12.1 GoogLeNet Inception V1——22層

12.2 GoogLeNet

12.3 GoogleNet Inception V2

12.4 GoogLeNet Inception V3

12.4.1 簡介

12.4.2 一般情況的設計準則

12.4.3 利用大尺度濾波器進行圖像的卷積

13、ResNet

13.1 ResNet的提出

13.2 ResNet的意義

13.3 ResNet結構

13.4 ResNet50和ResNet101

13.5 基於ResNet101的Faster RCNN

14、區域 CNN:R-CNN(2013年)、Fast R-CNN(2015年)、Faster R-CNN(2015年)

15、生成式對抗網絡

16、深度學習在計算機視覺上的應用

17、深度有監督學習在計算機視覺領域的進展

17.1 圖像分類

17.2 圖像檢測(Image Dection)

17.4 圖像標註–看圖說話(Image Captioning)

18、強化學習(Reinforcement Learning)

1、卷積神經網絡的概念

計算機視覺和 CNN 發展十一座里程碑

上世紀60年代,Hubel等人通過對貓視覺皮層細胞的研究,提出了感受野這個概念,到80年代,Fukushima在感受野概念的基礎之上提出了神經認知機的概念,可以看作是卷積神經網絡的第一個實現網絡,神經認知機將一個視覺模式分解成許多子模式(特徵),然後進入分層遞階式相連的特徵平面進行處理,它試圖將視覺系統模型化,使其能夠在即使物體有位移或輕微變形的時候,也能完成識別。

卷積神經網絡是多層感知機(MLP)的變種,由生物學家休博爾和維瑟爾在早期關於貓視覺皮層的研究發展而來,視覺皮層的細胞存在一個複雜的構造,這些細胞對視覺輸入空間的子區域非常敏感,稱之為感受野。

CNN由紐約大學的Yann Lecun於1998年提出,其本質是一個多層感知機,成功的原因在於其所採用的局部連接和權值共享的方式:

一方面減少了權值的數量使得網絡易於優化

另一方面降低了模型的複雜度,也就是減小了過擬合的風險

該優點在網絡的輸入是圖像時表現的更為明顯,使得圖像可以直接作為網絡的輸入,避免了傳統識別算法中複雜的特徵提取和數據重建的過程,在二維圖像的處理過程中有很大的優勢,如網絡能夠自行抽取圖像的特徵包括顏色、紋理、形狀及圖像的拓撲結構,在處理二維圖像的問題上,特別是識別位移、縮放及其他形式扭曲不變性的應用上具有良好的魯棒性和運算效率等。

名稱特點

LeNet5沒啥特點-不過是第一個CNN應該要知道

AlexNet引入了ReLU和dropout,引入數據增強、池化相互之間有覆蓋,三個卷積一個最大池化+三個全連接層

VGGNet採用11和33的卷積核以及2*2的最大池化使得層數變得更深。常用VGGNet-16和VGGNet19

Google Inception Net這個在控制了計算量和參數量的同時,獲得了比較好的分類性能,和上面相比有幾個大的改進:1、去除了最後的全連接層,而是用一個全局的平均池化來取代它; 2、引入Inception Module,這是一個4個分支結合的結構。所有的分支都用到了11的卷積,這是因為11性價比很高,可以用很少的參數達到非線性和特徵變換。3、Inception V2第二版將所有的55變成2個33,而且提出來著名的Batch Normalization;4、Inception V3第三版就更變態了,把較大的二維卷積拆成了兩個較小的一維卷積,加速運算、減少過擬合,同時還更改了Inception Module的結構。

微軟ResNet殘差神經網絡(Residual Neural Network)1、引入高速公路結構,可以讓神經網絡變得非常深2、ResNet第二個版本將ReLU激活函數變成y=x的線性函數

2、 發展過程

1986年Rumelhart等人提出了人工神經網絡的反向傳播算法,掀起了神經網絡在機器學習中的熱潮,神經網絡中存在大量的參數,存在容易發生過擬合、訓練時間長的缺點,但是對比Boosting、Logistic迴歸、SVM等基於統計學習理論的方法(也可以看做具有一層隱層節點或不含隱層節點的學習模型,被稱為淺層模型)來說,具有較大的優越性。

淺層模型為什麼效果沒有深層模型好?

淺層學習模型通常要由人工的方法來獲得好的樣本特性,在此基礎上進行識別和預測,因此方法的有效性在很大程度上受到特徵提取的制約。

深度學習的提出:

2006年,Hinton提出了深度學習,兩個主要的觀點是:

多隱層的人工神經網絡具有優異的特徵學習能力,學習到的數據更能反映數據的本質特徵有利於可視化或分類

深度神經網絡在訓練上的難度,可以通過逐層無監督訓練有效克服,

深度學習取得成功的原因:

大規模數據(例如ImageNet):為深度學習提供了好的訓練資源

計算機硬件的飛速發展:特別是GPU的出現,使得訓練大規模上網絡成為可能

深度學習的思想:

深度神經網絡的基本思想是通過構建多層網絡,對目標進行多層表示,以期通過多層的高層次特徵來表示數據的抽象語義信息,獲得更好的特徵魯棒性。

什麼是卷積神經網絡:

卷積神經網絡是一種帶有卷積結構的深度神經網絡,卷積結構可以減少深層網絡佔用的內存量,其三個關鍵的操作,其一是局部感受野,其二是權值共享,其三是pooling層,有效的減少了網絡的參數個數,緩解了模型的過擬合問題。

1)網絡結構

**卷積神經網絡整體架構:**卷積神經網絡是一種多層的監督學習神經網絡,隱含層的卷積層和池採樣層是實現卷積神經網絡特徵提取功能的核心模塊。該網絡模型通過採用梯度下降法最小化損失函數對網絡中的權重參數逐層反向調節,通過頻繁的迭代訓練提高網絡的精度。卷積神經網絡的低隱層是由卷積層和最大池採樣層交替組成,高層是全連接層對應傳統多層感知器的隱含層和邏輯迴歸分類器。第一個全連接層的輸入是由卷積層和子採樣層進行特徵提取得到的特徵圖像。最後一層輸出層是一個分類器,可以採用邏輯迴歸,Softmax迴歸甚至是支持向量機對輸入圖像進行分類。

卷積神經網絡結構包括:卷積層,降採樣層,全鏈接層。每一層有多個特徵圖,每個特徵圖通過一種卷積濾波器提取輸入的一種特徵,每個特徵圖有多個神經元。

輸入圖像統計和濾波器進行卷積之後,提取該局部特徵,一旦該局部特徵被提取出來之後,它與其他特徵的位置關係也隨之確定下來了,每個神經元的輸入和前一層的局部感受野相連,每個特徵提取層都緊跟一個用來求局部平均與二次提取的計算層,也叫特徵映射層,網絡的每個計算層由多個特徵映射平面組成,平面上所有的神經元的權重相等。

通常將輸入層到隱藏層的映射稱為一個特徵映射,也就是通過卷積層得到特徵提取層,經過pooling之後得到特徵映射層。

2)局部感受野與權值共享

卷積神經網絡的核心思想就是局部感受野、是權值共享和pooling層,以此來達到簡化網絡參數並使得網絡具有一定程度的位移、尺度、縮放、非線性形變穩定性。

局部感受野:由於圖像的空間聯繫是局部的,每個神經元不需要對全部的圖像做感受,只需要感受局部特徵即可,然後在更高層將這些感受得到的不同的局部神經元綜合起來就可以得到全局的信息了,這樣可以減少連接的數目。

權值共享:不同神經元之間的參數共享可以減少需要求解的參數,使用多種濾波器去卷積圖像就會得到多種特徵映射。權值共享其實就是對圖像用同樣的卷積核進行卷積操作,也就意味著第一個隱藏層的所有神經元所能檢測到處於圖像不同位置的完全相同的特徵。其主要的能力就能檢測到不同位置的同一類型特徵,也就是卷積網絡能很好的適應圖像的小範圍的平移性,即有較好的平移不變性(比如將輸入圖像的貓的位置移動之後,同樣能夠檢測到貓的圖像)

3)卷積層、下采樣層、全連接層

卷積層:因為通過卷積運算我們可以提取出圖像的特徵,通過卷積運算可以使得原始信號的某些特徵增強,並且降低噪聲。

用一個可訓練的濾波器fx去卷積一個輸入的圖像(第一階段是輸入的圖像,後面的階段就是卷積特徵map了),然後加一個偏置bx,得到卷積層Cx。

下采樣層:因為對圖像進行下采樣,可以減少數據處理量同時保留有用信息,採樣可以混淆特徵的具體位置,因為某個特徵找出來之後,它的位置已經不重要了,我們只需要這個特徵和其他特徵的相對位置,可以應對形變和扭曲帶來的同類物體的變化。

每鄰域四個像素求和變為一個像素,然後通過標量Wx+1加權,再增加偏置bx+1,然後通過一個sigmoid激活函數,產生一個大概縮小四倍的特徵映射圖Sx+1。 **

全連接層:採用softmax全連接,得到的激活值即卷積神經網絡提取到的圖片特徵。

卷積神經網絡相比一般神經網絡在圖像理解中的優點:

網絡結構能夠較好的適應圖像的結構

同時進行特徵提取和分類,使得特徵提取有助於特徵分類

權值共享可以減少網絡的訓練參數,使得神經網絡結構變得簡單,適應性更強

3、如何利用CNN實現圖像識別的任務

輸入層讀入經過規則化(統一大小)的圖像,每一層的每個神經元將前一層的一組小的局部近鄰的單元作為輸入,也就是局部感受野和權值共享,神經元抽取一些基本的視覺特徵,比如邊緣、角點等,這些特徵之後會被更高層的神經元所使用。卷積神經網絡通過卷積操作獲得特徵圖,每個位置,來自不同特徵圖的單元得到各自不同類型的特徵。一個卷積層中通常包含多個具有不同權值向量的特徵圖,使得能夠保留圖像更豐富的特徵。卷積層後邊會連接池化層進行降採樣操作,一方面可以降低圖像的分辨率,減少參數量,另一方面可以獲得平移和形變的魯棒性。卷積層和池化層的交替分佈,使得特徵圖的數目逐步增多,而且分辨率逐漸降低,是一個雙金字塔結構。

4、CNN的特徵

1)具有一些傳統技術所沒有的優點:良好的容錯能力、並行處理能力和自學習能力,可處理環境信息複雜,背景知識不清楚,推理規則不明確情況下的問題,允許樣品有較大的缺損、畸變,運行速度快,自適應性能好,具有較高的分辨率。它是通過結構重組和減少權值將特徵抽取功能融合進多層感知器,省略識別前複雜的圖像特徵抽取過程。

2)泛化能力要顯著優於其它方法,卷積神經網絡已被應用於模式分類,物體檢測和物體識別等方面。利用卷積神經網絡建立模式分類器,將卷積神經網絡作為通用的模式分類器,直接用於灰度圖像。

3)是一個前潰式神經網絡,能從一個二維圖像中提取其拓撲結構,採用反向傳播算法來優化網絡結構,求解網絡中的未知參數。

4)一類特別設計用來處理二維數據的多層神經網絡。CNN被認為是第一個真正成功的採用多層層次結構網絡的具有魯棒性的深度學習方法。CNN通過挖掘數據中的空間上的相關性,來減少網絡中的可訓練參數的數量,達到改進前向傳播網絡的反向傳播算法效率,因為CNN需要非常少的數據預處理工作,所以也被認為是一種深度學習的方法。在CNN中,圖像中的小塊區域(也叫做“局部感知區域”)被當做層次結構中的底層的輸入數據,信息通過前向傳播經過網絡中的各個層,在每一層中都由過濾器構成,以便能夠獲得觀測數據的一些顯著特徵。因為局部感知區域能夠獲得一些基礎的特徵,比如圖像中的邊界和角落等,這種方法能夠提供一定程度對位移、拉伸和旋轉的相對不變性。

5)CNN中層次之間的緊密聯繫和空間信息使得其特別適用於圖像的處理和理解,並且能夠自動的從圖像抽取出豐富的相關特性。

6)CNN通過結合局部感知區域、共享權重、空間或者時間上的降採樣來充分利用數據本身包含的局部性等特徵,優化網絡結構,並且保證一定程度上的位移和變形的不變性。

7)CNN是一種深度的監督學習下的機器學習模型,具有極強的適應性,善於挖掘數據局部特徵,提取全局訓練特徵和分類,它的權值共享結構網絡使之更類似於生物神經網絡,在模式識別各個領域都取得了很好的成果。

8) CNN可以用來識別位移、縮放及其它形式扭曲不變性的二維或三維圖像。CNN的特徵提取層參數是通過訓練數據學習得到的,所以其避免了人工特徵提取,而是從訓練數據中進行學習;其次同一特徵圖的神經元共享權值,減少了網絡參數,這也是卷積網絡相對於全連接網絡的一大優勢。共享局部權值這一特殊結構更接近於真實的生物神經網絡使CNN在圖像處理、語音識別領域有著獨特的優越性,另一方面權值共享同時降低了網絡的複雜性,且多維輸入信號(語音、圖像)可以直接輸入網絡的特點避免了特徵提取和分類過程中數據重排的過程。

9)CNN的分類模型與傳統模型的不同點在於其可以直接將一幅二維圖像輸入模型中,接著在輸出端即給出分類結果。其優勢在於不需複雜的預處理,將特徵抽取,模式分類完全放入一個黑匣子中,通過不斷的優化來獲得網絡所需參數,在輸出層給出所需分類,網絡核心就是網絡的結構設計與網絡的求解。這種求解結構比以往多種算法性能更高。

10)隱層的參數個數和隱層的神經元個數無關,只和濾波器的大小和濾波器種類的多少有關。隱層的神經元個數,它和原圖像,也就是輸入的大小(神經元個數)、濾波器的大小和濾波器在圖像中的滑動步長都有關。

5、CNN的求解

CNN在本質上是一種輸入到輸出的映射,它能夠學習大量的輸入與輸出之間的映射關係,而不需要任何輸入和輸出之間的精確的數學表達式,只要用已知的模式對卷積網絡加以訓練,網絡就具有輸入輸出對之間的映射能力。

卷積網絡執行的是監督訓練,所以其樣本集是由形如:**(輸入向量,理想輸出向量)**的向量對構成的。所有這些向量對,都應該是來源於網絡即將模擬系統的實際“運行”結構,它們可以是從實際運行系統中採集來。

1)參數初始化:

在開始訓練前,所有的權都應該用一些不同的隨機數進行初始化。“小隨機數”用來保證網絡不會因權值過大而進入飽和狀態,從而導致訓練失敗;“不同”用來保證網絡可以正常地學習。實際上,如果用相同的數去初始化權矩陣,則網絡無學習能力。

2)訓練過程包括四步

① 第一階段:前向傳播階段

從樣本集中取一個樣本,輸入網絡

計算相應的實際輸出;在此階段信息從輸入層經過逐級的變換,傳送到輸出層,這個過程也是網絡在完成訓練之後正常執行時執行的過程

② 第二階段:後向傳播階段

計算實際輸出與相應的理想輸出的差

按照極小化誤差的方法調整權值矩陣

網絡的訓練過程如下:

選定訓練組,從樣本集中分別隨機地尋求N個樣本作為訓練組;

將各權值、閾值,置成小的接近於0的隨機值,並初始化精度控制參數和學習率;

從訓練組中取一個輸入模式加到網絡,並給出它的目標輸出向量;

計算出中間層輸出向量,計算出網絡的實際輸出向量;

將輸出向量中的元素與目標向量中的元素進行比較,計算出輸出誤差;對於中間層的隱單元也需要計算出誤差;

依次計算出各權值的調整量和閾值的調整量;

調整權值和調整閾值;

當經歷M後,判斷指標是否滿足精度要求,如果不滿足,則返回(3),繼續迭代;如果滿足就進入下一步;

訓練結束,將權值和閾值保存在文件中。這時可以認為各個權值已經達到穩定,分類器已經形成。再一次進行訓練,直接從文件導出權值和閾值進行訓練,不需要進行初始化。

6、卷積神經網絡注意事項

1)數據集的大小和分塊

數據驅動的模型一般依賴於數據集的大小,CNN和其他經驗模型一樣,能夠適用於任意大小的數據集,但用於訓練的數據集應該足夠大, 能夠覆蓋問題域中所有已知可能出現的問題,

設計CNN的時候,數據集應該包含三個子集:訓練集、測試集、驗證集

訓練集:包含問題域中的所有數據,並在訓練階段用來調整網絡的權重

測試集:在訓練的過程中用於測試網絡對訓練集中未出現的數據的分類性能,根據網絡在測試集上的性能情況,網絡的結構可能需要作出調整,或者增加訓練循環次數。

驗證集:驗證集中的數據統一應該包含在測試集和訓練集中沒有出現過的數據,用於在網絡確定之後能夠更好的測試和衡量網絡的性能

Looney等人建議,數據集中65%的用於訓練,25%的用於測試,10%用於驗證

2)數據預處理

為了加速訓練算法的收斂速度,一般都會採用一些數據預處理技術,其中包括:去除噪聲、輸入數據降維、刪除無關數據等。

數據的平衡化在分類問題中異常重要,一般認為訓練集中的數據應該相對於標籤類別近似於平均分佈,也就是每一個類別標籤所對應的數據集在訓練集中是基本相等的,以避免網絡過於傾向於表現某些分類的特點。

為了平衡數據集,應該移除一些過度富餘的分類中的數據,並相應補充一些相對樣例稀少的分類中的數據。

還有一個方法就是複製一部分這些樣例稀少分類中的數據,並在這些數據中加入隨機噪聲。

3)數據規則化

將數據規則化到統一的區間(如[0,1])中具有很重要的優點:防止數據中存在較大數值的數據造成數值較小的數據對於訓練效果減弱甚至無效化,一個常用的方法是將輸入和輸出數據按比例調整到一個和激活函數相對應的區間。

4)網絡權值初始化

CNN的初始化主要是初始化卷積層和輸出層的卷積核(權值)和偏置

網絡權值初始化就是將網絡中的所有連接權重賦予一個初始值,如果初始權重向量處在誤差曲面的一個相對平緩的區域的時候,網絡訓練的收斂速度可能會很緩慢,一般情況下網絡的連接權重和閾值被初始化在一個具有0均值的相對小的區間內均勻分佈。

5)BP算法的學習速率

如果學習速率選取的較大,則會在訓練過程中較大幅度的調整權值w,從而加快網絡的訓練速度,但是這和造成網絡在誤差曲面上搜索過程中頻繁抖動,且有可能使得訓練過程不能收斂。

如果學習速率選取的較小,能夠穩定的使得網絡逼近於全局最優點,但也可能陷入一些局部最優,並且參數更新速度較慢。

自適應學習率設定有較好的效果。

6)收斂條件

有幾個條件可以作為停止訓練的判定條件,訓練誤差、誤差梯度、交叉驗證等。一般來說,訓練集的誤差會隨著網絡訓練的進行而逐步降低。

7)訓練方式

訓練樣例可以有兩種基本的方式提供給網絡訓練使用,也可以是兩者的結合:逐個樣例訓練(EET)、批量樣例訓練(BT)。

在EET中,先將第一個樣例提供給網絡,然後開始應用BP算法訓練網絡,直到訓練誤差降低到一個可以接受的範圍,或者進行了指定步驟的訓練次數。然後再將第二個樣例提供給網絡訓練。

EET的優點是相對於BT只需要很少的存儲空間,並且有更好的隨機搜索能力,防止訓練過程陷入局部最小區域。

EET的缺點是如果網絡接收到的第一個樣例就是劣質(有可能是噪音數據或者特徵不明顯)的數據,可能使得網絡訓練過程朝著全局誤差最小化的反方向進行搜索。

相對的,BT方法是在所有訓練樣例都經過網絡傳播後才更新一次權值,因此每一次學習週期就包含了所有的訓練樣例數據。

BT方法的缺點也很明顯,需要大量的存儲空間,而且相比EET更容易陷入局部最小區域。

而隨機訓練(ST)則是相對於EET和BT一種折衷的方法,ST和EET一樣也是一次只接受一個訓練樣例,但只進行一次BP算法並更新權值,然後接受下一個樣例重複同樣的步驟計算並更新權值,並且在接受訓練集最後一個樣例後,重新回到第一個樣例進行計算。

ST和EET相比,保留了隨機搜索的能力,同時又避免了訓練樣例中最開始幾個樣例如果出現劣質數據對訓練過程的過度不良影響。

7、CNN發展綜合介紹

CNN的開山之作是LeCun提出的LeNet-5,而其真正的爆發階段是2012年AlexNet取得ImageNet比賽的分類任務的冠軍,並且分類準確率遠遠超過利用傳統方法實現的分類結果,該模型能夠取得成功的原因主要有三個:

海量的有標記的訓練數據,也就是李飛飛團隊提供的大規模有標記的數據集ImageNet

計算機硬件的支持,尤其是GPU的出現,為複雜的計算提供了強大的支持

算法的改進,包括網絡結構加深、數據增強(數據擴充)、ReLU、Dropout等

AlexNet之後,深度學習便一發不可收拾,分類準確率每年都被刷榜,下圖展示了模型的變化情況,隨著模型的變深,Top-5的錯誤率也越來越低,目前已經降低到了3.5%左右,同樣的ImageNet數據集,人眼的辨識錯誤率大概為5.1%,也就是深度學習的識別能力已經超過了人類。

8、LeNet-5結構分析

LeNet-5共包含8層

C1層是一個卷積層,由6個特徵圖Feature Map構成。特徵圖中每個神經元與輸入為55的鄰域相連。特徵圖的大小為2828,這樣能防止輸入的連接掉到邊界之外(32-5+1=28)。C1有156個可訓練參數(每個濾波器55=25個unit參數和一個bias參數,一共6個濾波器,共(55+1)6=156個參數),共156(28*28)=122,304個連接。

S2層是一個下采樣層,有6個1414的特徵圖。特徵圖中的每個單元與C1中相對應特徵圖的22鄰域相連接。S2層每個單元的4個輸入相加,乘以一個可訓練參數,再加上一個可訓練偏置。每個單元的22感受野並不重疊,因此S2中每個特徵圖的大小是C1中特徵圖大小的1/4(行和列各1/2)。S2層有12(6(1+1)=12)個可訓練參數和5880(1414(2*2+1)*6=5880)個連接。

C3層也是一個卷積層,它同樣通過5x5的卷積核去卷積層S2,然後得到的特徵map就只有10x10個神經元,但是它有16種不同的卷積核,所以就存在16個特徵map了。 C3中每個特徵圖由S2中所有6個或者幾個特徵map組合而成。為什麼不把S2中的每個特徵圖連接到每個C3的特徵圖呢?原因有2點。第一,不完全的連接機制將連接的數量保持在合理的範圍內。第二,也是最重要的,其破壞了網絡的對稱性。由於不同的特徵圖有不同的輸入,所以迫使他們抽取不同的特徵(希望是互補的)。

例如,存在的一個方式是:C3的前6個特徵圖以S2中3個相鄰的特徵圖子集為輸入。接下來6個特徵圖以S2中4個相鄰特徵圖子集為輸入。然後的3個以不相鄰的4個特徵圖子集為輸入。最後一個將S2中所有特徵圖為輸入。這樣C3層有1516(6*(325+1)+6(425+1)+3(425+1)+(256+1)=1516)個可訓練參數和151600(10101516=151600)個連接。

S4層是一個下采樣層,由16個55大小的特徵圖構成。特徵圖中的每個單元與C3中相應特徵圖的22鄰域相連接,跟C1和S2之間的連接一樣。S4層有32個可訓練參數(每個特徵圖1個因子和一個偏置16*(1+1)=32)和2000(16*(2*2+1)55=2000)個連接。

C5層是一個卷積層,有120個特徵圖。每個單元與S4層的全部16個單元的55鄰域相連。由於S4層特徵圖的大小也為55(同濾波器一樣),故C5特徵圖的大小為11(5-5+1=1):這構成了S4和C5之間的全連接。之所以仍將C5標示為卷積層而非全相聯層,是因為如果LeNet-5的輸入變大,而其他的保持不變,那麼此時特徵圖的維數就會比11大。C5層有48120(120*(1655+1)=48120由於與全部16個單元相連,故只加一個偏置)個可訓練連接。

F6層有84個單元(之所以選這個數字的原因來自於輸出層的設計),與C5層全相連。有10164(84*(120*(1*1)+1)=10164)個可訓練參數。如同經典神經網絡,F6層計算輸入向量和權重向量之間的點積,再加上一個偏置。然後將其傳遞給sigmoid函數產生單元i的一個狀態。

最後,輸出層由歐式徑向基函數(Euclidean Radial Basis Function)單元組成,每類一個單元,每個有84個輸入。

1、輸入層:N個32x32的訓練樣本

輸入圖像大小為32x32,比MNIST數據庫中的字母大,這樣做的原因是希望潛在的明顯特徵,如筆畫斷點或角點能夠出現在最高層特徵監測子感受野的中心。

2、C1層

輸入圖像大小:32x32

卷積核大小:5x5

卷積核個數:6

輸出特徵圖數量:6

輸出特徵圖大小:28x28(32-5+1)

神經元數量:4707(28x28x6)

連接數:122304((28x28x5x5x6)+(28x28x6))

可訓練參數:156(5x5x6+6,權值+偏置)

3、S2層

輸入圖像大小:(28x28x6)

卷積核大小:2x2

卷積核個數:6

輸出特徵圖數量:6

輸出特徵圖大小:14x14(28/2,28/2)

神經元數量:1176(14x14x6)

連接數:5880((2x2x14x14x6)+(14x14x6))

可訓練參數:12(1x6+6,權值+偏置)

備註:S2層每個單元的4個輸入相加,乘以一個可訓練參數,再加上一個可訓練偏置。結果通過sigmoid函數計算。可訓練係數和偏置控制著sigmoid函數的非線性程度。

如果係數比較小,那麼運算近似於線性運算,下采樣相當於模糊圖像。

如果係數比較大,根據偏置的大小下采樣可以被看成是有噪聲的“或”運算或者有噪聲的“與”運算。

每個單元的2*2感受野並不重疊,因此S2中每個特徵圖的大小是C1中特徵圖大小的1/4(行和列各1/2)。

4、C3層

輸入圖像大小:(14x14x6)

卷積核大小:5x5

卷積核個數:16

輸出特徵圖數量:16

輸出特徵圖大小:10x10(14-5+1)

神經元數量:1600(10x10x16)

連接數:151600(1516x10x10)

可訓練參數:1516

備註:C3層也是一個卷積層,通過5x5的卷積核去卷積S2層,然後得到的特徵圖map就有10x10個神經元,但是有16種不同的卷積核,就存在16個不同的特徵map。

C3中每個特徵圖由S2中的所有6個或幾個特徵圖組合而成,為什麼不把S2中的所有特徵圖都連接到C3的特徵圖呢:

第一,不完全的連接機制將連接的數量保持在合理的範圍內

第二,也是最重要的,這樣一來就可以破壞網絡的對稱性,由於不同的特徵圖有不同的輸入,所以迫使他們抽取不同的特徵。

5、S4層

輸入圖像大小:(10x10x16)

卷積核大小:2x2

卷積核個數:16

輸出特徵圖數量:16

輸出特徵圖大小:5x5x16

神經元數量:400(5x5x16)

連接數:2000((2x2x5x5x16)+(5x5x16))

可訓練參數:32((1+1)x16)

備註:S4是一個下采樣層,由16個5x5大小的特徵圖構成,特徵圖的每個單元與C3中相應的特徵圖的2x2鄰域相連,S4層有32個可訓練參數(每個特徵圖1個因子和一個偏置)和2000個連接。

6、C5層

輸入圖像大小:5x5x16

卷積核大小:5x5

卷積核個數:120

輸出特徵圖數量:120

輸出特徵圖大小:1X1(5-5+1)

神經元數量:120(1x120)

連接數:48120(5x5x16x120x1+120x1)

可訓練參數:48120(5x5x16x120+120)

備註:C5層是一個卷積層,有120個特徵圖,每個單元與S4層的全部16個單元的5x5鄰域相連,構成了S4和C5的全連接,之所以仍將C5標識為卷積層而非全連接層是因為如果LeNet-5的輸入變大,而其他的保持不變,那麼此時特徵圖的維數就會比1x1大。

7、F6層

輸入圖像大小:(1x1x120)

卷積核大小:1x1

卷積核個數:84

輸出特徵圖數量:1

輸出特徵圖大小:84

神經元數量:84

連接數:10164(120x84+84)

可訓練參數:10164(120x84+84)

備註:F6有84個單元(之所以選擇84是源於輸出層的設計),與C5層相連,有10164個可訓練參數,類似經典的全連接神經網絡,F6層計算輸入向量和權重向量之間的點積,再加上一個偏置,之後將其傳遞給sigmoid函數產生一個單元i的狀態。

8、output層

輸入圖像大小:1x84

輸出特徵圖數量:1x10

9、AlexNet

超詳細介紹AlexNet

這篇論文,題目叫做“ImageNet Classification with Deep Convolutional Networks”,迄今被引用6184次,被業內普遍視為行業最重要的論文之一。Alex Krizhevsky、Ilya Sutskever和 Geoffrey Hinton創造了一個“大型的深度卷積神經網絡”,贏得了2012 ILSVRC(2012年ImageNet 大規模視覺識別挑戰賽)。稍微介紹一下,這個比賽被譽為計算機視覺的年度奧林匹克競賽,全世界的團隊相聚一堂,看看是哪家的視覺模型表現最為出色。2012年是CNN首次實現Top 5誤差率15.4%的一年(Top 5誤差率是指給定一張圖像,其標籤不在模型認為最有可能的5個結果中的幾率),當時的次優項誤差率為26.2%。這個表現不用說震驚了整個計算機視覺界。可以說,是自那時起,CNN才成了家喻戶曉的名字。

ImageNet 2012比賽分類任務的冠軍,將分類錯誤率降低到了15.315%,使用傳統計算機視覺的第二名小組的分類錯誤率為26.172%。

上圖所示是caffe中alexnet的網絡結構,上圖採用是兩臺GPU服務器,所有會看到兩個流程圖。下邊把AlexNet的網絡結構示意一下:

簡化的結構:

架構:

因為使用了兩臺GPU訓練,因而有兩股“流”。使用兩臺GPU訓練的原因是計算量太大,只能拆開來。

要點:

數據集:ImageNet數據集,含1500多萬個帶標記的圖像,超過2.2萬個類別

激活函數:ReLU(訓練速度快,一定程度上減小了梯度消失的問題)

數據增強:平移、鏡像、縮放等

過擬合:dropout

如何訓練:批處理梯度下降訓練模型,註明了動量衰減值和權值衰減值

訓練時間:使用兩臺GTX 580 GPU,訓練了5到6天

Alex Krizhevsky等人於2012年的ImageNet比賽中提出了新型卷積神經網絡AlexNet,並獲得了圖像分類問題的最好成績(Top-5錯誤率為15.3%)。

網絡結構:

其實AlexNet的結構很簡單,只是LeNet的放大版,輸入是一個224x224的圖像,經過5個卷積層,3個全連接層(包含一個分類層),達到了最後的標籤空間。

AlexNet學習出來的特徵是什麼樣子的?

第一層:都是一些填充的塊狀物和邊界等特徵

中間層:學習一些紋理特徵

更高層:接近於分類器的層級,可以明顯的看到物體的形狀特徵

最後一層:分類層,完全是物體的不同的姿態,根據不同的物體展現出不同姿態的特徵了。

即無論對什麼物體,學習過程都是:邊緣→ \\to→部分→ \\to→整體

該方法訓練了一個端到端的卷積神經網絡實現對圖像特徵提取和分類,網絡結構共7層,包含5層卷積層和2層全連接層。

AlexNet包含了6億三千萬個連接,6000萬個參數和65萬個神經元,擁有5個卷積層,其中3個卷積層後面連接了最大池化層,最後還有3個全連接層。

AlexNet可以說是神經網絡在低谷期後的第一次發聲,確立了深度學習(深度卷積神經網絡)在計算機界的統治地位,同時也推動了深度學習在語音識別、自然語言處理、強化學習等方面的拓展。

**訓練技巧:dropout防止過擬合,提高泛化能力 **

訓練階段使用了Dropout技巧隨機忽略一部分神經元,緩解了神經網絡的過擬合現象,和防止對網絡參數優化時陷入局部最優的問題,Dropout雖有單獨的論文論述,但是AlexNet將其實用化,通過實踐證實了它的效果。在AlexNet中主要是最後幾個全連接層使用了Dropout。

該網絡是利用Dropout在訓練過程中將輸入層和中間層的一些神經元隨機置零,使得訓練過程收斂的更慢,但得到的網絡模型更加具有魯棒性。

數據擴充 / 數據增強:防止過擬合

通過圖像平移、水平翻轉、調整圖像灰度等方法擴充樣本訓練集,擴充樣本訓練集,使得訓練得到的網絡對局部平移、旋轉、光照變化具有一定的不變性,數據經過擴充以後可以達到減輕過擬合併提升泛化能力。進行預測時,則是取圖像的四個角加上中間共5個位置,並進行左右翻轉,一共獲得10張圖像,對它們進行預測並對10次結果求均值。

水平翻轉:

隨機裁剪、平移旋轉:

顏色變換:

池化方式:

AlexNet全部使用最大池化的方式,避免了平均池化所帶來的模糊化的效果,並且步長

此前的CNN一直使用平均池化的操作。

激活函數:ReLU

Relu函數:f(x)=max(0,x)

採用非飽和線性單元——ReLU代替傳統的經常使用的tanh和sigmoid函數,加速了網絡訓練的速度,降低了計算的複雜度,對各種干擾更加具有魯棒性,並且在一定程度上避免了梯度消失問題。

優勢:

ReLU本質上是分段線性模型,前向計算非常簡單,無需指數之類操作;

ReLU的偏導也很簡單,反向傳播梯度,無需指數或者除法之類操作;

ReLU不容易發生梯度發散問題,Tanh和Logistic激活函數在兩端的時候導數容易趨近於零,多級連乘後梯度更加約等於0;

ReLU關閉了右邊,從而會使得很多的隱層輸出為0,即網絡變得稀疏,起到了類似L1的正則化作用,可以在一定程度上緩解過擬合。

缺點:

當然,ReLU也是有缺點的,比如左邊全部關了很容易導致某些隱藏節點永無翻身之日,所以後來又出現pReLU、random ReLU等改進,而且ReLU會很容易改變數據的分佈,因此ReLU後加Batch Normalization也是常用的改進的方法。

提出了LRN層(Local Response Normalization):

LRN即Local Response Normalization,局部響應歸一化處理,實際就是利用臨近的數據做歸一化,該策略貢獻了1.2%的準確率,該技術是深度學習訓練時的一種提高準確度的技術方法,LRN一般是在激活、池化後進行的一種處理方法。

LRN是對局部神經元的活動創建競爭機制,使得其中響應較大的值變得相對更大,並抑制其他反饋較小的神經元,增強了模型的泛化能力。

為什麼輸入數據需要歸一化(Normalized Data)?

歸一化後有什麼好處呢?原因在於神經網絡學習過程本質就是為了學習數據分佈,一旦訓練數據與測試數據的分佈不同,那麼網絡的泛化能力也大大降低;另外一方面,一旦每批訓練數據的分佈各不相同(batch 梯度下降),那麼網絡就要在每次迭代都去學習適應不同的分佈,這樣將會大大降低網絡的訓練速度,這也正是為什麼我們需要對數據都要做一個歸一化預處理的原因。

對於深度網絡的訓練是一個複雜的過程,只要網絡的前面幾層發生微小的改變,那麼後面幾層就會被累積放大下去。一旦網絡某一層的輸入數據的分佈發生改變,那麼這一層網絡就需要去適應學習這個新的數據分佈,所以如果訓練過程中,訓練數據的分佈一直在發生變化,那麼將會影響網絡的訓練速度。

分佈式計算:

AlexNet使用CUDA加速深度卷積網絡的訓練,利用GPU強大的並行計算能力,處理神經網絡訓練時大量的矩陣運算,AlexNet使用兩個GTX580的GPU進行訓練,單個GTX580只有3GB的顯存,限制了可訓練網絡的最大規模,因此將其分佈在兩個GPU上,在每個GPU的顯存中儲存一般的神經元參數。

有多少層需要訓練

整個AlexNet有8個需要訓練參數的層,不包括池化層和LRN層,前5層為卷積層,後3層為全連接層,AlexNet的最後一層是由1000類輸出的Softmax層用作分類,LRN層出現在第一個和第二個卷積層之後,最大池化層出現在兩個LRN之後和最後一個卷積層之後。

每層的超參數、參數量、計算量:

雖然前幾個卷積層的計算量很大,但是參數量都很小,在1M左右甚至更小。只佔AlexNet總參數量的很小一部分,這就是卷積層的作用,可以通過較小的參數量有效的提取特徵。

為什麼使用多層全連接:

全連接層在CNN中起到分類器的作用,前面的卷積層、池化層和激活函數層等操作是將原始數據映射到隱層特徵空間,全連接層是將學到的特徵映射映射到樣本標記空間,就是矩陣乘法,再加上激活函數的非線性映射,多層全連接層理論上可以模擬任何非線性變換。但缺點也很明顯: 無法保持空間結構。

由於全連接網絡的冗餘(佔整個我拿過來參數的80%),近期一些好的網絡模型使用全局平均池化(GAP)取代FC來融合學到的深度特徵,最後使用softmax等損失函數作為網絡目標函數來指導學習過程,用GAP替代FC的網絡通常有較好的預測性能。

全連接的一個作用是維度變換,尤其是可以把高維變到低維,同時把有用的信息保留下來。全連接另一個作用是隱含語義的表達(embedding),把原始特徵映射到各個隱語義節點(hidden node)。對於最後一層全連接而言,就是分類的顯示錶達。不同channel同一位置上的全連接等價與1x1的卷積。N個節點的全連接可近似為N個模板卷積後的均值池化(GAP)。

GAP:假如最後一層的數據是10個66的特徵圖,global average pooling是將每個特徵圖計算所有像素點的均值,輸出一個數據值,10個特徵圖就會輸出10個值,組成一個110的特徵向量。

用特徵圖直接表示屬於某類的置信率,比如有10個輸出,就在最後輸出10個特徵圖,每個特徵圖的值加起來求均值,然後將均值作為其屬於某類的置信值,再輸入softmax中,效果較好。

因為FC的參數眾多,這麼做就減少了參數的數量(在最近比較火的模型壓縮中,這個優勢可以很好的壓縮模型的大小)。

因為減少了參數的數量,可以很好的減輕過擬合的發生。

為什麼過了20年才捲土重來:

1. 大規模有標記數據集的出現,防止以前不可避免的過擬合現象

**2. 計算機硬件的突飛猛進,卷積神經網絡對計算機的運算要求比較高,需要大量重複可並行化的計算,在當時CPU只有單核且運算能力比較低的情況下,不可能進行個很深的卷積神經網絡的訓練。隨著GPU計算能力的增長,卷積神經網絡結合大數據的訓練才成為可能。 **

3. 卷積神經網絡有一批一直在堅持的科學家(如Lecun)才沒有被沉默,才沒有被海量的淺層方法淹沒。然後最後終於看到卷積神經網絡佔領主流的曙光。

10、ZFNet

和AlexNet很像,只是把參數優化了。

2012年AlexNet出盡了風頭,ILSVRC 2013就有一大批CNN模型冒了出來。2013年的冠軍是紐約大學Matthew Zeiler 和 Rob Fergus設計的網絡 ZF Net,錯誤率 11.2%。ZF Net模型更像是AlexNet架構的微調優化版,但還是提出了有關優化性能的一些關鍵想法。還有一個原因,這篇論文寫得非常好,論文作者花了大量時間闡釋有關卷積神經網絡的直觀概念,展示了將濾波器和權重可視化的正確方法。

在這篇題為“Visualizing and Understanding Convolutional Neural Networks”的論文中,Zeiler和Fergus從大數據和GPU計算力讓人們重拾對CNN的興趣講起,討論了研究人員對模型內在機制知之甚少,一針見血地指出“發展更好的模型實際上是不斷試錯的過程”。雖然我們現在要比3年前知道得多一些了,但論文所提出的問題至今仍然存在!這篇論文的主要貢獻在於提出了一個比AlexNet稍微好一些的模型並給出了細節,還提供了一些製作可視化特徵圖值得借鑑的方法。

10.1 意義

該論文是在AlexNet基礎上進行了一些細節的改動,網絡結構上並沒有太大的突破。該論文最大的貢獻在於通過使用可視化技術揭示了神經網絡各層到底在幹什麼,起到了什麼作用。

從科學的觀點出發,如果不知道神經網絡為什麼取得了如此好的效果,那麼只能靠不停的實驗來尋找更好的模型。

使用一個多層的反捲積網絡來可視化訓練過程中特徵的演化及發現潛在的問題;同時根據遮擋圖像局部對分類結果的影響來探討對分類任務而言到底那部分輸入信息更重要。

10.2 實現方法

訓練過程:

對前一層的輸入進行卷積 -> relu -> max pooling(可選) -> 局部對比操作(可選) -> 全連接層 -> softmax分類器。

輸入是(x,y),計算y與y的估計值之間的交叉熵損失,反向傳播損失值的梯度,使用隨機梯度下降算法來更新參數(w和b)以完成模型的訓練。

反捲積可視化:

一個卷積層加一個對應的反捲積層;

輸入是feature map,輸出是圖像像素;

過程包括反池化操作、relu和反捲積過程。

反池化:

嚴格意義上的反池化是無法實現的。作者採用近似的實現,在訓練過程中記錄每一個池化操作的一個z*z的區域內輸入的最大值的位置,這樣在反池化的時候,就將最大值返回到其應該在的位置,其他位置的值補0。

relu:

卷積神經網絡使用relu非線性函數來保證輸出的feature map總是為正數。在反捲積的時候,也需要保證每一層的feature map都是正值,所以這裡還是使用relu作為非線性激活函數。

濾波:

使用原卷積核的轉秩和feature map進行卷積。反捲積其實是一個誤導,這裡真正的名字就是轉秩卷積操作。

上圖左邊是一個解卷積層,右邊為一個卷積層,解卷積層將會重建一個來自下一層的卷積特徵近似版本,圖中使用switch來記錄在卷積網中進行最大池化操作時每個池化區域的局部最大值的位置,經過非池化操作後,原來的非最大值的位置全都置為0。

預處理:

網絡對輸入圖片進行預處理,裁剪圖片中間的256x256區域,並減去整個圖像每個像素的均值,然後用10個不同的對256x256圖像進行224x224的裁剪(中間區域加上四個角落,以及他們的水平翻轉圖像),對以128個圖片分的塊進行隨機梯度下降法來更新參數。起始學習率為$10 ^{−2} $ ,動量為0.9,當驗證集誤差停滯時,手動調整學習率。在全連接網絡中使用概率為0.5的dropout,並且所有權值都初始化為$10 ^{−2} $ ,偏置設為0。

在訓練時第一層的可視化揭露了一些佔主導的因素,為了瞭解這些,我們採用重新歸一化每個卷積層的濾波器,這些濾波器的均方根值超過了一個固定半徑的$10 ^{−1} $ 。這是非常關鍵的,尤其是在模型中的第一層,因為輸出圖片大約在[-128,128]的範圍內。

特徵可視化:

每個特徵單獨投影到像素空間揭露了不同的結構能刺激不同的一個給定的特徵圖,因此展示了它對於變形的輸入內在的不變性。下圖即在一個已經訓練好的網絡中可視化後的圖。

10.3 訓練細節

網絡結構類似於AlexNet,有兩點不同,一是將3,4,5層的變成了全連接,二是卷積核的大小減小。

圖像預處理和訓練過程中的參數設置也和AlexNet很像。

AlexNet用了1500萬張圖像,ZFNet用了130萬張圖像。

AlexNet在第一層中使用了大小為11×11的濾波器,而ZF使用的濾波器大小為7x7,整體處理速度也有所減慢。做此修改的原因是,對於輸入數據來說,第一層卷積層有助於保留大量的原始象素信息。11×11的濾波器漏掉了大量相關信息,特別是因為這是第一層卷積層。

隨著網絡增大,使用的濾波器數量增多。

利用ReLU的激活函數,將交叉熵代價函數作為誤差函數,使用批處理隨機梯度下降進行訓練。

使用一臺GTX 580 GPU訓練了12天。

開發可視化技術“解卷積網絡”(Deconvolutional Network),有助於檢查不同的特徵激活和其對輸入空間關係。名字之所以稱為“deconvnet”,是因為它將特徵映射到像素(與卷積層恰好相反)。

解卷積層DeConvNet:

DeConvNet工作的基本原理是,每層訓練過的CNN後面都連一層“deconvet”,它會提供一條返回圖像像素的路徑。輸入圖像進入CNN之後,每一層都計算激活。然而向前傳遞。現在,假設我們想知道第4層卷積層某個特徵的激活值,我們將保存這個特徵圖的激活值,並將這一層的其他激活值設為0,再將這張特徵圖作為輸入送入deconvnet。Deconvnet與原來的CNN擁有同樣的濾波器。輸入經過一系列unpool(maxpooling倒過來),修正,對前一層進行過濾操作,直到輸入空間滿。

這一過程背後的邏輯在於,我們想要知道是激活某個特徵圖的是什麼結構。下面來看第一層和第二層的可視化。

ConvNet的第一層永遠是低層特徵檢測器,在這裡就是對簡單的邊緣、顏色進行檢測。第二層就有比較圓滑的特徵了。再來看第三、第四和第五層。

第二層應對角落和其他邊緣或者顏色的結合;第三層有更加複雜的不變性,捕捉到了相似的紋理;第四層顯示了特定類間顯著的差異性;第五層顯示了有顯著構成變化的整個物體。

這些層展示出了更多的高級特徵,比如狗的臉和鮮花。值得一提的是,在第一層卷積層後面,我們通常會跟一個池化層將圖像縮小(比如將 32x32x32 變為16x16x3)。這樣做的效果是加寬了第二層看原始圖像的視野。更詳細的內容可以閱讀論文。

訓練時的特徵演變過程:

外表突然的變化導致圖像中的一個變換即產生了最強烈的激活。模型的底層在少數幾個epoches就能收斂聚集,然而上層在一個相當多的epoches(40-50)之後才能有所變化,這顯示了讓模型完全訓練到完全收斂的必要性。可以由下圖看到顏色對比度都逐步增強。

特徵不變性:

一般來說,小的變化對於模型的第一層都有非常大的影響,但對於最高層的影響卻幾乎沒有。對於圖像的平移、尺度、旋轉的變化來說,網絡的輸出對於平移和尺度變化都是穩定的,但卻不具有旋轉不變性,除非目標圖像時旋轉對稱的。下圖為分別對平移,尺度,旋轉做的分析圖。

上圖按行順序分別為對5類圖像進行不同程度的垂直方向上的平移、尺度變換、旋轉對輸出結果影響的分析圖。按列順序分別為原始變換圖像,第一層中原始圖片和變換後的圖片的歐氏距離,第7層中原始圖片和變換後的圖片的歐氏距離,變換後圖片被正確分類的概率圖。

可視化不僅能夠看到一個訓練完的模型的內部操作,而且還能幫助選擇好的網絡結構。

ZF Net為什麼重要?

ZF Net不僅是2013年比賽的冠軍,還對CNN的運作機制提供了極好的直觀信息,展示了更多提升性能的方法。論文所描述的可視化方法不僅有助於弄清CNN的內在機理,也為優化網絡架構提供了有用的信息。Deconv可視化方法和 occlusion 實驗也讓這篇論文成了我個人的最愛。

10.4 卷積網絡可視化

特徵可視化:

通過對各層卷積核學習到的特徵進行可視化發現神經網絡學習到的特徵存在層級結構。第二層是學習到邊緣和角點檢測器,第三層學習到了一些紋理特徵,第四層學習到了對於指定類別圖像的一些不變性的特徵,例如狗臉、鳥腿,第五層得到了目標更顯著的特徵並且獲取了位置變化信息。

訓練過程中的特徵演化:

低層特徵經過較少epoch的訓練過程之後就學習的比較穩定了,層數越高越需要更多的epoch進行訓練。因此需要足夠多的epoch過程來保證順利的模型收斂。

特徵不變性:

卷積神經網絡具有平移和縮放不變性,並且層數越高不變性越強。但是不具有旋轉不變性。

特徵結構選擇:

作者通過可視化AlexNet第一層和第二層的特徵,發現比較大的stride和卷積核提取的特徵不理想,所以作者將第一層的卷積核從1111減小到77,將stride從4減小到2,實驗說明,這樣有助於分類性能的提升。

遮擋實驗:

遮擋實驗說明圖像的關鍵區域被遮擋之後對分類性能有很大的影響,說明分類過程中模型明確定位出了場景中的物體。

一致性分析:

不同圖像的指定目標局部塊之間是否存在一致性的關聯,作者認為深度模型可能默認學習到了這種關聯關係。作者通過對五張不同的狗的圖像進行局部遮擋,然後分析原圖和遮擋後的圖像的特徵之間的漢明距離的和值,值越小說明一致性越大。實驗表明,對不同的狗的圖像遮擋左眼、右眼和鼻子之後的漢明距離小於隨機遮擋,證明存在一定的關聯性。

10.6 總結

提出了一種可視化方法;

發現學習到的特徵遠不是無法解釋的,而是特徵間存在層次性,層數越深,特徵不變性越強,類別的判別能力越強;

通過可視化模型中間層,在alexnet基礎上進一步提升了分類效果;

遮擋實驗表明分類時模型和局部塊的特徵高度相關;

模型的深度很關鍵;

預訓練模型可以在其他數據集上fine-tuning得到很好的結果。

11、VGGNet

很適合做遷移學習,提到了一系列,VGG-16、VGG-19,不同層,參數也不同,最後選擇了D的參數,結果最好。

傳統的網絡訓練19層的網絡很不容易,很厲害。

VGGNet是牛津大學計算機視覺組(Visual?Geometry?Group)和Google DeepMind公司的研究員一起研發的的深度卷積神經網絡。

VGGNet探索了卷積神經網絡的深度與其性能之間的關係,通過反覆堆疊33的小型卷積核和22的最大池化層,VGGNet成功地構築了16~19層深的卷積神經網絡。VGGNet相比之前state-of-the-art的網絡結構,錯誤率大幅下降,並取得了ILSVRC 2014比賽分類項目的第2名和定位項目的第1名。

VGGNet論文中全部使用了33的卷積核和22的池化核,通過不斷加深網絡結構來提升性能。下圖所示為VGGNet各級別的網絡結構圖,和每一級別的參數量,從11層的網絡一直到19層的網絡都有詳盡的性能測試。

A網絡(11層)有8個卷積層和3個全連接層,E網絡(19層)有16個卷積層和3個全連接層,卷積層寬度(通道數)從64到512,每經過一次池化操作,擴大一倍。

11.1 結構

輸入:訓練時輸入大小為224x224大小的RGB圖像;

預處理:在訓練集中的每個像素減去RGB的均值

卷積核:3x3大小的卷積核,有的地方使用1x1的卷積,這種1x1的卷積可以被看做是對輸入通道的線性變換。

步長:步長stride為1

填充:填充1個像素

池化:max-pooling,共有5層在一部分卷積層之後,連接的max-pooling的窗口是2x2,步長為2

全連接層:前兩個全連接層均有4096個通道,第三個全連接層由1000個通道,用來分類。所有網絡的全連接層配置相同。

激活函數:ReLU

不使用LRN,這種標準化並不能帶來很大的提升,反而會導致更多的內存消耗和計算時間

相比AlexNet的變化:

LRN層作用不大,還耗時,拋棄

網絡越深,效果越好

卷積核使用更小的卷積核,比如3x3

VGG雖然比AlexNet模型層數多,且每輪訓練時間會比AlexNet更長,但是因為更深的網絡和更小的卷積核帶來的隱式正則化結果,需要的收斂的迭代次數減小了許多。

要點:

這裡使用3x3的濾波器和AlexNet在第一層使用11x11的濾波器和ZF Net 7x7的濾波器作用完全不同。作者認為兩個3x3的卷積層組合可以實現5x5的有效感受野。這就在保持濾波器尺寸較小的同時模擬了大型濾波器,減少了參數。此外,有兩個卷積層就能夠使用兩層ReLU。

3卷積層具有7x7的有效感受野。

每個maxpool層後濾波器的數量增加一倍。進一步加強了縮小空間尺寸,但保持深度增長的想法。

圖像分類和定位任務都運作良好。

使用Caffe工具包建模。

訓練中使用scale jittering的數據增強技術。

每層卷積層後使用ReLU層和批處理梯度下降訓練。

使用4臺英偉達Titan Black GPU訓練了兩到三週。

為什麼重要?

VGG Net是最重要的模型之一,因為它再次強調CNN必須夠深,視覺數據的層次化表示才有用。深的同時結構簡單。

11.2 網絡特點:

VGGNet使用3x3的卷積

AlexNet和ZFNet在第一個卷積層的卷積分別是11x11 、步長為4,7x7、步長為2)

使用三個3x3的卷積,而不是一個7x7的卷積

兩個連續的3x3的卷積相當於5x5的感受野,三個相當於7x7的感受野,優勢在於:① 包含三個ReLU層而不是一個,使得決策函數更有判別性;② 減少了參數,比如輸入輸出都是c個通道,使用3x3的3個卷積層需要3(3x3xCxC)=27xCxC,使用7x7的1個卷積層需要7x7xCxC=49xCxC,這可以看做是為7x7x的卷積施加一種正則化,使它分解為3個3x3的卷積。

使用1x1的卷積層,該層主要是為了增加決策函數的非線性,而不影響卷積層的感受野,雖然1x1的卷積操作是線性的,但是ReLU增加了非線性

11.3 分類框架:

a. 訓練過程:

除了從多尺度的訓練圖像上採樣輸入圖像外,VGGNet和AlexNet類似

**優化方法:**是含有動量的隨機梯度下降SGD+momentum(0.9)

批尺度: batch size = 256

**正則化:**採用L2正則化,weight decay 是5e-4,dropout在前兩個全連接層之後,p=0.5

為什麼能在相比AlexNet網絡更深,參數更多的情況下,VGGNet能在更少的週期內收斂:

① 更大的深度和更小的卷積核帶來隱式正則化;② 一些層的預訓練

參數初始化:

對於較淺的A網絡,參數進行隨機初始化,權值w從N(0,0.01)中採樣,偏差bias初始化為0;對於較深的網絡,先用A網絡的參數初始化前四個卷積層和三個全連接層。

數據預處理:

為了獲得224x224的輸入圖像,要在每個SGD迭代中對每張重新縮放的圖像進行隨機裁剪,為了增強數據集,裁剪的圖像還要隨機水平翻轉和RGB色彩偏移。

b. 測試過程

對輸入圖像重新縮放到一個預定義的最小圖像邊的尺寸Q

網絡密集地應用在重縮放後的圖像上,也就是說全連接層轉化為卷積層(第一個全連接層轉化為7x7的卷積層,後兩個全連接層轉化為1x1的卷積層),然後將轉化後的全連接層應用在整張圖中)

為了獲得固定尺寸的類別分數向量,對分數圖進行空間平均化處理。

c. 實現

基於C++ Caffe,進行一些重要修改,在單系統多GPU上訓練。

在裝有4個NVIDIA Titan Black GPUs的電腦上,訓練一個網絡需要2-3周。

12、GoogLeNet

ImageNet 2014比賽分類任務的冠軍,將錯誤率降低到了6.656%,突出的特點是大大增加了卷積神經網絡的深度。

將最後的全連接層都換成了1x1的卷積層,大大加速了訓練速率。

12.1 GoogLeNet Inception V1——22層

GoogLeNet Incepetion V1《Going deeper with convolutions》。之所以名為“GoogLeNet”而非“GoogleNet”,文章說是為了向早期的LeNet致敬。

1)動機:

深度學習以及神經網絡快速發展,人們不再只關注更給力的硬件、更大的數據集、更大的模型,而是更在意新的idea、新的算法以及模型的改進。

一般來說,提升網絡性能最直接的辦法就是增加網絡深度和寬度,這也就意味著巨量的參數。但是,巨量參數容易產生過擬合也會大大增加計算量。

文章認為解決上述兩個缺點的根本方法是將全連接甚至一般的卷積都轉化為稀疏連接。一方面現實生物神經系統的連接也是稀疏的,另一方面有文獻1表明:對於大規模稀疏的神經網絡,可以通過分析激活值的統計特性和對高度相關的輸出進行聚類來逐層構建出一個最優網絡。這點表明臃腫的稀疏網絡可能被不失性能地簡化。 雖然數學證明有著嚴格的條件限制,但Hebbian準則有力地支持了這一點:fire together,wire together。

早些的時候,為了打破網絡對稱性和提高學習能力,傳統的網絡都使用了隨機稀疏連接。但是,計算機軟硬件對非均勻稀疏數據的計算效率很差,所以在AlexNet中又重新啟用了全連接層,目的是為了更好地優化並行運算。

所以,現在的問題是有沒有一種方法,既能保持網絡結構的稀疏性,又能利用密集矩陣的高計算性能。大量的文獻表明可以將稀疏矩陣聚類為較為密集的子矩陣來提高計算性能,據此論文提出了名為Inception 的結構來實現此目的。

2012年AlexNet做出歷史突破以來,直到GoogLeNet出來之前,主流的網絡結構突破大致是網絡更深(層數),網絡更寬(神經元數)。所以大家調侃深度學習為“深度調參”,但是純粹的增大網絡的缺點:

參數太多,容易過擬合,若訓練數據集有限;

網絡越大計算複雜度越大,難以應用;

網絡越深,梯度越往後穿越容易消失(梯度彌散),難以優化模型

那麼解決上述問題的方法當然就是增加網絡深度和寬度的同時減少參數,Inception就是在這樣的情況下應運而生。

2)網絡結構

Inception 結構的主要思路是怎樣用密集成分來近似最優的局部稀疏結構,基本結構如下:

上圖說明:

採用不同大小的卷積核意味著不同大小的感受野,最後拼接意味著不同尺度特徵的融合

之所以卷積核採用1x1,3x3和5x5,主要是為了方便對齊,設定卷積步長stride=1,只要分別設定padding=0,1,2,那麼卷積之後便可以得到相同維度的特徵,然後將這些特徵就可以直接拼接在一起了。

文章中說pooling被證明很有效,所以網絡結構中也加入了

網絡越到後面,特徵越抽象,而且每個特徵所涉及的感受野也變大了,因此隨著層數的增加,3x3和5x5的比例也要增加。

但是使用5x5的卷積核仍然會帶來巨大的計算量,為此文章借鑑NIN,採用1x1的卷積核來進行降維。

例如:上一層的輸出為100x100x128,經過具有256個輸出的5x5卷積層之後(stride=1,pad=2),輸出數據為100x100x256。其中,卷積層的參數為128x5x5x256。假如上一層輸出先經過具有32個輸出的1x1卷積層,再經過具有256個輸出的5x5卷積層,那麼最終的輸出數據仍為為100x100x256,但卷積參數量已經減少為128x1x1x32 + 32x5x5x256,大約減少了4倍。

卷積層參數數量計算:

輸入通道數為K,輸出通道數為L,那麼卷積核個數為K*L。因為高維卷積計算是多個通道與多個卷積核分別進行二維計算,

所以K個通道會需要K個卷積核,計算之後,合併也就是相加得到一個通道,又因為輸出通道為L,所以需要K*L個卷積核。

然後就是如何求解參數數量?

其實很簡單,就是卷積核個數乘以卷積核尺寸,para=I*J*K*L。

1

2

3

4

5

6

輸入是3個3232, 共31024=3072。每條邊padding為2,則內存裡實際為3個36*36.

卷積核個數是3維的55分別與3個輸入進行卷積運算,得到3維的3232的輸出,這裡將3維的3232對應位相加得到一張3232的feature Map

如果有64個3維的5*5卷積核就有64張feature Map

具體過程圖示為:

卷積的權值存取方式為:

第1個5*5作用於第一張輸入全圖,

第2個5*5作用於第二張輸入全圖,

第3個5*5作用於第三張輸入全圖,

再把這三個對應位置相加,在加上biases,得到第一張feature map

最後64個553重複上面的過程,得到64個featuremap

這裡weights有355*64個,biases有64個.

這裡輸入是3 輸出是64,卷積核是55權值個數是64 553

具體改進後的Inception Module如下:

GoogLeNet Incepetion V1比AlexNet的8層或者VGGNet的19層還要更深。但其計算量只有15億次浮點運算,同時只有500萬的參數量,僅為AlexNet參數量(6000萬)的1/12,卻可以達到遠勝於AlexNet的準確率,可以說是非常優秀並且非常實用的模型。

Inception V1降低參數量的目的有兩點:

第一,參數越多模型越龐大,需要供模型學習的數據量就越大,而目前高質量的數據非常昂貴;

第二,參數越多,耗費的計算資源也會更大。

Inception V1參數少但效果好的原因除了模型層數更深、表達能力更強外,還有兩點:

其一,去除了最後的全連接層,用全局平均池化層(即將圖片尺寸變為1*1)來取代它。全連接層幾乎佔據了AlexNet或VGGNet中90%的參數量,而且會引起過擬合,去除全連接層後模型訓練更快並且減輕了過擬合。

其二,Inception V1中精心設計的Inception Module提高了參數的利用效率,其結構如上圖所示。這一部分也借鑑了Network In Network的思想,形象的解釋就是Inception Module本身如同大網絡中的一個小網絡,其結構可以反覆堆疊在一起形成大網絡。

Inception Module的基本結構:

其中有4個分支:

第一個分支對輸入進行11的卷積,這其實也是NIN中提出的一個重要結構。11的卷積是一個非常優秀的結構,它可以跨通道組織信息,提高網絡的表達能力,同時可以對輸出通道升維和降維。

Inception Module的4個分支都用到了1x1的卷積,來進行低成本(計算量比3x3小很多)的跨通道的特徵變換

第二個分支,先使用了1x1卷積,然後連接3x3卷積,相當於進行了兩次特徵變換

第三個分支,先使用1x1卷積,然後連接5x5卷積

第四個分支,3x3最大池化後直接使用1x1卷積

四個分支在最後通過一個聚合操作合併,在輸出通道這個維度上聚合。

我們立刻注意到,並不是所有的事情都是按照順序進行的,這與此前看到的架構不一樣。我們有一些網絡,能同時並行發生反應,這個盒子被稱為 Inception 模型。

12.2 GoogLeNet

先小心翼翼的訓練得到一組權重參數(第一個出來的分支),再利用這些參數作為初始化參數,訓練網絡,之後再進行一次初始化,訓練得到22層的網絡。

上圖說明:

GoogLeNet 採用了模塊化的幾個,方便增添和修改

網絡最後採用了平均池化來代替全連接層,想法來自NIN,事實證明可以將TOP accuracy 提高0.6%,但是,實際在最後一層還是加了一個全連接層,主要為了方便之後的微調

雖然移除了全連接,但是網絡中依然使用了Dropout

為了避免梯度消失,網絡額外增加了2個輔助的softmax用於前向傳導梯度,文章中說著兩個輔助分類器的loss應該加一個衰減係數,但是caffe中的模型沒有加任何衰減,此外,實際測試的時候,這兩個額外的softmax會被去掉。

比較清晰的結構圖:

結論:

GoogLeNet是谷歌團隊為了參加ILSVRC 2014比賽而精心準備的,為了達到最佳的性能,除了使用上述的網絡結構外,還做了大量的輔助工作:包括訓練多個model求平均、裁剪不同尺度的圖像做多次驗證等等。詳細的這些可以參看文章的實驗部分。

本文的主要想法其實是想通過構建密集的塊結構來近似最優的稀疏結構,從而達到提高性能而又不大量增加計算量的目的。GoogleNet的caffemodel大小約50M,但性能卻很優異。

12.3 GoogleNet Inception V2

V2和V1的最大的不同就是,V2增加了Batch Normalization。《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》

Inception V2學習了VGGNet,用兩個3x3的卷積代替5x5的卷積,用以降低參數量並減輕過擬合,還提出了著名的Batch Normalization方法,該方法是一個很有效的正則化的方法,可以讓大型卷積網絡的訓練速度加快很多倍,同時收斂後的分類準確率也可以得到大幅度的提高。

BN在用於神經網絡某層時,會對每一個mini-batch數據的內部進行標準化(normalization)處理,使輸出規範化到N(0,1)的正態分佈,減少了Internal Covariate Shift(內部神經元分佈的改變)。

BN的論文指出,傳統的深度神經網絡在訓練時,每一層的輸入的分佈都在變化,導致訓練變得困難,我們只能使用一個很小的學習速率解決這個問題。而對每一層使用BN之後,我們就可以有效地解決這個問題,學習速率可以增大很多倍,達到之前的準確率所需要的迭代次數只有1/14,訓練時間大大縮短。

而達到之前的準確率後,可以繼續訓練,並最終取得遠超於Inception V1模型的性能——top-5錯誤率4.8%,已經優於人眼水平。因為BN某種意義上還起到了正則化的作用,所以可以減少或者取消Dropout,簡化網絡結構。

12.3.1 動機:

文章作者認為,網絡訓練過程中參數不斷改變導致後續每一層輸入的分佈也發生變化,而學習的過程又要使得每一層適應輸入的分佈,因此我們不得不降低學習率、小心的初始化,分佈發生變化稱為internal covariate shift。

一般在訓練網絡時會對數據進行預處理,包括去掉均值、白化操作等,目的是為了加快訓練:

去均值化:

首先,圖像數據是高度相關的,假設其分佈如下圖a所示(簡化為2維),由於初始化的時候,我們的參數一般都是0均值的,因此開始的擬合y=Wx+b基本過原點附近,如圖b紅色虛線,因此,網絡需要經過多次學習才能逐步達到紫色實線的擬合,即收斂的比較慢。

如果對數據先去均值化,如圖c,顯然可以加快學習,更進一步的,我們對數據在進行去相關操作,使得數據更加容易區分,這樣又會加快訓練,如圖d。

去均值是一種常用的數據處理方式,它是將各個特徵值減去其均值,幾何上的展現是可以將數據的中心移到座標原點,python代碼為X=X-np.mean(X,axis=0),對於圖像來說,就是對每個像素的值都要減去平均值。

PCA:

由於計算需要,需要實現進行前面所說的均值0化。

PCA要做的是將數據的主成分找出。流程如下:

計算協方差矩陣

求特徵值和特徵向量

座標轉換

選擇主成分

首先我們需要求出數據各個特徵之間的協方差矩陣,以得到他們之間的關聯程度,Python代碼如下:

# Assume input data matrix X of size [N x D]

X -= np.mean(X, axis = 0) # zero-center the data (important)

cov = np.dot(X.T, X) / X.shape[0] # get the data covariance matrix,公式含義可按照協方差矩陣的定義得到

1

2

3

其中得到的矩陣中的第(i,j)個元素代表第i列和第j列的協方差,對角線代表方差。協方差矩陣是對稱半正定矩陣可以進行SVD分解:

U,S,V = np.linalg.svd(cov)1

1

U 的列向量是特徵向量, S 是對角陣其值為奇異值也是特徵值的平方.奇異值分解的直觀展示:

詳細介紹

我們可以用特徵向量(正交且長度為1可以看做新座標系的基)右乘X(相當於旋轉座標系)就可以得到新座標下的無聯繫(正交)的特徵成分:

Xrot = np.dot(X, U) # decorrelate the data1

1

注意上面使用的np.linalg.svd()已經將特徵值按照大小排序了,這裡僅需要取前幾列就是取前幾個主要成分了(實際使用中我們一般按照百分比取),代碼:

Xrot_reduced = np.dot(X, U[:,:100]) # Xrot_reduced becomes [N x 100]

1

白化:

白化的方式有很多種,常用的有PCA白化,就是對數據進行PCA操作之後,再進行方差歸一化,這樣數據基本滿足0均值、單位方差、弱相關性。

作者首先嚐試了對每一層數據都是用白化操作,但分析認為這是不可取的,因為白化需要計算協方差矩陣、求逆等操作,計算量很大,此外,反向傳播時,白化操作不一定可導,於是使用了Normalization的操作。

# whiten the data:

# divide by the eigenvalues (which are square roots of the singular values)

Xwhite = Xrot / np.sqrt(S + 1e-5)

1

2

3

但是白化因為將數據都處理到同一個範圍內了,所以如果原始數據有原本影響不大的噪聲,它原本小幅的噪聲也會被放大到與全局相同的範圍內了。

另外我們防止出現除以0的情況,在分母處多加了0.00001,如果增大它會使得噪聲減小。

白化之後,得到的是一個多元高斯分佈。

上面兩種處理的結果如下:

可以看出,經過PCA的去相關操作,將原始數據的座標軸旋轉,並且可以看出x方向的信息量比較大,如果只選擇一個特徵,那麼久選橫軸方向的特徵,經過白化之後數據進入了相同的範圍。

下面以處理之前提到過的CIFAR-10為例,看PCA和Whitening的作用:

左邊是原始圖片,每張圖片都是一個3072維的一行向量,經過PCA之後選取144維最重要的特徵(左2),將特徵轉化到原來的座標系U.transpose()[:144,:]得到了降維之後的圖形(左3),圖形變模糊了,說明我們的主要信息都是低頻信息,關於高低頻的含義在下一段展示一下,圖片模糊了但是主要成分都還在,最後一個圖是白化之後再轉換座標系之後的結果。

1. CNN不用進行PCA和白化,只需要進行零均值化就好

2. 注意進行所有的預處理時訓練集、驗證集、測試集都要使用相同的處理方法,比如減去相同的均值。

12.3.2 對小批量進行統計特性的標準化

標準化 Normalization:

標準化是將矩陣X中的Dimensions都保持在相似的範圍內,有兩種實現方式:

先使得均值為0,然後除以標準差,X=X / np.std(X, axis=0)

在數據不在同一範圍,而且各個維度在同一範圍內對算法比較重要時,可以將其最大最小值分別縮放為1和-1,對於圖像處理而言,因為一般數據都在0~255之間,所以不用再進行這一步了。

數據歸一化的方法很簡單,就是讓數據具有0均值和單位方差:

但是作者又說如果簡單的這麼幹,會降低層的表達能力。比如下圖,在使用sigmoid激活函數的時候,如果把數據限制到0均值單位方差,那麼相當於只使用了激活函數中近似線性的部分,這顯然會降低模型表達能力。

因此,作者又為BN增加了2個參數,用來保持模型的表達能力,於是最後的輸出為:

上述公式中用到了均值E和方差Var,需要注意的是理想情況下E和Var應該是針對整個數據集的,但顯然這是不現實的。因此,作者做了簡化,用一個Batch的均值和方差作為對整個數據集均值和方差的估計。

BN算法實現如下:

輸入:輸入數據x1...xm x_1...x_mx

1

...x

m

(這些數據是準備進入激活函數的數據)

計算過程:

求數據均值

求數據方差

數據進行標準化

訓練參數γ,β \\gamma , \\betaγ,β

輸出y通過γ \\gammaγ 與β \\betaβ的線性變換得到新的值

正向傳播的過程:通過可學習的γ \\gammaγ與β \\betaβ參數求出新的分佈值

反向傳播的過程:通過鏈式求導方式,求出γ,β \\gamma,\\betaγ,β以及相關權值

12.3.3 BN的意義:

解決的問題是梯度消失和梯度爆炸的問題

a. 關於梯度消失:

以sigmoid函數為例,sigmoid函數使得輸出在[0,1]之間:

事實上x到了一定大小,經過sigmoid函數的輸出範圍就很小了,如下圖:

如果輸入很大,其對應的斜率就很小,我們知道其斜率在反向傳播中是權值學習速率,所以就會出現以下問題:

在深度網絡中,如果網絡的激活輸出很大,那麼其梯度就很小,學習速率就很慢,假設每層學習梯度都小於最大值0.25,網絡有n層,因為鏈式求導的原因,第一層的梯度小於0.25的n次方,所以學習速率就慢,對於最後一層只需對自身求導1次,梯度就打,學習速率就快。

影響:在一個很大的深度網絡中,淺層基本不學習,權值變化小,後面幾層一直在學習,結果就是後面幾層基本可以表示整個網絡,失去了深度的意義。

b. 關於梯度爆炸:

根據鏈式求導法則:

第一層偏移量的梯度 = 激活層斜率1 x 權值1 x 激活層斜率2 x …激活層斜率(n-1) x 權值(n-1) x 激活層斜率n

假如激活層斜率均為最大值0.25,所有層的權值為100,這樣梯度就會指數增加。

12.3.4 BN在CNN中的用法

首先解釋對圖像的卷積是如何使用BN層的,上圖是CNN中的5x5的圖像通過valid卷積得到的3x3的特徵圖,特徵圖裡邊的值作為BN的輸入,也就是這9個數值通過BN計算並保存γ,β \\gamma,\\betaγ,β,通過γ,β \\gamma,\\betaγ,β使得輸出與輸入不變。

假設輸入的batch_size=m,那就有m x 9個數值,計算這m x 9個數據的γ,β \\gamma,\\betaγ,β並保存,這就是正向傳播的過程,反向傳播就是根據求得的γ,β \\gamma,\\betaγ,β來計算梯度。

重要說明:

網絡訓練中以batch_size為最小單位不斷迭代,很顯然新的batch_size進入網絡,就會有新的γ,β \\gamma,\\betaγ,β,因此在BN層中,共有總圖像數 / batch_size組γ,β \\gamma,\\betaγ,β被保存下來。

圖像卷積過程中,通常是使用多個卷積核,得到多張特徵圖,對於多個的卷積核需要保存多個γ,β \\gamma,\\betaγ,β。

輸入:待進入激活函數的變量

輸出:

對於k維的輸入,假設每一維包含m個變量,所以需要k個循環,每個循環中按照上面所介紹的方法計算γ,β \\gamma,\\betaγ,β,這裡的k維,在卷積網絡中可以看做卷積核個數,如網絡中的第n層有64個卷積核,就需要計算64次。(注意:在正向傳播時,會使用γ,β \\gamma,\\betaγ,β使得BN層輸入與輸出一樣。)

在反向傳播時利用γ,β \\gamma,\\betaγ,β求得梯度,從而改變訓練權值(變量)

通過不斷迭代直到結束,求得關於不同層的γ,β \\gamma,\\betaγ,β,如果有n個BN層,每層根據batch_size決定有多少個變量,設定為m,這裡的mini_batcher指的是特徵圖大小 x batch_size,即m=特徵圖大小 x batch_size,因此對於batch_size為1,這裡的m就是每層特徵圖的大小。

不斷遍歷訓練集中的圖像,取出每個batch_size的γ,β \\gamma,\\betaγ,β,最後統計每層BN的γ,β \\gamma,\\betaγ,β各自的和除以圖像數量,得到平均值,並對其做無偏估計值作為每一層的E[x]與Var[x]。

在預測的正向傳播時,對測試數據求取γ,β \\gamma,\\betaγ,β,並使用該層的E[x]與Var[x],通過圖中所表示的公式計算BN層的輸出。

12.3.5 BN應該放在激活層之前還是之後

作者在文章中說應該把BN放在激活函數之前,這是因為Wx+b具有更加一致和非稀疏的分佈。但是也有人做實驗表明放在激活函數後面效果更好。這是實驗鏈接,裡面有很多有意思的對比實驗:https://github.com/ducha-aiki/caffenet-benchmark

**12.3.6 實驗 **

作者在文章中也做了很多實驗對比,我這裡就簡單說明2個。

下圖a說明,BN可以加速訓練。圖b和c則分別展示了訓練過程中輸入數據分佈的變化情況。

下表是一個實驗結果的對比,需要注意的是在使用BN的過程中,作者發現Sigmoid激活函數比Relu效果要好。

12.4 GoogLeNet Inception V3

GoogLeNet憑藉其優秀的表現,得到了很多研究人員的學習和使用,因此Google團隊又對其進行了進一步發掘改進,產生了升級版本的GoogLeNet。這一節介紹的版本記為V3,文章為:《Rethinking the Inception Architecture for Computer Vision》。

12.4.1 簡介

2014年以來,構建更深網絡的同時逐漸成為主流,但是模型的變大也使得計算效率越來越低,這裡文章試圖找到不同方法來擴大網絡的同時又儘可能的發揮計算性能。

首先,GoogLeNet V1出現的同期,性能與之接近的大概只有VGGNet了,並且二者在圖像分類之外的很多領域都得到了成功的應用。但是相比之下,GoogLeNet的計算效率明顯高於VGGNet,大約只有500萬參數,只相當於Alexnet的1/12(GoogLeNet的caffemodel大約50M,VGGNet的caffemodel則要超過600M)。

GoogLeNet的表現很好,但是,如果想要通過簡單地放大Inception結構來構建更大的網絡,則會立即提高計算消耗。此外,在V1版本中,文章也沒給出有關構建Inception結構注意事項的清晰描述。因此,在文章中作者首先給出了一些已經被證明有效的用於放大網絡的通用準則和優化方法。這些準則和方法適用但不侷限於Inception結構。

12.4.2 一般情況的設計準則

下面的準則來源於大量的實驗,因此包含一定的推測,但實際證明基本都是有效的。

1)避免表達瓶頸,特別是在網絡靠前的地方

信息流前向傳播過程中顯然不能經過高度壓縮的層,即表達瓶頸。從input到output,feature map的寬和高基本都會逐漸變小,但是不能一下子就變得很小。比如你上來就來個kernel = 7, stride = 5 ,這樣顯然不合適。

另外輸出的維度channel,一般來說會逐漸增多(每層的num_output),否則網絡會很難訓練。(特徵維度並不代表信息的多少,只是作為一種估計的手段)

這種情況一般發生在pooling層,字面意思是,pooling後特徵圖變小了,但有用信息不能丟,不能因為網絡的漏斗形結構而產生表達瓶頸,解決辦法是作者提出了一種特徵圖縮小方法,更復雜的池化。

2)高維特徵更容易處理

高維特徵更加容易區分,會加快訓練

3)可以在低維嵌入上進行空間匯聚而無需擔心丟失很多信息

比如在進行3x3卷積之前,可以對輸入先進行降維而不會產生嚴重的後果,假設信息可以被簡單的壓縮,那麼訓練就會加快。

4)平衡網絡的深度和寬度

上述的這些並不能直接用來提高網絡質量,而僅用來在大環境下作指導。

12.4.3 利用大尺度濾波器進行圖像的卷積

大尺寸的卷積核可以帶來更大的感受野,但也意味著更多的參數,比如5x5卷積核參數是3x3卷積核的25/9=2.78倍。為此,作者提出可以用2個連續的3x3卷積層(stride=1)組成的小網絡來代替單個的5x5卷積層,(保持感受野範圍的同時又減少了參數量)如下圖:

問題:

這種代替會造成表達能力的下降嗎?

實驗證明該操作不會造成表達缺失

3x3卷積之後還要再激活嗎?

添加非線性激活之後會提高性能

從上面來看,大卷積核完全可以由一系列的3x3卷積核來替代,那能不能分解的更小一點呢。文章考慮了 nx1 卷積核。

如下圖所示的取代3x3卷積:

於是,任意nxn的卷積都可以通過1xn卷積後接nx1卷積來替代。實際上,作者發現在網絡的前期使用這種分解效果並不好,還有在中度大小的feature map上使用效果才會更好。(對於mxm大小的feature map,建議m在12到20之間)。

總結如下圖:

(1) 圖4是GoogLeNet V1中使用的Inception結構;

(2) 圖5是用3x3卷積序列來代替大卷積核;

(3) 圖6是用nx1卷積來代替大卷積核,這裡設定n=7來應對17x17大小的feature map。該結構被正式用在GoogLeNet V2中。即非對稱個卷積核,其實類似於卷積運算中,二維分解為1維計算,提高了計算速度。

13、ResNet

ResNet在2015年被提出,在ImageNet比賽classification任務上獲得第一名,因為它“簡單與實用”並存,之後很多方法都建立在ResNet50或者ResNet101的基礎上完成的,檢測,分割,識別等領域都紛紛使用ResNet,Alpha zero也使用了ResNet,所以可見ResNet確實很好用。

訓練神經網絡的反向傳播,導致很容易出現梯度消失。

對常規的網絡(plain network,也稱平原網絡)直接堆疊很多層次,經對圖像識別結果進行檢驗,訓練集、測試集的誤差結果如下圖:

從上面兩個圖可以看出,在網絡很深的時候(56層相比20層),模型效果卻越來越差了(誤差率越高),並不是網絡越深越好。

通過實驗可以發現:隨著網絡層級的不斷增加,模型精度不斷得到提升,而當網絡層級增加到一定的數目以後,訓練精度和測試精度迅速下降,這說明當網絡變得很深以後,深度網絡就變得更加難以訓練了。

下圖是一個簡單神經網絡圖,由輸入層、隱含層、輸出層構成:

回想一下神經網絡反向傳播的原理,先通過正向傳播計算出結果output,然後與樣本比較得出誤差值Etotal

根據誤差結果,利用著名的“鏈式法則”求偏導,使結果誤差反向傳播從而得出權重w調整的梯度。下圖是輸出結果到隱含層的反向傳播過程(隱含層到輸入層的反向傳播過程也是類似):

通過不斷迭代,對參數矩陣進行不斷調整後,使得輸出結果的誤差值更小,使輸出結果與事實更加接近。

從上面的過程可以看出,神經網絡在反向傳播過程中要不斷地傳播梯度,而當網絡層數加深時,梯度在傳播過程中會逐漸消失(假如採用Sigmoid函數,對於幅度為1的信號,每向後傳遞一層,梯度就衰減為原來的0.25,層數越多,衰減越厲害),導致無法對前面網絡層的權重進行有效的調整。

那麼,如何又能加深網絡層數、又能解決梯度消失問題、又能提升模型精度呢?

13.1 ResNet的提出

前面描述了一個實驗結果現象,在不斷加神經網絡的深度時,模型準確率會先上升然後達到飽和,再持續增加深度時則會導致準確率下降,示意圖如下:

那麼我們作這樣一個假設:假設現有一個比較淺的網絡(Shallow Net)已達到了飽和的準確率,這時在它後面再加上幾個恆等映射層(Identity mapping,也即y=x,輸出等於輸入),這樣就增加了網絡的深度,並且起碼誤差不會增加,也即更深的網絡不應該帶來訓練集上誤差的上升。而這裡提到的使用恆等映射直接將前一層輸出傳到後面的思想,便是著名深度殘差網絡ResNet的靈感來源。

ResNet引入了殘差網絡結構(residual network),通過這種殘差網絡結構,可以把網絡層弄的很深(據說目前可以達到1000多層),並且最終的分類效果也非常好,殘差網絡的基本結構如下圖所示,很明顯,該圖是帶有跳躍結構的:

殘差網絡借鑑了高速網絡的跨層連接的思想,但是對其進行了改進,殘差項原本是帶權值的,但ResNet用恆等映射代替了它。

假設:

神經網絡輸入:x

期望輸出:H(x),即H(x)是期望的複雜映射,如果要學習這樣的模型,訓練的難度會比較大。

此時,如果已經學習到較為飽和的準確率,或者發現下層的誤差變大時,接下來的目標就轉化為恆等映射的學習,也就是使得輸入x近似於輸出H(x),以保持在後面的層次中不會造成精度下降。

上圖的殘差網絡中,通過捷徑連接的方式直接將輸入x傳到輸出作為初始結果,輸出結果為H(x)=F(x)+x,當F(x)=0時,H(x)=x,也就是恆等映射。於是,ResNet相當於將學習目標改變了,不再是學習一個完整的輸出,而是目標值H(X)和x的差值,也就是所謂的殘差F(x) := H(x)-x,因此,後面的訓練目標就是要將殘差結果逼近於0,使到隨著網絡加深,準確率不下降。

學習的目標:目標值H(x)和輸入x的差值,即F(x):=H(x)-x,將殘差逼近於0,使得隨著網絡加深,準確率不下降。

13.2 ResNet的意義

圖像是層次非常深的數據,所以要層次深的網絡來進行特徵提取,網絡深度是很有意義的。

一般的卷積神經網絡,輸入圖像x,輸出卷積後的特徵F(x),一次性抽出所有的信息,梯度消失會出現,Res網絡就說只學習殘差即可。

第一條直接向下傳遞的網絡:試圖從x中直接學習殘差F(x)

第二條捷徑網絡:輸入x

整合:將殘差和x相加,即H(x)=F(x)+x,也就是所要求的映射H(x)

好處:只有一條通路的反向傳播,會做連乘導致梯度消失,但現在有兩條路,會變成求和的形式,避免梯度消失。後面的層可以看見輸入,不至於因為信息損失而失去學習能力。

如果連乘的方式會造成梯度消失的話,那麼連加。傳統的網絡每次學習會學習x->f(x)的完整映射,那麼ResNet只學習殘差的映射,

隨著網絡的加深,出現了訓練集準確率下降的現象,但是我們又可以確定這不是由過擬合造成的,因為過擬合的情況下,訓練集應該準確率很高,所以作者針對這個問題提出了一種全新的網絡,稱為深度殘差網絡,它能夠允許網絡儘可能的假設,其中引入了一種全新的結構:

殘差指什麼:

ResNet提出了兩種mapping:

其一:identity mapping,指的“本身的線”,也就是公式中的x xx,就是圖中彎曲的曲線;

其二:residual mapping,指的是“差”,也就是y−x y-xy−x,所以殘差指的是F(x)部分 F(x)部分F(x)部分,也就是除過identity mapping之外的其餘的線;

所以最後的輸出為,y=F(x)+x y=F(x)+xy=F(x)+x

為什麼ResNet可以解決隨著網絡加深,準確率不下降的問題?

理論上,對於“隨著網絡加深,準確率下降”的問題,Resnet提供了兩種選擇方式,也就是identity mapping和residual mapping,如果網絡已經到達最優,繼續加深網絡,residual mapping將被push為0,只剩下identity mapping,這樣理論上網絡一直處於最優狀態了,網絡的性能也就不會隨著深度增加而降低了。

13.3 ResNet結構

傳統的神經網絡都是以層疊卷積層的方式提高網絡深度,從而提高識別精度,但層疊過多的卷積層會出現一個問題,就是梯度消失,使得反向傳播的過程中無法有效的將梯度更新到前面的網絡層,導致前面的層的參數無法更新。

而BN和ResNet的skip connection就是為了解決這個問題,BN通過規範化輸入數據,改變數據的分佈,在前向傳播的過程中,防止梯度消失的問題,而skip connection則能在後傳過程中更好地把梯度傳到更淺的層次中。

問題:為什麼加了一個捷徑就可以把梯度傳到淺層網絡?

這和神經網絡參數更新的過程密切相關,cs231n 2016視頻有很好的講解。

前向傳播:

首先x與w1相乘,得到1;1與w2相乘,得到0.1,以此類推,如下面的gif圖綠色數字表示

卷積神經網絡超詳細介紹

那麼這裡可以看到,本來從上一層傳過來的梯度為1,經過這個block之後,得到的梯度已經變成了0.0001和0.01,也就是說,梯度流過一個blcok之後,就已經下降了幾個量級,傳到前一層的梯度將會變得很小!

當權重很小的時候,前向傳播之後到輸出層的參數值會非常小,反向傳播時依然要和小的權重值相乘,參數值只會越來越小,數量級下降的非常快。

這就是梯度彌散。假如模型的層數越深,這種梯度彌散的情況就更加嚴重,導致淺層部分的網絡權重參數得不到很好的訓練,這就是為什麼在Resnet出現之前,CNN網絡都不超過二十幾層的原因。

防止梯度消失的方法:

假如,我們在這個block的旁邊加了一條“捷徑”(如圖5橙色箭頭),也就是常說的“skip connection”。假設左邊的上一層輸入為x,虛線框的輸出為f(x),上下兩條路線輸出的激活值相加為h(x),即h(x) = F(x) + x,得出的h(x)再輸入到下一層。

當進行後向傳播時,右邊來自深層網絡傳回來的梯度為1,經過一個加法門,橙色方向的梯度為dh(x)/dF(x)=1,藍色方向的梯度也為1。這樣,經過梯度傳播後,現在傳到前一層的梯度就變成了[1, 0.0001, 0.01],多了一個“1”!正是由於多了這條捷徑,來自深層的梯度能直接暢通無阻地通過,去到上一層,使得淺層的網絡層參數等到有效的訓練!

這個想法是何等的簡約而偉大,不得不佩服作者的強大的思維能力!

ResNet網絡:

直觀理解:

如圖,左邊來了一輛裝滿了“梯度”商品的貨車,來領商品的客人一般都要排隊一個個拿才可以,如果排隊的人太多,後面的人就沒有了。於是這時候派了一個人走了“快捷通道”,到貨車上領了一部分“梯度”,直接送給後面的人,這樣後面排隊的客人就能拿到更多的“梯度”。

它使用了一種連接方式叫做“shortcut connection”,顧名思義,shortcut就是“抄近道”的意思,看下圖我們就能大致理解:

圖1 Shortcut Connection

這是文章裡面的圖,我們可以看到一個“彎彎的弧線“這個就是所謂的”shortcut connection“,也是文中提到identity mapping,這張圖也詮釋了ResNet的真諦,當然真正在使用的ResNet模塊並不是這麼單一,文章中就提出了兩種方式:

圖2 兩種ResNet設計

這兩種結構分別針對ResNet34(左圖)和ResNet50/101/152(右圖),一般稱整個結構為一個“building block”,其中右圖為“bottleneck design”,目的就是為了降低參數數目,第一個1x1的卷積把256維的channel降到64維,然後在最後通過1x1卷積恢復,整體上用到參數數目+ 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的話就是兩個3x3x256的卷積,參數數目: 3x3x256x256x2 = 1179648,差了16.94倍。

對於常規ResNet,可以用於34層或者更少的網絡中,對於Bottleneck Design的ResNet通常用於更深的如101這樣的網絡中,目的是減少計算和參數量(實用目的)。

問題:圖1中的F(x)和x的channel個數不同怎麼辦,因為F(x)和x是按照channel維度相加的,channel不同怎麼相加呢?

解釋:

針對channel個數是否相同,要分成兩種情況考慮,如下圖:

卷積神經網絡超詳細介紹

圖3 兩種Shortcut Connection方式

如圖3所示,我們可以清楚的”實線“和”虛線“兩種連接方式:

實線的的Connection部分(”第一個粉色矩形和第三個粉色矩形“)都是3x3x64的特徵圖,他們的channel個數一致,所以採用計算方式: $y=F(x)+x $

虛線的Connection部分(”第一個綠色矩形和第三個綠色矩形“)分別是3x3x64和3x3x128的特徵圖,他們的channel個數不同(64和128),所以採用計算方式: $y=F(x)+Wx $

其中W是卷積操作,用來調整x的channel維度的;

兩個實例:

卷積神經網絡超詳細介紹

圖4 兩種Shortcut Connection方式實例(左圖channel一致,右圖channel不一樣)

13.4 ResNet50和ResNet101

這裡把ResNet50和ResNet101特別提出,主要因為它們的出鏡率很高,所以需要做特別的說明。給出了它們具體的結構:

表2,Resnet不同的結構

首先我們看一下表2,上面一共提出了5中深度的ResNet,分別是18,34,50,101和152,首先看錶2最左側,我們發現所有的網絡都分成5部分,分別是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,之後的其他論文也會專門用這個稱呼指代ResNet50或者101的每部分。

拿101-layer那列,我們先看看101-layer是不是真的是101層網絡,首先有個輸入7x7x64的卷積,然後經過3 + 4 + 23 + 3 = 33個building block,每個block為3層,所以有33 x 3 = 99層,最後有個fc層(用於分類),所以1 + 99 + 1 = 101層,確實有101層網絡;

注:101層網絡僅僅指卷積或者全連接層,而激活層或者Pooling層並沒有計算在內;

這裡我們關注50-layer和101-layer這兩列,可以發現,它們唯一的不同在於conv4_x,ResNet50有6個block,而ResNet101有23個block,查了17個block,也就是17 x 3 = 51層。

13.5 基於ResNet101的Faster RCNN

文章中把ResNet101應用在Faster RCNN上取得了更好的結果,結果如下:

表3,Resnet101 Faster RCNN在Pascal VOC07/12 以及COCO上的結果

**問題:Faster RCNN中RPN和Fast RCNN的共享特徵圖用的是conv5_x的輸出麼? **

針對這個問題我們看看實際的基於ResNet101的Faster RCNN的結構圖:

圖5 基於ResNet101的Faster RCNN

圖5展示了整個Faster RCNN的架構,其中藍色的部分為ResNet101,可以發現conv4_x的最後的輸出為RPN和RoI Pooling共享的部分,而conv5_x(共9層網絡)都作用於RoI Pooling之後的一堆特徵圖(14 x 14 x 1024),特徵圖的大小維度也剛好符合原本的ResNet101中conv5_x的輸入;

最後一定要記得最後要接一個average pooling,得到2048維特徵,分別用於分類和框迴歸。

14、區域 CNN:R-CNN(2013年)、Fast R-CNN(2015年)、Faster R-CNN(2015年)

一些人可能會認為,R-CNN的出現比此前任何關於新的網絡架構的論文都有影響力。第一篇關於R-CNN的論文被引用了超過1600次。Ross Girshick 和他在UC Berkeley 的團隊在機器視覺上取得了最有影響力的進步。正如他們的文章所寫, Fast R-CNN 和 Faster R-CNN能夠讓模型變得更快,更好地適應現代的物體識別任務。

R-CNN的目標是解決物體識別的難題。在獲得特定的一張圖像後, 我們希望能夠繪製圖像中所有物體的邊緣。這一過程可以分為兩個組成部分,一個是區域建議,另一個是分類。

論文的作者強調,任何分類不可知區域的建議方法都應該適用。Selective Search專用於RCNN。Selective Search 的作用是聚合2000個不同的區域,這些區域有最高的可能性會包含一個物體。在我們設計出一系列的區域建議之後,這些建議被匯合到一個圖像大小的區域,能被填入到經過訓練的CNN(論文中的例子是AlexNet),能為每一個區域提取出一個對應的特徵。這個向量隨後被用於作為一個線性SVM的輸入,SVM經過了每一種類型和輸出分類訓練。向量還可以被填入到一個有邊界的迴歸區域,獲得最精準的一致性。非極值壓抑後被用於壓制邊界區域,這些區域相互之間有很大的重複。

Fast R-CNN:

原始模型得到了改進,主要有三個原因:訓練需要多個步驟,這在計算上成本過高,而且速度很慢。Fast R-CNN通過從根本上在不同的建議中分析卷積層的計算,同時打亂生成區域建議的順利以及運行CNN,能夠快速地解決問題。

Faster R-CNN

Faster R-CNN的工作是克服R-CNN和 Fast R-CNN所展示出來的,在訓練管道上的複雜性。作者 在最後一個卷積層上引入了一個區域建議網絡(RPN)。這一網絡能夠只看最後一層的特徵就產出區域建議。從這一層面上來說,相同的R-CNN管道可用。

重要性:

能夠識別出一張圖像中的某一個物體是一方面,但是,能夠識別物體的精確位置對於計算機知識來說是一個巨大的飛躍。更快的R-CNN已經成為今天標準的物體識別程序。

15、生成式對抗網絡

按照Yann LeCun的說法,生成對抗網絡可能就是深度學習下一個大突破。假設有兩個模型,一個生成模型,一個判別模型。判別模型的任務是決定某幅圖像是真實的(來自數據庫),還是機器生成的,而生成模型的任務則是生成能夠騙過判別模型的圖像。這兩個模型彼此就形成了“對抗”,發展下去最終會達到一個平衡,生成器生成的圖像與真實的圖像沒有區別,判別器無法區分兩者。

左邊一欄是數據庫裡的圖像,也即真實的圖像,右邊一欄是機器生成的圖像,雖然肉眼看上去基本一樣,但在CNN看起來卻十分不同。

為什麼重要?

聽上去很簡單,然而這是隻有在理解了“數據內在表徵”之後才能建立的模型,你能夠訓練網絡理解真實圖像和機器生成的圖像之間的區別。因此,這個模型也可以被用於CNN中做特徵提取。此外,你還能用生成對抗模型製作以假亂真的圖片。

16、深度學習在計算機視覺上的應用

計算機視覺中比較成功的深度學習的應用,包括人臉識別,圖像問答,物體檢測,物體跟蹤。

人臉識別:

這裡說人臉識別中的人臉比對,即得到一張人臉,與數據庫裡的人臉進行比對;或同時給兩張人臉,判斷是不是同一個人。

這方面比較超前的是湯曉鷗教授,他們提出的DeepID算法在LWF上做得比較好。他們也是用卷積神經網絡,但在做比對時,兩張人臉分別提取了不同位置特徵,然後再進行互相比對,得到最後的比對結果。最新的DeepID-3算法,在LWF達到了99.53%準確度,與肉眼識別結果相差無幾。

圖片問答問題:

這是2014年左右興起的課題,即給張圖片同時問個問題,然後讓計算機回答。比如有一個辦公室靠海的圖片,然後問“桌子後面有什麼”,神經網絡輸出應該是“椅子和窗戶”。

這一應用引入了LSTM網絡,這是一個專門設計出來具有一定記憶能力的神經單元。特點是,會把某一個時刻的輸出當作下一個時刻的輸入。可以認為它比較適合語言等,有時間序列關係的場景。因為我們在讀一篇文章和句子的時候,對句子後面的理解是基於前面對詞語的記憶。

圖像問答問題是基於卷積神經網絡和LSTM單元的結合,來實現圖像問答。LSTM輸出就應該是想要的答案,而輸入的就是上一個時刻的輸入,以及圖像的特徵,及問句的每個詞語。

物體檢測問題:

① Region CNN

深度學習在物體檢測方面也取得了非常好的成果。2014年的Region CNN算法,基本思想是首先用一個非深度的方法,在圖像中提取可能是物體的圖形塊,然後深度學習算法根據這些圖像塊,判斷屬性和一個具體物體的位置。

為什麼要用非深度的方法先提取可能的圖像塊?因為在做物體檢測的時候,如果你用掃描窗的方法進行物體監測,要考慮到掃描窗大小的不一樣,長寬比和位置不一樣,如果每一個圖像塊都要過一遍深度網絡的話,這種時間是你無法接受的。

所以用了一個折中的方法,叫Selective Search。先把完全不可能是物體的圖像塊去除,只剩2000左右的圖像塊放到深度網絡裡面判斷。那麼取得的成績是AP是58.5,比以往幾乎翻了一倍。有一點不盡如人意的是,region CNN的速度非常慢,需要10到45秒處理一張圖片。

② Faster R-CNN方法

而且我在去年NIPS上,我們看到的有Faster R-CNN方法,一個超級加速版R-CNN方法。它的速度達到了每秒七幀,即一秒鐘可以處理七張圖片。技巧在於,不是用圖像塊來判斷是物體還是背景,而把整張圖像一起扔進深度網絡裡,讓深度網絡自行判斷哪裡有物體,物體的方塊在哪裡,種類是什麼?

經過深度網絡運算的次數從原來的2000次降到一次,速度大大提高了。

Faster R-CNN提出了讓深度學習自己生成可能的物體塊,再用同樣深度網絡來判斷物體塊是否是背景?同時進行分類,還要把邊界和給估計出來。

Faster R-CNN可以做到又快又好,在VOC2007上檢測AP達到73.2,速度也提高了兩三百倍。

③ YOLO

去年FACEBOOK提出來的YOLO網絡,也是進行物體檢測,最快達到每秒鐘155幀,達到了完全實時。它讓一整張圖像進入到神經網絡,讓神經網絡自己判斷這物體可能在哪裡,可能是什麼。但它縮減了可能圖像塊的個數,從原來Faster R-CNN的2000多個縮減縮減到了98個。

同時取消了Faster R-CNN裡面的RPN結構,代替Selective Search結構。YOLO裡面沒有RPN這一步,而是直接預測物體的種類和位置。

YOLO的代價就是精度下降,在155幀的速度下精度只有52.7,45幀每秒時的精度是63.4。

④ SSD

在arXiv上出現的最新算法叫Single Shot MultiBox Detector,即SSD。

它是YOLO的超級改進版,吸取了YOLO的精度下降的教訓,同時保留速度快的特點。它能達到58幀每秒,精度有72.1。速度超過Faster R-CNN 有8倍,但達到類似的精度。

物體跟蹤

所謂跟蹤,就是在視頻裡面第一幀時鎖定感興趣的物體,讓計算機跟著走,不管怎麼旋轉晃動,甚至躲在樹叢後面也要跟蹤。

深度學習對跟蹤問題有很顯著的效果。是第一在線用深度學習進行跟蹤的文章,當時超過了其它所有的淺層算法。

今年有越來越多深度學習跟蹤算法提出。去年十二月ICCV 2015上面,馬超提出的Hierarchical Convolutional Feature算法,在數據上達到最新的記錄。它不是在線更新一個深度學習網絡,而是用一個大網絡進行預訓練,然後讓大網絡知道什麼是物體什麼不是物體。

將大網絡放在跟蹤視頻上面,然後再分析網絡在視頻上產生的不同特徵,用比較成熟的淺層跟蹤算法來進行跟蹤,這樣利用了深度學習特徵學習比較好的好處,同時又利用了淺層方法速度較快的優點。效果是每秒鐘10幀,同時精度破了記錄。

最新的跟蹤成果是基於Hierarchical Convolutional Feature,由一個韓國的科研組提出的MDnet。它集合了前面兩種深度算法的集大成,首先離線的時候有學習,學習的不是一般的物體檢測,也不是ImageNet,學習的是跟蹤視頻,然後在學習視頻結束後,在真正在使用網絡的時候更新網絡的一部分。這樣既在離線的時候得到了大量的訓練,在線的時候又能夠很靈活改變自己的網絡。

基於嵌入式系統的深度學習

回到ADAS問題(慧眼科技的主業),它完全可以用深度學習算法,但對硬件平臺有比較高的要求。在汽車上不太可能把一臺電腦放上去,因為功率是個問題,很難被市場所接受。

現在的深度學習計算主要是在雲端進行,前端拍攝照片,傳給後端的雲平臺處理。但對於ADAS而言,無法接受長時間的數據傳輸的,或許發生事故後,雲端的數據還沒傳回來。

那是否可以考慮NVIDIA推出的嵌入式平臺?NVIDIA推出的嵌入式平臺,其運算能力遠遠強過了所有主流的嵌入式平臺,運算能力接近主流的頂級CPU,如臺式機的i7。那麼慧眼科技在做工作就是要使得深度學習算法,在嵌入式平臺有限的資源情況下能夠達到實時效果,而且精度幾乎沒有減少。

具體做法是,首先對網絡進行縮減,可能是對網絡的結構縮減,由於識別場景不同,也要進行相應的功能性縮減;另外要用最快的深度檢測算法,結合最快的深度跟蹤算法,同時自己研發出一些場景分析算法。三者結合在一起,目的是減少運算量,減少檢測空間的大小。在這種情況下,在有限資源上實現了使用深度學習算法,但精度減少的非常少。

17、深度有監督學習在計算機視覺領域的進展

17.1 圖像分類

自從Alex和他的導師Hinton(深度學習鼻祖)在2012年的ImageNet大規模圖像識別競賽(ILSVRC2012)中以超過第二名10個百分點的成績(83.6%的Top5精度)碾壓第二名(74.2%,使用傳統的計算機視覺方法)後,深度學習真正開始火熱,卷積神經網絡(CNN)開始成為家喻戶曉的名字,從12年的AlexNet(83.6%),到2013年ImageNet 大規模圖像識別競賽冠軍的88.8%,再到2014年VGG的92.7%和同年的GoogLeNet的93.3%,終於,到了2015年,在1000類的圖像識別中,微軟提出的殘差網(ResNet)以96.43%的Top5正確率,達到了超過人類的水平(人類的正確率也只有94.9%).

Top5精度是指在給出一張圖片,模型給出5個最有可能的標籤,只要在預測的5個結果中包含正確標籤,即為正確

17.2 圖像檢測(Image Dection)

伴隨著圖像分類任務,還有另外一個更加有挑戰的任務–圖像檢測,圖像檢測是指在分類圖像的同時把物體用矩形框給圈起來。從14年到16年,先後湧現出R-CNN,Fast R-CNN, Faster R-CNN, YOLO, SSD等知名框架,其檢測平均精度(mAP),在計算機視覺一個知名數據集上PASCAL VOC上的檢測平均精度(mAP),也從R-CNN的53.3%,到Fast RCNN的68.4%,再到Faster R-CNN的75.9%,最新實驗顯示,Faster RCNN結合殘差網(Resnet-101),其檢測精度可以達到83.8%。深度學習檢測速度也越來越快,從最初的RCNN模型,處理一張圖片要用2秒多,到Faster RCNN的198毫秒/張,再到YOLO的155幀/秒(其缺陷是精度較低,只有52.7%),最後出來了精度和速度都較高的SSD,精度75.1%,速度23幀/秒。

####17.3 圖像分割(Semantic Segmentation)

圖像分割也是一項有意思的研究領域,它的目的是把圖像中各種不同物體給用不同顏色分割出來,如下圖所示,其平均精度(mIoU,即預測區域和實際區域交集除以預測區域和實際區域的並集),也從最開始的FCN模型(圖像語義分割全連接網絡,該論文獲得計算機視覺頂會CVPR2015的最佳論文的)的62.2%,到DeepLab框架的72.7%,再到牛津大學的CRF as RNN的74.7%。該領域是一個仍在進展的領域,仍舊有很大的進步空間。

17.4 圖像標註–看圖說話(Image Captioning)

圖像標註是一項引人注目的研究領域,它的研究目的是給出一張圖片,你給我用一段文字描述它,如圖中所示,圖片中第一個圖,程序自動給出的描述是“一個人在塵土飛揚的土路上騎摩托車”,第二個圖片是“兩隻狗在草地上玩耍”。由於該研究巨大的商業價值(例如圖片搜索),近幾年,工業界的百度,谷歌和微軟 以及學術界的加大伯克利,深度學習研究重地多倫多大學都在做相應的研究。

####17.5 圖像生成–文字轉圖像(Image Generator)

圖片標註任務本來是一個半圓,既然我們可以從圖片產生描述文字,那麼我們也能從文字來生成圖片。如圖6所示,第一列“一架大客機在藍天飛翔”,模型自動根據文字生成了16張圖片,第三列比較有意思,“一群大象在乾燥草地行走”(這個有點違背常識,因為大象一般在雨林,不會在乾燥草地上行走),模型也相應的生成了對應圖片,雖然生成的質量還不算太好,但也已經中規中矩。

18、強化學習(Reinforcement Learning)

在監督學習任務中,我們都是給定樣本一個固定標籤,然後去訓練模型,可是,在真實環境中,我們很難給出所有樣本的標籤,這時候,強化學習就派上了用場。簡單來說,我們給定一些獎勵或懲罰,強化學習就是讓模型自己去試錯,模型自己去優化怎麼才能得到更多的分數。2016年大火的AlphaGo就是利用了強化學習去訓練,它在不斷的自我試錯和博弈中掌握了最優的策略。利用強化學習去玩flyppy bird,已經能夠玩到幾萬分了。

強化學習在機器人領域和自動駕駛領域有極大的應用價值,當前arxiv上基本上每隔幾天就會有相應的論文出現。機器人去學習試錯來學習最優的表現,這或許是人工智能進化的最優途徑,估計也是通向強人工智能的必經之路。

————————————————

原文鏈接:https://blog.csdn.net/jiaoyangwm/article/details/80011656


分享到:


相關文章: