CNN的發展歷程

目錄

簡介 

開山之作:LeNet

王者歸來:AlexNet

穩步前行:ZF-Net

越走越深:VGG-Nets

大浪推手:GoogLeNet

里程碑式創新:ResNet

繼往開來:DenseNet

簡介 

卷積神經網絡可謂是現在深度學習領域中大紅大紫的網絡框架,尤其在計算機視覺領域更是一枝獨秀。CNN從90年代的LeNet開始,21世紀初沉寂了10年,直到12年AlexNet開始又再煥發第二春,從ZF-Net到VGG,GoogLeNet再到ResNet和最近的DenseNet,網絡越來越深,架構越來越複雜,解決反向傳播時梯度消失的方法也越來越巧妙。好好總結一波CNN的各種經典架構吧,領略一下CNN的發展歷程中各路大神之間的智慧碰撞之美。

上面那圖是ILSVRC歷年的Top-5錯誤率,我們會按照以上經典網絡出現的時間順序對他們進行介紹。

本文將會談到以下經典的卷積神經網絡:、

開山之作:LeNet

閃光點:定義了CNN的基本組件,是CNN的鼻祖。

LeNet是卷積神經網絡的祖師爺LeCun在1998年提出,用於解決手寫數字識別的視覺任務。自那時起,CNN的最基本的架構就定下來了:卷積層、池化層、全連接層。如今各大深度學習框架中所使用的LeNet都是簡化改進過的LeNet-5(-5表示具有5個層),和原始的LeNet有些許不同,比如把激活函數改爲了現在很常用的ReLu

LeNet-5跟現有的conv->pool->ReLU的套路不同,它使用的方式是conv1->pool->conv2->pool2再接全連接層,但是不變的是,卷積層後緊接池化層的模式依舊不變。

以上圖爲例,對經典的LeNet-5做深入分析:

  1. 首先輸入圖像是單通道的28*28大小的圖像,用矩陣表示就是[1,28,28]
  2. 第一個卷積層conv1所用的卷積核尺寸爲5*5,滑動步長爲1,卷積核數目爲20,那麼經過該層後圖像尺寸變爲24,28-5+1=24,輸出矩陣爲[20,24,24]。(卷積後邊長計算)
  3. 第一個池化層pool核尺寸爲2*2,步長2,這是沒有重疊的max pooling,池化操作後,圖像尺寸減半,變爲12×12,輸出矩陣爲[20,12,12]。
  4. 第二個卷積層conv2的卷積核尺寸爲5*5,步長1,卷積核數目爲50,卷積後圖像尺寸變爲8,這是因爲12-5+1=8,輸出矩陣爲[50,8,8].
  5. 第二個池化層pool2核尺寸爲2*2,步長2,這是沒有重疊的max pooling,池化操作後,圖像尺寸減半,變爲4×4,輸出矩陣爲[50,4,4]。
  6. pool2後面接全連接層fc1,神經元數目爲500,再接relu激活函數。
  7. 再接fc2,神經元個數爲10,得到10維的特徵向量,用於10個數字的分類訓練,送入softmaxt分類,得到分類結果的概率output。

王者歸來:AlexNet

AlexNet在2012年ImageNet競賽中以超過第二名10.9個百分點的絕對優勢一舉奪冠,從此深度學習和卷積神經網絡名聲鵲起,深度學習的研究如雨後春筍般出現,AlexNet的出現可謂是卷積神經網絡的王者歸來

閃光點:

  • 更深的網絡
  • 數據增廣
  • ReLU
  • dropout
  • LRN

以上圖AlexNet架構爲例,這個網絡前面5層是卷積層,後面三層是全連接層,最終softmax輸出是1000類,取其前兩層進行詳細說明。

  1. AlexNet共包含5層卷積層和三層全連接層,層數比LeNet多了不少,但卷積神經網絡總的流程並沒有變化,只是在深度上加了不少。

  2. AlexNet針對的是1000類的分類問題,輸入圖片規定是256×256的三通道彩色圖片,爲了增強模型的泛化能力,避免過擬合,作者使用了隨機裁剪的思路對原來256×256的圖像進行隨機裁剪,得到尺寸爲3×224×224的圖像,輸入到網絡訓練。

  1. 因爲使用多GPU訓練,所以可以看到第一層卷積層後有兩個完全一樣的分支,以加速訓練。

  2. 針對一個分支分析:第一層卷積層conv1的卷積核尺寸爲11×11,滑動步長爲4,卷積核數目爲48。卷積後得到的輸出矩陣爲[48,55,55]。這裏的55是個難以理解的數字,作者也沒有對此說明,如果按照正常計算的話(224-11)/4+1 != 55的,所以這裏是做了padding再做卷積的,即先padiing圖像至227×227,再做卷積(227-11)/4+1 = 55。這些像素層經過relu1單元的處理,生成激活像素層,尺寸仍爲2組48×55×55的像素層數據
    。然後經過歸一化處理,歸一化運算的尺度爲5*5。第一卷積層運算結束後形成的像素層的規模爲48×27×27。
  3. 輸入矩陣是[48,55,55].接着是池化層,做max pooling操作,池化運算的尺度爲3*3,運算的步長爲2,則池化後圖像的尺寸爲(55-3)/2+1=27。所以得到的輸出矩陣是[48,27,27]。後面層不再重複敘述。

AlexNet用到訓練技巧:

  • 數據增廣技巧來增加模型泛化能力。
  • 用ReLU代替Sigmoid來加快SGD的收斂速度
  • Dropout:Dropout原理類似於淺層學習算法的中集成算法,該方法通過讓全連接層的神經元(該模型在前兩個全連接層引入Dropout)以一定的概率失去活性(比如0.5)失活的神經元不再參與前向和反向傳播,相當於約有一半的神經元不再起作用。在測試的時候,讓所有神經元的輸出乘0.5。Dropout的引用,有效緩解了模型的過擬合。
  • Local Responce Normalization:局部響應歸一層的基本思路是,假如這是網絡的一塊,比如是 13×13×256, LRN 要做的就是選取一個位置,比如說這樣一個位置,從這個位置穿過整個通道,能得到 256 個數字,並進行歸一化。進行局部響應歸一化的動機是,對於這張 13×13 的圖像中的每個位置來說,我們可能並不需要太多的高激活神經元。但是後來,很多研究者發現 LRN 起不到太大作用,因爲並不重要,而且我們現在並不用 LRN 來訓練網絡。

穩步前行:ZF-Net

ZFNet是2013ImageNet分類任務的冠軍,其網絡結構沒什麼改進,只是調了調參,性能較Alex提升了不少。ZF-Net只是將AlexNet第一層卷積核由11變成7,步長由4變爲2,第3,4,5卷積層轉變爲384,384,256。這一年的ImageNet還是比較平靜的一屆,其冠軍ZF-Net的名堂也沒其他屆的經典網絡架構響亮。

 

越走越深:VGG-Nets

VGG-Nets是由牛津大學VGG(Visual Geometry Group)提出,是2014年ImageNet競賽定位任務的第一名和分類任務的第二名的中的基礎網絡。VGG可以看成是加深版本的AlexNet. 都是conv layer + FC layer,在當時看來這是一個非常深的網絡了,因爲層數高達十多層,我們從其論文名字就知道了(《Very Deep Convolutional Networks for Large-Scale Visual Recognition》),當然以現在的目光看來VGG真的稱不上是一個very deep的網絡。

上面一個表格是描述的是VGG-Net的網絡結構以及誕生過程。爲了解決初始化(權重初始化)等問題,VGG採用的是一種Pre-training的方式,這種方式在經典的神經網絡中經常見得到,就是先訓練一部分小網絡,然後再確保這部分網絡穩定之後,再在這基礎上逐漸加深。表1從左到右體現的就是這個過程,並且當網絡處於D階段的時候,效果是最優的,因此D階段的網絡也就是VGG-16了!E階段得到的網絡就是VGG-19了!VGG-16的16指的是conv+fc的總層數是16,是不包括max pool的層數!

下面這個圖就是VGG-16的網絡結構。

由上圖看出,VGG-16的結構非常整潔,深度較AlexNet深得多,裏面包含多個conv->conv->max_pool這類的結構,VGG的卷積層都是same的卷積,即卷積過後的輸出圖像的尺寸與輸入是一致的,它的下采樣完全是由max pooling來實現。

VGG網絡後接3個全連接層,filter的個數(卷積後的輸出通道數)從64開始,然後沒接一個pooling後其成倍的增加,128、512,VGG的注意貢獻是使用小尺寸的filter,及有規則的卷積-池化操作。

閃光點:

  • 卷積層使用更小的filter尺寸和間隔

與AlexNet相比,可以看出VGG-Nets的卷積核尺寸還是很小的,比如AlexNet第一層的卷積層用到的卷積核尺寸就是11*11,這是一個很大卷積核了。而反觀VGG-Nets,用到的卷積核的尺寸無非都是1×1和3×3的小卷積核,可以替代大的filter尺寸。

3×3卷積核的優點:

  • 多個3×3的卷基層比一個大尺寸filter卷基層有更多的非線性,使得判決函數更加具有判決性
  • 多個3×3的卷積層比一個大尺寸的filter有更少的參數,假設卷基層的輸入和輸出的特徵圖大小相同爲C,那麼三個3×3的卷積層參數個數3×(3×3×C×C)=27CC;一個7×7的卷積層參數爲49CC;所以可以把三個3×3的filter看成是一個7×7filter的分解(中間層有非線性的分解)

1*1卷積核的優點:

  • 作用是在不影響輸入輸出維數的情況下,對輸入進行線性形變,然後通過Relu進行非線性處理,增加網絡的非線性表達能力。

 

大浪推手:GoogLeNet

GoogLeNet在2014的ImageNet分類任務上擊敗了VGG-Nets奪得冠軍,其實力肯定是非常深厚的,GoogLeNet跟AlexNet,VGG-Nets這種單純依靠加深網絡結構進而改進網絡性能的思路不一樣,它另闢幽徑,在加深網絡的同時(22層),也在網絡結構上做了創新,引入Inception結構代替了單純的卷積+激活的傳統操作(這思路最早由Network in Network提出)。GoogLeNet進一步把對卷積神經網絡的研究推上新的高度。

閃光點:

  • 引入Inception結構
  • 中間層的輔助LOSS單元
  • 後面的全連接層全部替換爲簡單的全局平均pooling

上圖結構就是Inception,結構裏的卷積stride都是1,另外爲了保持特徵響應圖大小一致,都用了零填充。最後每個卷積層後面都立刻接了個ReLU層。在輸出前有個叫concatenate的層,直譯的意思是“並置”,即把4組不同類型但大小相同的特徵響應圖一張張並排疊起來,形成新的特徵響應圖。Inception結構裏主要做了兩件事:1. 通過3×3的池化、以及1×1、3×3和5×5這三種不同尺度的卷積核,一共4種方式對輸入的特徵響應圖做了特徵提取。2. 爲了降低計算量。同時讓信息通過更少的連接傳遞以達到更加稀疏的特性,採用1×1卷積核來實現降維。

這裏想再詳細談談1×1卷積核的作用,它究竟是怎麼實現降維的。現在運算如下:下面圖1是3×3卷積核的卷積,圖2是1×1卷積核的卷積過程。對於單通道輸入,1×1的卷積確實不能起到降維作用,但對於多通道輸入,就不不同了。假設你有256個特徵輸入,256個特徵輸出,同時假設Inception層只執行3×3的卷積。這意味着總共要進行 256×256×3×3的卷積(589000次乘積累加(MAC)運算)。這可能超出了我們的計算預算,比方說,在Google服務器上花0.5毫秒運行該層。作爲替代,我們決定減少需要卷積的特徵的數量,比如減少到64(256/4)個。在這種情況下,我們首先進行256到64的1×1卷積,然後在所有Inception的分支上進行64次卷積,接着再使用一個64到256的1×1卷積。

  • 256×64×1×1 = 16000
  • 64×64×3×3 = 36000
  • 64×256×1×1 = 16000

現在的計算量大約是70000(即16000+36000+16000),相比之前的約600000,幾乎減少了10倍。這就通過小卷積覈實現了降維。

現在再考慮一個問題:爲什麼一定要用1×1卷積核,3×3不也可以嗎?考慮[50,200,200]的矩陣輸入,我們可以使用20個1×1的卷積核進行卷積,得到輸出[20,200,200]。有人問,我用20個3×3的卷積核不是也能得到[20,200,200]的矩陣輸出嗎,爲什麼就使用1×1的卷積核?我們計算一下卷積參數就知道了,對於1×1的參數總數:20×200×200×(1×1),對於3×3的參數總數:20×200×200×(3×3),可以看出,使用1×1的參數總數僅爲3×3的總數的九分之一!所以我們使用的是1×1卷積核。


GoogLeNet網絡結構中有3個LOSS單元,這樣的網絡設計是爲了幫助網絡的收斂。在中間層加入輔助計算的LOSS單元,目的是計算損失時讓低層的特徵也有很好的區分能力,從而讓網絡更好地被訓練。在論文中,這兩個輔助LOSS單元的計算被乘以0.3,然後和最後的LOSS相加作爲最終的損失函數來訓練網絡。

GoogLeNet還有一個閃光點值得一提,那就是將後面的全連接層全部替換爲簡單的全局平均pooling,在最後參數會變的更少。而在AlexNet中最後3層的全連接層參數差不多佔總參數的90%,使用大網絡在寬度和深度允許GoogleNet移除全連接層,但並不會影響到結果的精度,在ImageNet中實現93.3%的精度,而且要比VGG還要快。

 

里程碑式創新:ResNet

2015年何愷明推出的ResNet在ISLVRC和COCO上橫掃所有選手,獲得冠軍。ResNet在網絡結構上做了大創新,而不再是簡單的堆積層數,ResNet在卷積神經網絡的新思路,絕對是深度學習發展歷程上里程碑式的事件。

閃光點:

  • 層數非常深,已經超過百層
  • 引入殘差單元來解決退化問題

 

這裏詳細分析一下殘差單元來理解ResNet的精髓。

下圖展示了兩種形態的殘差模塊,左圖是常規殘差模塊,有兩個3×3卷積核卷積核組成,但是隨着網絡進一步加深,這種殘差結構在實踐中並不是十分有效。針對這問題,右圖的“瓶頸殘差模塊”(bottleneck residual block)可以有更好的效果,它依次由1×1、3×3、1×1這三個卷積層堆積而成,這裏的1×1的卷積能夠起降維或升維的作用,從而令3×3的卷積可以在相對較低維度的輸入上進行,以達到提高計算效率的目的。

 

繼往開來:DenseNet

自Resnet提出以後,ResNet的變種網絡層出不窮,都各有其特點,網絡性能也有一定的提升。本文介紹的最後一個網絡是CVPR 2017最佳論文DenseNet,論文中提出的DenseNet(Dense Convolutional Network)主要還是和ResNet及Inception網絡做對比,思想上有借鑑,但卻是全新的結構,網絡結構並不複雜,卻非常有效,在CIFAR指標上全面超越ResNet。可以說DenseNet吸收了ResNet最精華的部分,並在此上做了更加創新的工作,使得網絡性能進一步提升。

閃光點:

  • 密集連接:緩解梯度消失問題,加強特徵傳播,鼓勵特徵複用,極大的減少了參數量

DenseNet 是一種具有密集連接的卷積神經網絡。在該網絡中,任何兩層之間都有直接的連接,也就是說,網絡每一層的輸入都是前面所有層輸出的並集,而該層所學習的特徵圖也會被直接傳給其後面所有層作爲輸入。下圖是 DenseNet 的一個dense block示意圖,一個block裏面的結構如下,與ResNet中的BottleNeck基本一致:BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3) ,而一個DenseNet則由多個這種block組成。每個DenseBlock的之間層稱爲transition layers,由BN−>Conv(1×1)−>averagePooling(2×2)組成

密集連接不會帶來冗餘嗎?不會!密集連接這個詞給人的第一感覺就是極大的增加了網絡的參數量和計算量。但實際上 DenseNet 比其他網絡效率更高,其關鍵就在於網絡每層計算量的減少以及特徵的重複利用。DenseNet則是讓l層的輸入直接影響到之後的所有層,它的輸出爲:xl=Hl([X0,X1,…,xl−1]),其中[x0,x1,...,xl−1]就是將之前的feature map以通道的維度進行合併。並且由於每一層都包含之前所有層的輸出信息,因此其只需要很少的特徵圖就夠了,這也是爲什麼DneseNet的參數量較其他模型大大減少的原因。這種dense connection相當於每一層都直接連接input和loss,因此就可以減輕梯度消失現象,這樣更深網絡不是問題

需要明確一點,dense connectivity 僅僅是在一個dense block裏的,不同dense block 之間是沒有dense connectivity的,比如下圖所示。

天底下沒有免費的午餐,網絡自然也不例外。在同層深度下獲得更好的收斂率,自然是有額外代價的。其代價之一,就是其恐怖如斯的內存佔用。

轉自:https://www.cnblogs.com/skyfsm/p/8451834.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章