經典CNN網絡結構

參考博客1
參考博客2
參考博客3
參考博客4
參考博客5
參考博客6
參考博客7
參考博客8
最近在準備找實習,對於面試中出現的常見問題(經典分類網絡有哪些,它們的特點與發展過程)打算進行整理,也方便之後找實習的過程中複習。
算網絡層數的時候不包括pooling,dropout,激活函數。只包括conv,fc。

1. LeNet

(LeNet5誕生於1994年,是最早的卷積神經網絡之一, 由Yann LeCun完成,推動了深度學習領域的發展)

在這裏插入圖片描述
下圖爲LeNet5的結構參數圖:
在這裏插入圖片描述

2. AlexNet

(2012年深度學習之父Hinton和他的學生Alex Krizhevshy提出,在競賽中以超過第二名10.9個百分點的絕對優勢一舉奪冠,從此深度學習和卷積神經網絡名聲鵲起)
在這之後的分類網絡都採用小的卷積核。
8層。
在這裏插入圖片描述
圖中明確顯示了兩個GPU 之間的職責劃分:一個GPU 運行圖中頂部的層次部分,另一個GPU 運行圖中底部的層次部分。GPU 之間僅在某些層互相通信。

數據預處理:
圖像尺寸:論文在訓練模型的時候,將圖像固定到256x256大小。首先給定一張圖像,將圖像的最小邊縮放到256,然後在圖像的中心位置裁剪出224x224大小的圖像,訓練時會經過預處理變爲227×227×3。
顏色變換:減去整個數據集的均值。

其他處理細節:
ReLU Nonlinearity
以前的標準做法都是採用sigmoid或者tanh非線性函數對網絡輸出進行非線性處理。
Training on Multiple GPUs
由於單張GTX 580 GPU只有3GB的顯存,從而大大限制了網絡的最大尺寸。從而作者採用了兩塊GPU卡進行模型訓練。並且在模型訓練的時候,存在數據交叉共享的操作。作者也指出,GPU在數據共享過程中是直接訪問對方的內存,沒有通過主機CPU內存,使得多張顯卡進行同時訓練變得非常合適。
數據共享只發生在第3層的結構上,2張顯卡的模型訓練結果相對於單張顯卡在性能上有一定提升,top1和top5的錯誤率提高了1.7%和1.2%,多張顯卡在時間上也比單張顯卡要少。
Local Response Normalization
儘管ReLUs操作能夠使得數據出現飽和性,從而避免對數據進行normalization操作的依賴。但是作者發現local normalization操作能然能夠提升一定的性能。
作者在每一個點的周圍進行了一次局部歸一化,但是通過變量α,βα,β來控制局部數據的歸一化情況。論文中作者採用K=2,n=5,α=10−4,β=0.75K=2,n=5,α=10−4,β=0.75,相當於把圖像進行了增強。
作者發現,使用local normalization操作能夠使的top1和top5的錯誤率降低1.4%和1.2%。
Overlapping Pooling
作者採用的是帶有重疊區域的池化操作,並指出:如果網絡大小爲z∗z,步長爲s,那麼:
當s=z 時候,則爲普通的池化操作
當ss<z 時候,則爲overlapping Pooling池化
論文中作者選取s=2,z=3並指出該操作可以將top1和top5的錯誤率降低0.4%和0.3%
Dropout
作者在所有的神經元的結構上都使用了dropout操作,factor=0.5。
在這裏插入圖片描述
.AlexNet的貢獻
(1)Relu做激活函數,代替Sigmoid來加快SGD的收斂速度。
(2)dropout避免過擬合 。
(3)重疊最大池化 overlapping Max Pooling。
(4)LRN(局部響應歸一化),利用臨近的數據做歸一化,加速訓練。
(5)GPU加速。
(6)數據增強,增加模型泛化能力。

3. VGG

( 2014年ImageNet比賽的基礎, 作者是Karen Simonyan 和 Andrew Zisserman)
在這裏插入圖片描述
在這裏插入圖片描述
VGG總結:

  1. 網絡更深,參數量大,共包含參數約爲550M,是AlexNet參數量的三倍,這些參數的大部分都可以歸因於第一個全連接層。
  2. 堆疊多個小的卷積核而不使用池化操作可以增加網絡的表徵深度,同時限制參數的數量,而感受野不變。全部使用33的卷積核和22的最大池化核。
  3. 簡化了卷積神經網絡的結構。

4.GoogLeNet系列介紹

GoogLeNet(Inception v1)

(2014年,GoogLeNet和VGG是當年ImageNet挑戰賽(ILSVRC14)的雙雄,GoogLeNet獲得了第一名、VGG獲得了第二名)
(小知識:GoogLeNet是谷歌(Google)研究出來的深度網絡結構,爲什麼不叫“GoogleNet”,而叫“GoogLeNet”,據說是爲了向“LeNet”致敬,因此取名爲“GoogLeNet”)

Inception 結構的主要思路是怎樣用密集成分來近似最優的局部稀疏結構。
在這裏插入圖片描述
對上圖做以下說明:
1 . 採用不同大小的卷積核意味着不同大小的感受野,最後拼接意味着不同尺度特徵的融合;
2 . 之所以卷積核大小採用1、3和5,主要是爲了方便對齊。設定卷積步長stride=1之後,只要分別設定pad=0、1、2,那麼卷積之後便可以得到相同維度的特徵,然後這些特徵就可以直接拼接在一起了;
3 . 文章說很多地方都表明pooling挺有效,所以Inception裏面也嵌入了。
4 . 網絡越到後面,特徵越抽象,而且每個特徵所涉及的感受野也更大了,因此隨着層數的增加,3x3和5x5卷積的比例也要增加。

但是,使用5x5的卷積核仍然會帶來巨大的計算量。 爲此,文章借鑑NIN2,採用1x1卷積核來進行降維。
例如:上一層的輸出爲100x100x128,經過具有256個輸出的5x5卷積層之後(stride=1,pad=2),輸出數據爲100x100x256。其中,卷積層的參數爲128x5x5x256。假如上一層輸出先經過具有32個輸出的1x1卷積層,再經過具有256個輸出的5x5卷積層,那麼最終的輸出數據仍爲爲100x100x256,但卷積參數量已經減少爲128x1x1x32 + 32x5x5x256,大約減少了4倍。

具體改進後的Inception Module如下圖:
在這裏插入圖片描述
基於Inception構建了GoogLeNet的網絡結構如下(共22層):
在這裏插入圖片描述
對上圖說明如下:
(1)GoogLeNet採用了模塊化的結構(Inception結構),方便增添和修改;
(2)網絡最後採用了average pooling(平均池化)來代替全連接層,該想法來自NIN(Network in Network),事實證明這樣可以將準確率提高0.6%。但是,實際在最後還是加了一個全連接層,主要是爲了方便對輸出進行靈活調整;
(3)雖然移除了全連接,但是網絡中依然使用了Dropout ;
(4)爲了避免梯度消失,網絡額外增加了2個輔助的softmax用於向前傳導梯度(輔助分類器)。輔助分類器是將中間某一層的輸出用作分類,並按一個較小的權重(0.3)加到最終分類結果中,這樣相當於做了模型融合,同時給網絡增加了反向傳播的梯度信號,也提供了額外的正則化,對於整個網絡的訓練很有裨益。而在實際測試的時候,這兩個額外的softmax會被去掉。

GoogLeNet的網絡結構圖細節如下:
在這裏插入圖片描述
注:上表中的“#3x3 reduce”,“#5x5 reduce”表示在3x3,5x5卷積操作之前使用了1x1卷積的數量。
0、輸入
原始輸入圖像爲224x224x3,且都進行了零均值化的預處理操作(圖像每個像素減去均值)。
1、第一層(卷積層)
使用7x7的卷積核(滑動步長2,padding爲3),64通道,輸出爲112x112x64,卷積後進行ReLU操作
經過3x3的max pooling(步長爲2),輸出爲((112 - 3+1)/2)+1=56,即56x56x64,再進行ReLU操作
2、第二層(卷積層)
使用3x3的卷積核(滑動步長爲1,padding爲1),192通道,輸出爲56x56x192,卷積後進行ReLU操作
經過3x3的max pooling(步長爲2),輸出爲((56 - 3+1)/2)+1=28,即28x28x192,再進行ReLU操作
3a、第三層(Inception 3a層)
分爲四個分支,採用不同尺度的卷積核來進行處理
(1)64個1x1的卷積核,然後RuLU,輸出28x28x64
(2)96個1x1的卷積核,作爲3x3卷積核之前的降維,變成28x28x96,然後進行ReLU計算,再進行128個3x3的卷積(padding爲1),輸出28x28x128
(3)16個1x1的卷積核,作爲5x5卷積核之前的降維,變成28x28x16,進行ReLU計算後,再進行32個5x5的卷積(padding爲2),輸出28x28x32
(4)pool層,使用3x3的核(padding爲1),輸出28x28x192,然後進行32個1x1的卷積,輸出28x28x32。
將四個結果進行連接,對這四部分輸出結果的第三維並聯,即64+128+32+32=256,最終輸出28x28x256
3b、第三層(Inception 3b層)
(1)128個1x1的卷積核,然後RuLU,輸出28x28x128
(2)128個1x1的卷積核,作爲3x3卷積核之前的降維,變成28x28x128,進行ReLU,再進行192個3x3的卷積(padding爲1),輸出28x28x192
(3)32個1x1的卷積核,作爲5x5卷積核之前的降維,變成28x28x32,進行ReLU計算後,再進行96個5x5的卷積(padding爲2),輸出28x28x96
(4)pool層,使用3x3的核(padding爲1),輸出28x28x256,然後進行64個1x1的卷積,輸出28x28x64。
將四個結果進行連接,對這四部分輸出結果的第三維並聯,即128+192+96+64=480,最終輸出輸出爲28x28x480

第四層(4a,4b,4c,4d,4e)、第五層(5a,5b)……,與3a、3b類似,在此就不再重複。

Inception V2

(2015年)
1、卷積分解(Factorizing Convolutions)
大尺寸的卷積核可以帶來更大的感受野,但也意味着會產生更多的參數,比如5x5卷積核的參數有25個,3x3卷積核的參數有9個,前者是後者的25/9=2.78倍。因此,GoogLeNet團隊提出可以用2個連續的3x3卷積層組成的小網絡來代替單個的5x5卷積層,即在保持感受野範圍的同時又減少了參數量。
在這裏插入圖片描述
2. 提出了著名的BN,可以使用較大的學習率,起正則化的作用,減少或取消dropout,簡化網絡結構。

Inception v3

(2015年12月)
1.將二維卷積拆成兩個較小的一維卷積。
可以看出,大卷積核完全可以由一系列的3x3卷積核來替代,那能不能再分解得更小一點呢?GoogLeNet團隊考慮了nx1的卷積核,如下圖所示,用3個3x1取代3x3卷積:
在這裏插入圖片描述
任意nxn的卷積都可以通過1xn卷積後接nx1卷積來替代,分解後就能節省33%的計算量。GoogLeNet團隊發現在網絡的前期使用這種分解效果並不好,在中度大小的特徵圖(feature map)上使用效果纔會更好(特徵圖大小建議在12到20之間)。
在這裏插入圖片描述
2、可以使用並行結構來優化Pooling。
一般情況下,如果想讓圖像縮小,可以有如下兩種方式:
在這裏插入圖片描述
先池化再作Inception卷積,或者先作Inception卷積再作池化。但是方法一(左圖)先作pooling(池化)會導致特徵表示遇到瓶頸(特徵缺失),方法二(右圖)是正常的縮小,但計算量很大。爲了同時保持特徵表示且降低計算量,將網絡結構改爲下圖,使用兩個並行化的模塊來降低計算量(卷積、池化並行執行,再進行合併)
在這裏插入圖片描述
在這裏插入圖片描述
3.使用Label Smoothing來對網絡輸出進行正則化
LSR可以防止模型把預測值過度集中在概率較大類別上,把一些概率分到其他概率較小類別上。

Inception v4

(2016年)
作者Christian Szegedy設計了inception v4的網絡,將原來卷積、池化的順次連接(網絡的前幾層)替換爲stem模塊,來獲得更深的網絡結構。stem模塊結構如下
Inception V4其實就是使用了不同的 Inception Block:

在這裏插入圖片描述

ResNet

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

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

從前面可以看到,隨着網絡深度增加,網絡的準確度應該同步增加,當然要注意過擬合問題。但是網絡深度增加的一個問題在於這些增加的層是參數更新的信號,因爲梯度是從後向前傳播的,增加網絡深度後,比較靠前的層梯度會很小。這意味着這些層基本上學習停滯了,這就是梯度消失問題。深度網絡的第二個問題在於訓練,當網絡更深時意味着參數空間更大,優化問題變得更難,因此簡單地去增加網絡深度反而出現更高的訓練誤差,深層網絡雖然收斂了,但網絡卻開始退化了,即增加網絡層數卻導致更大的誤差,比如下圖,一個56層的網絡的性能卻不如20層的性能好,這不是因爲過擬合(訓練集訓練誤差依然很高),這就是煩人的退化問題。殘差網絡ResNet設計一種殘差模塊讓我們可以訓練更深的網絡。

ResNet有效的原因:
1.前向計算:低層卷積網絡與高層卷積網絡信息融合,層數越深,模型的表現力越強。
2.後向計算:導數傳遞更加直接,越過模型,直達各層。
在這裏插入圖片描述
在這裏插入圖片描述

DenseNet

(CVPR2017)

先列下DenseNet的幾個優點,感受下它的強大:
1、減輕了vanishing-gradient(梯度消失)
2、加強了feature的傳遞
3、更有效地利用了feature
4、一定程度上較少了參數數量

在保證網絡中層與層之間最大程度的信息傳輸的前提下,直接將所有層連接起來。
在這裏插入圖片描述DenseNet的一個優點是網絡更窄,參數更少,很大一部分原因得益於這種dense block的設計,後面有提到在dense block中每個卷積層的輸出feature map的數量都很小(小於100),而不是像其他網絡一樣動不動就幾百上千的寬度。同時這種連接方式使得特徵和梯度的傳遞更加有效,網絡也就更加容易訓練。原文的一句話非常喜歡:Each layer has direct access to the gradients from the loss function and the original input signal, leading to an implicit deep supervision.直接解釋了爲什麼這個網絡的效果會很好。前面提到過梯度消失問題在網絡深度越深的時候越容易出現,原因就是輸入信息和梯度信息在很多層之間傳遞導致的,而現在這種dense connection相當於每一層都直接連接input和loss,因此就可以減輕梯度消失現象,這樣更深網絡不是問題。另外作者還觀察到這種dense connection有正則化的效果,因此對於過擬合有一定的抑制作用。

concatenation是做通道的合併,就像Inception那樣。而前面resnet是做值的相加,通道數是不變的。
這個Table1就是整個網絡的結構圖。這個表中的k=32,k=48中的k是growth rate,表示每個dense block中每層輸出的feature map個數。爲了避免網絡變得很寬,作者都是採用較小的k,比如32這樣,作者的實驗也表明小的k可以有更好的效果。根據dense block的設計,後面幾層可以得到前面所有層的輸入,因此concat後的輸入channel還是比較大的。另外這裏每個dense block的33卷積前面都包含了一個11的卷積操作,就是所謂的bottleneck layer,目的是減少輸入的feature map數量,既能降維減少計算量,又能融合各個通道的特徵,何樂而不爲。另外作者爲了進一步壓縮參數,在每兩個dense block之間又增加了11的卷積操作。因此在後面的實驗對比中,如果你看到DenseNet-C這個網絡,表示增加了這個Translation layer,該層的11卷積的輸出channel默認是輸入channel到一半。如果你看到DenseNet-BC這個網絡,表示既有bottleneck layer,又有Translation layer。
在這裏插入圖片描述
再詳細說下bottleneck和transition layer操作。在每個Dense Block中都包含很多個子結構,以DenseNet-169的Dense Block(3)爲例,包含32個11和33的卷積操作,也就是第32個子結構的輸入是前面31層的輸出結果,每層輸出的channel是32(growth rate),那麼如果不做bottleneck操作,第32層的33卷積操作的輸入就是3132+(上一個Dense Block的輸出channel),近1000了。而加上11的卷積,代碼中的11卷積的channel是growth rate4,也就是128,然後再作爲33卷積的輸入。這就大大減少了計算量,這就是bottleneck。至於transition layer,放在兩個Dense Block中間,是因爲每個Dense Block結束後的輸出channel個數很多,需要用11的卷積核來降維。還是以DenseNet-169的Dense Block(3)爲例,雖然第32層的33卷積輸出channel只有32個(growth rate),但是緊接着還會像前面幾層一樣有通道的concat操作,即將第32層的輸出和第32層的輸入做concat,前面說過第32層的輸入是1000左右的channel,所以最後每個Dense Block的輸出也是1000多的channel。因此這個transition layer有個參數reduction(範圍是0到1),表示將這些輸出縮小到原來的多少倍,默認是0.5,這樣傳給下一個Dense Block的時候channel數量就會減少一半,這就是transition layer的作用。文中還用到dropout操作來隨機減少分支,避免過擬合,畢竟這篇文章的連接確實多。

最後,放一張各個網絡模型參數對比
在這裏插入圖片描述

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