本身搭建神經網絡時,通常都採用已有的網絡模型,在其基礎上進行修改。從2012年的AlexNet出現,現在已經出現許多優秀的網絡模型,以下圖所示。 主要有三個發展方向:html
Deeper:網絡層數更深,表明網絡VggNet算法
Module: 採用模塊化的網絡結構(Inception),表明網絡GoogleNet網絡
Faster: 輕量級網絡模型,適合於移動端設備,表明網絡MobileNet和ShuffleNet架構
Functional: 功能型網絡,針對特定使用場景而發展出來。如檢測模型YOLO,Faster RCNN;分割模型FCN, UNetide
其發展歷史能夠分爲三個階段:模塊化
這些模型在ImageNet上的表現效果對好比下:函數
1. LeNet-5性能
LeNet-5是LeCun在1998年的論文中Gradient-Based Learning Applied to Document Recognition 提出的網絡模型,其結構以下:(其中卷積爲5*5的kernel,下采樣爲2*2的MaxPooling),其結構比較簡單,關於LeNet-5結構設計的詳細分析,參見:參考一,參考二學習
2. AlexNet優化
AlexNet是Alex Krizhevsky在2012的文章ImageNet Classification with Deep Convolutional Neural Networks中提出,其結構模型以下:(分上下兩部分卷積,計算力不足,放在兩塊GPU上)
(1) Training on Multiple Gpus: 受於當時的算力限制,Alexnet創新地將圖像分爲上下兩塊分別訓練,而後在全鏈接層合併在一塊兒
(2) ReLU Nonlinearity: 採用ReLU激活函數代替Sigmoid或tanh, 解決了梯度飽和的問題
(3)Local Response Normalization: 局部響應歸一化,
(4) Data Augmentation: 擴增數據,減少過擬合:第一種是 摳圖(從256x256摳出224x224)加上水平反轉。第二種是 改變RGB顏色通道強度。
(5) Dropout: 以必定機率捨棄神經元輸出,減少過擬合。
3.ZFNet
ZFNet是2013年的論文Visualizing and Understanding Convolutional Networks中提出,是2013年ILSVRC的冠軍。這篇文章使用反捲積(Deconvnet),可視化特徵圖(feature map),經過可視化Alex-net指出了Alex-net的一些不足,最後修改網絡結構,使得分類結果提高;是CNN領域可視化理解的開山之做,做者經過可視化解釋了爲何CNN有很是好的性能、如何提升CNN性能,而後進行調整網絡,提升了精度(參考文章)
ZFNet經過修改結構中的超參數來實現對AlexNet的改良,具體說來就是增長了中間卷積層的尺寸,讓第一層的步長和濾波器尺寸更小。其網絡結構的兩種表示圖以下:
相比於AlexNet其改進以下:(ImageNet top5 error:16.4%提高到11.7%)
(1) Conv1: 第一個卷積層由(11*11, stride=4)變爲(7*7,stride=2)
(2) Conv3, 4, 5: 第三,四,五個卷積核的通道數由384,384,256變爲512,1024,512
3. VGGNet
VGGNet是2014年論文Very Deep Convolutional Networks for Large-scale Image Recognition 中提出,2014年的ImageNet比賽中,分別在定位和分類跟蹤任務中取得第一名和第二名,其主要的貢獻是展現出網絡的深度(depth)是算法優良性能的關鍵部分,其結構以下:
(1) 結構簡潔:5層卷積層、3層全鏈接層、softmax輸出層構成,層與層之間使用max-pooling(最大化池)分開,全部隱層激活單元都採用ReLU函數。
(2)小卷積核和多卷積核:VGG使用多個較小卷積核(3x3)的卷積層代替一個卷積核較大的卷積層,一方面能夠減小參數,另外一方面至關於進行了更多的非線性映射,能夠增長網絡的擬合/表達能力。
VGG的做者認爲兩個3x3的卷積堆疊得到的感覺野大小,至關一個5x5的卷積;而3個3x3卷積的堆疊獲取到的感覺野至關於一個7x7的卷積。這樣能夠增長非線性映射,也能很好地減小參數(例如7x7的參數爲49個,而3個3x3的參數爲27),以下圖所示:
VGGNet提出的結論:
(1) LRN層無性能增益(A-LRN):AlexNet曾經用到的LRN層(local response normalization,局部響應歸一化)並無帶來性能的提高
(2) 隨着深度增長,分類性能逐漸提升(從11層到19層)
(3) 多個小卷積核比單個大卷積核性能好
4. GoogLeNet
4.1 GoogLeNet V1
GoogLetNet V1是在2014年論文Going deeper with convolutions中提出的,ILSVRC 2014的勝利者。相比於VGG,其並非單純的將網絡加深,還引入了Inception模塊的概念,最終性能和VGG差很少,但參數量更少。
Inception提出緣由:傳統網絡爲了減小參數量,減少過擬合,將全鏈接和通常卷積轉化爲隨機稀疏鏈接,可是計算機硬件對非均勻稀疏數據的計算效率差,爲了既保持網絡結構的稀疏性,又能利用密集矩陣的高計算你性能,Inception網絡結構的主要思想是尋找用密集成分來近似最優局部稀疏鏈接,經過構造一種「基礎神經元」結構,來搭建一個稀疏性、高計算性能的網絡結構
Inception的結構以下圖所示:
Inception架構特色:
(1)加深的基礎上進行加寬,稀疏的網絡結構,但能產生稠密的數據,既能增長神經網絡表現,又能保證計算資源的使用效率
(2) 採用不一樣大小的卷積核意味着不一樣的感覺野,最後在channel上拼接,意味着不一樣尺度的特徵融合
(3)採用1*1卷積,一是減小維度來減小計算量和參數,二是修正線性激活,增長非線性擬合能力(每一個1*1後都有ReLU激活函數)
以Inception爲基礎模塊,GoogLeNet V1的總體網絡架構以下(共22層):
(1) 採用Inception模塊化結構,方便添加修改
(2) 採用Average Pool 來代替全鏈接層(借鑑Network in Network),實際在最後一層仍是添加了一個全鏈接層,方便作finetune。
(3) 另外增長了兩個輔助的softmax分支(incetion 4b和4e後面),做用有兩點,一是爲了不梯度消失,用於向前傳導梯度。反向傳播時若是有一層求 導爲0,鏈式求導結果則爲0。二是將中間某一層輸出用做分類,起到模型融合做用。最後的loss=loss_2 + 0.3 * loss_1 + 0.3 * loss_0。實際測 試時,這兩個輔助softmax分支會被去掉。
4.2 GoogLeNet V2, V3
GoogLeNet V2, V3是在2015年論文 Rethinking the Inception Architecture for Computer Vision 中提出,主要是對V1的改進。
GoogLeNet v2的Inception結構和總體的架構以下:
GoogLeNet V2網絡特色:
(1) 借鑑VGG,用兩個3*3卷積代替一個5*5卷積,下降參數量,提升計算速度(如上圖Figure5中Inception)
(2)它們將濾波器大小nxn的卷積分解爲1xn和nx1卷積的組合(7x7卷積至關於首先執行1x7卷積,而後在其輸出上執行7x1卷積,如上圖Figure6中Inception),但在網絡的前期使用這種分解效果並很差,在中度大小的特徵圖(feature map)上使用效果纔會更好(特徵圖大小建議在12到20之間)
(3) 爲了同時保持特徵表示並下降計算量,將池化和卷積並行執行再合併,以下圖所示:
GoogLeNet V3: V3包含了爲V2規定的全部上述改進,另外還使用瞭如下內容:
(1)採用RMSProp優化器
(2) 學習Factorization into small convolutions的思想,將7x7分解成兩個一維的卷積(1x7,7x1),3x3也是同樣(1x3,3x1),這樣的好處,既能夠加 速計算(多餘的計算能力能夠用來加深網絡),又能夠將1個conv拆成2個conv,使得網絡深度進一步增長,增長了網絡的非線性,還有值得注 意的地方是網絡輸入從224x224變爲了299x299,更加精細設計了35x35/17x17/8x8的模塊。
(3) 在輔助分類器中的使用BatchNorm。
(4) 採用標籤平滑(添加到損失公式中的一種正規化組件,可防止網絡對類過於自信。防止過分擬合)
4.3 GoogLeNet V4
GoogLeNet V4(Inception V4)是在2016年的論文 Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning 中提出,主要是利用殘差網絡(ResNet)來改進V3,獲得Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4網絡。
5. ResNet
ResNet是何凱明在2015年的論文Deep Residual Learning for Image Recognition 中提出,ResNet網絡提出了殘差網絡結構,解決了之前深層網絡難訓練的問題,將網絡深度有GoogLeNet的22層提升到了152層。殘差網絡(bottleneck)的結構以下:(參考1)
相比傳統網絡:y=f(x),ResNet Block公式爲:y=f(x) + x,能夠稱之爲skip connect。有兩個點須要思考下:一是其導數總比原導數加1,這樣即便原導數很小時,也能傳遞下去,能解決梯度消失的問題; 二是y=f(x) + x式子中引入了恆等映射(當f(x)=0時,y=2),解決了深度增長時神經網絡的退化問題。
ResNet由多個Residual Block疊加成的,其結構以下:
其中Resnet-18/34採用的residual block和Resnet-50/101/152不太同樣,分別以下所示:
除了殘差結構,ResNet還有兩個細節須要關注下:
(1)第一個卷積層採用了7*7的大卷積核,更大的感覺野,獲取圖片更多的初始特徵(primary feature) (圖片channel=3,第一層使用大kernel,增長的參 數量不是很大)
· (2)短路鏈接中,輸入和輸出維度不一致時,不能直接相加(Element-wise add),採用步長爲2的卷積來減少維度尺寸?
6. DenseNet
DenseNet網絡是在2017的論文 Densely Connected Convolutional Networks 中提出,與ResNet一致,也採用shortcut鏈接,可是其將前面全部層與後面層密集鏈接(dense connection), 另外其採用channel concatenate來實現特徵重用(代替ResNet的Element-wise addition)。其總體網絡結構以下圖所示:
DenseNet網絡包括Dense Block和Transition layer兩個基礎模塊,Dense Block相似於ResNet中的residual block,其區別對好比下:
由上圖能夠發現兩個主要區別:(參考1)
(1) DenseNet是密集鏈接,前面層和後面層間都有鏈接;ResNet只有相鄰層有鏈接
(2) DenseNet是channel-wise concatenation; Resnet 是Element-wise addition
DenseNet的Transition layer主要是用來下降feature map的尺寸,未來自不一樣層的feature map變化爲同等尺寸後進行concatenate,其結構以下:
BN + ReLU+1*1 Conv + 2*2 Average Pool
DenseNet的特色:
(1) 因爲密集鏈接方式,DenseNet提高了梯度的反向傳播,使得網絡更容易訓練 (每層能夠直達最後的偏差信號)
(2) 參數更小且計算更高效 (concatenate來實現特徵複用,計算量很小)
(3) 因爲特徵複用,分類器使用到了低級特徵
(4) 須要較大的顯存才能運行(全部層都需存儲?)
參考:https://zhuanlan.zhihu.com/p/66215918
https://zhuanlan.zhihu.com/p/22038289
上述都是些大型的經典網絡,運行較慢,須要的較大的算力,而輕量級網絡則採用不一樣的設計和模型架構,來應對移動端設備上的使用,目前主要的輕量級網絡包括 SqueezzeNet, MobileNet和ShuffleNet,其發展歷史以下:
這些網絡實現輕量級的主要方法以下:
(1) 優化網絡結構: shuffle Net
(2) 減小網絡的參數: Squeeze Net
(3) 優化卷積計算: MobileNet(改變卷積的順序); Winograd(改變卷積計算方式)
(4) 刪除全鏈接層: Squeeze Net; LightCNN
7. SqueezeNet
SqueezeNet是在2017年的論文 SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size 中提出, squeezeNet的模型壓縮策略主要有三個:(Idea from GoogLeNet) (參考1)
(1) 多使用1*1的卷積,少使用3*3的卷積,減小參數量
(2) 3*3卷積採用更少的channel數
(3) 將降採樣後置,即推遲使用Pooling,從而增長感覺野,儘量多的得到feature
SqueezeNet的網絡基礎單元是Fire Module,多個fire module堆疊,結合pooling組成SqueezeNet,以下圖所示:(右邊兩張加入了shortcut)
Fire Module又包括兩部分:squeeze layer 和 Expand layer,以下圖所示:
squeeze layer:主要是1*1的卷積,對網絡channel進行壓縮,卷積核的個數爲S1
expand layer:1*1的卷積個數爲E1,3*3的卷積個數爲E3(上圖中E2應該爲E3),而後進行concate。
論文中關於E1, E3,S1的關係描述以下:
8. MobileNet
8.1 MobileNet V1
MobileNet V1是在2017年Google的論文 MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 中提出,其主要壓縮策略是深度可分離卷積(Depthwise separable Convolution),其包括兩步,以下圖所示:
(1) 深度卷積:將卷積拆分爲單通道的形式,在不改變輸入特徵圖像的深度的狀況下,對每一通道進行卷積操做,獲得和輸入特徵圖通道數一致的輸出特徵圖。以下圖,輸入12×12×3的特徵圖,通過5×5×1×3的深度卷積以後,獲得了8×8×3的輸出特徵圖。輸入個輸出的維度是不變的3。
(2)逐點卷積:即1*1的卷積,對深度卷積獲得的特徵圖進行升維,以下圖,8×8×3的特徵圖,經過1*1*3*256的卷積,輸出8*8*256的輸出特徵圖。
參數量和計算量對比:
深度可分離卷積和傳統卷積相比操做和參數更少,以下圖所示,能夠發現深度可分離卷積操做數和參數都是傳統卷積的(1/N +1/Dk2), 採用3*3卷積時大約是1/9。(但模型精度大概只下降1%)
模型結構對比:
深度可分離卷積單元相比傳統卷積多一個ReLU6激活函數和1*1卷積層,對好比下圖:
MobileNet V1網絡的總體架構以下圖, 多個深度卷積的堆疊(s2表示步長爲2),: (參考1)
MobileNet V1還能夠引入結構超參數來進一步壓縮網絡,主要是在kernel的深度和尺寸兩方面,以下圖:
8.2 MobileNet V2
MobileNet V2是在2018年的論文 MobileNetV2: Inverted Residuals and Linear Bottlenecks 中提出,對V1的卷積單元進行了改進,主要引入了Linear bottleneck和Inverted residuals。
(1) Linear bottleneck : 在原始V1訓練時容易出現卷積層參數爲空的現象,這是因爲ReLU函數:對低維度作ReLU運算,很容易形成信息的丟失。而在高維度進行ReLU運算的話,信息的丟失則會不多(參考);所以去掉卷積單元中最後一個ReLU函數。
(Linear bottleneck: Eltwise + with no ReLU at the end of the bottleneck)
(2) Inverted Residual: 深度卷積自己沒有改變channel的能力,來的是多少通道輸出就是多少通道。若是來的通道不多的話,DW深度卷積只能在低維度上工做,這樣效果並不會很好,因此咱們要「擴張」通道。既然咱們已經知道PW逐點卷積也就是1×1卷積能夠用來升維和降維,那就能夠在DW深度卷積以前使用PW卷積進行升維(升維倍數爲t,t=6),再在一個更高維的空間中進行卷積操做來提取特徵,隨後再進行降維。
(Inverted Residual: expand - transfer - reduce)
對比下V2和ResNet的結構,以下圖:能夠發現V2是先升,卷積,降維,和ResNet(降維,卷積,升維)相反,所以成爲Inverted residual.
Linear bottleneck和Inverted Residual解釋:
對比下V1和V2的卷積結構單元,以下圖:V2將最後一層的ReLU6換成了Linear,並引入了shortcut進行升維和將維(最右邊的stride=2減少尺寸,因此沒有shortcut)。
MobileNet V2的總體結構以下圖:
8.3 MobileNet V3
MobileNet V3在2019年的論文Searching for MobileNetV3 中提出,還沒啃完,有空來填坑。
9 ShuffleNet
9.1 shuffleNet V1
shuffleNet V1 是2017年在論文ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices 中提出的,其主要壓縮思路是group convolution 和 channel shuffle。(參考1,參考2)
(1) group convolution(分組卷積): 分組卷積的思路是將輸入特徵圖按通道數分爲幾組,而後採用不一樣的卷積核再對各個組進行卷積,這樣會下降卷積的計算量。傳統的卷積是卷積核在全部通道上進行卷積,算全通道卷積,而分組卷積算通道上的稀疏卷積,以下圖所示。(mobileNet算是一種特殊的分組卷積,分組數和通道數同樣)
(2)channel shuffle(通道混洗) : 分組卷積以一個問題是不一樣組之間的特徵圖信息不通訊,就好像分了幾個互不相干的路,你們各走各的,會下降網絡的特徵提取能力。MobileNet是採用密集的1*1pointwise convolution進行通道特徵融合,計算量較大。channel shuffle的思路是對分組卷積以後的特徵圖的排列順序進行打亂從新排列,這樣下一個分組卷積的輸入就來自不一樣的組,信息能夠在不一樣組之間流轉。channel shuffle的實現步驟以下圖所示:reshape--transpose-flatten
shufflleNet V1網絡的基本單元以下圖所示,相比a圖中,b圖將1x1的密集卷積換成分組卷積,添加了一個channel shuffle,另外3x3的depthwise convolution以後沒有使用ReLU激活函數,圖c中則採用stride=2,同時將elment-wise add 換成了concat。
shuffleNet V1特色,以及和ResNet和mobileNet的對好比下:
ShuffleNet V1的總體架構以下,每一個stage都是shuffleNet基本單元的堆疊。
9.2 shuffleNet V2
shuffleNet V2 是2018年在論文ShuffleNet V2: Practical Guidelines for Ecient CNN Architecture Design中提出的, 論文中針對設計快速的輕量級模型提出了四條指導方針(Guidelines):
(1)G1: 卷積層的輸入和輸出特徵通道數相等時MAC最小,此時模型速度最快
(2)G2: 過多的 group操做會增大MAC,從而使模型速度變慢
(3) G3: 模型中的分支數量越少,模型速度越快
(4) G4:element-wise操做所帶來的時間消耗遠比在FLOPs上的體現的數值要多,所以要儘量減小element-wise操做。
論文中接着分析了其餘網絡模型違背了相應的原則方針,以下圖所示:
針對上述四條guidelines,論文提出shuffleNet V2的基本單元,以下圖:
(1) channel split而後concat,保證輸入輸出channel一致,遵循準則1?
(2) 去掉1*1的分組卷積(channel split至關於分組了),遵循準則2
(3) channel split和將channel shuffle移動到後面,遵循準則3?
(4)利用concat代替add,遵循準則4
最後shuffleNet V2的總體架構以下:
參考:https://baijiahao.baidu.com/s?id=1589005428414488177&wfr=spider&for=pc