AlexNet:(2012)主要貢獻擴展 LeNet 的深度,並應用一些 ReLU、Dropout 等技巧。AlexNet 有 5 個卷積層和 3 個最大池化層,它可分爲上下兩個徹底相同的分支,這兩個分支在第三個卷積層和全鏈接層上能夠相互交換信息。它是開啓了卷積神經網絡作圖像處理的先河。網絡
VGG-Net:2014年。該網絡使用3×3卷積核的卷積層堆疊並交替最大池化層,有兩個4096維的全鏈接層,而後是softmax分類器。16和19分別表明網絡中權重層的數量。相比於 AlexNet 有更小的卷積核和更深的層級。VGG 最大的問題就在於參數數量,VGG-19 基本上是參數量最多的卷積網絡架構。架構
ResNet:2015年。該網絡使用殘差模塊來組成更復雜的網絡(網絡中的網絡),使用標準隨機梯度降低法訓練。與VGG相比,ResNet更深,可是因爲使用全局平均池操做而不是全鏈接密集層,因此模型的尺寸更小。app
Inception:2015年。它沒有如同 VGG-Net 那樣大量使用全鏈接網絡,所以參數量很是小。增長了網絡的深度的同時也增長了網絡的寬度,該網絡使用不一樣大小的卷積核提取特徵,同時計算1×一、3×三、5×5卷積,而後分別把他們的結果concatenate(不一樣卷積操做輸出的feature map的大小要相同),而後將這些濾波器的輸出沿通道維度堆疊並傳遞到下一層。由於 1*一、3*3 或 5*5 等不一樣的卷積運算與池化操做能夠得到輸入圖像的不一樣信息,並行處理這些運算並結合全部結果將得到更好的圖像表徵。問題是計算量太大。框架
Inception v1:論文:Going deeper with convolutions,分佈式
Inception v2ide
Inception v3函數
Inception v4性能
Inception-v4編寫於2016年學習
Inception-ResNet測試
Xception:2016年。該網絡是Inception網絡的擴展,使用了深度可分離卷積運算。其參數數量與Inception-v3相同,因爲更高效地利用模型參數,該網絡性能得到提高並在大型圖像分類數據集賽過Inception-v3。
vgg的最主要的思想就是增長網絡深度,減少卷積核尺寸(3*3)。減小卷積核的好處就是能夠減小參數和計算量,好比,論文中舉了一個例子,把一個7*7的卷積層替換成3個3*3的卷積層,參數上能夠減小81%,由於3*3*3 = 27, 7*7 = 49.
文中還提到了1*1的卷積層,好比說下圖的configC的conv1層,這樣作的目的主要是增長卷積層的非線性表達,同時影響卷積層的感覺野,這個思想在google的inception系列網絡中有了很好的應用,具體能夠參考Network in Network這篇論文。
vgg的參數仍是不少的,能夠看出vgg-16有138百萬個參數。
參考論文:
[v1] Going Deeper with Convolutions, 6.67% test error
[v2] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, 4.8% test error
[v3] Rethinking the Inception Architecture for Computer Vision, 3.5% test error
[v4] Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning, 3.08% test error
在 Inception 出現以前,大部分流行 CNN 僅僅是把卷積層堆疊得愈來愈多,使網絡愈來愈深,以此但願可以獲得更好的性能。
這個就是GoogleNet,本文的主要工做,就是研究怎麼設計一種網絡,更加有效地利用計算資源。
文章認爲解決上述兩個缺點的根本方法是將全鏈接甚至通常的卷積都轉化爲稀疏鏈接。一方面現實生物神經系統的鏈接也是稀疏的,另外一方面有文獻代表:對於大規模稀疏的神經網絡,能夠經過分析激活值的統計特性和對高度相關的輸出進行聚類來逐層構建出一個最優網絡。這點代表臃腫的稀疏網絡可能被不失性能地簡化。
早些的時候,爲了打破網絡對稱性和提升學習能力,傳統的網絡都使用了隨機稀疏鏈接。可是,計算機軟硬件對非均勻稀疏數據的計算效率不好,因此在AlexNet中又從新啓用了全鏈接層,目的是爲了更好地優化並行運算。
因此,如今的問題是有沒有一種方法,既能保持網絡結構的稀疏性,又能利用密集矩陣的高計算性能。大量的文獻代表能夠將稀疏矩陣聚類爲較爲密集的子矩陣來提升計算性能,據此論文提出了名爲Inception 的結構來實現此目的。
inception module
主要就是把稀疏結構近似成幾個密集的子矩陣,從而在減小參數的同時,更加有效地利用計算資源。
可是,這種naive的inception 並不實用,由於不一樣的feature map拼到一塊兒以後傳遞到下一層inception 的5*5卷積層,計算量仍然是很是巨大的,爲了下降算力成本,做者在 3x3 和 5x5 卷積層以前添加額外的1*1的卷積層(bottleneck)作降維操做,下面是改進以後的inception。注意,1x1 卷積是在最大池化層以後。
降維Inception模塊
此時這一個Inception module的計算量爲358M ops,相比以前的854M ops,使用「bottleneck」的Inception module的計算量下降了一半多!
到這裏,Inception module的結構就介紹完了,而GoogLeNet的架構就是多個Inception module一層一層地stack(堆疊)出來的,下面是GoogLeNet的總體架構的介紹。
注:淺藍色部分Stem Network是一些初始卷積,深藍色部分有三個輔助分類器,爲何要用三個classifier呢?結合GoogLeNet的論文,我我的認爲有如下幾點緣由:
NIN有兩個特性,是它對CNN的貢獻:
普通的卷積能夠看作輸入feature map 和kernel 矩陣相乘的過程,是一個線性變換。MLP是指多層感知機,因爲是多層的,f(x) = w*g(x)+b, g(x) = w*x +b,輸出f和輸入x天然是非線性關係,mlpconv的意思就是用mlp代替普通卷積,能夠增長網絡的抽象表達能力。
因此,基於如上,能夠認爲,在抽特徵的時候直接作了非線性變換,能夠有效的對圖像特徵進行更好的抽象。
從而,Linear convolution layer就變成了Mlpconv layer。
值得一提的是,Mlpconv至關於在激活函數後面,再添加一個1×1的卷積層。
固然,1*1卷積層在本文中的最重要的做用仍是進行降維。
Global Average Pooling的作法是將全鏈接層去掉。
全鏈接層的存在有兩個缺點:
全鏈接層是傳統的神經網絡形式,使用了全鏈接層覺得着卷積層只是做爲特徵提取器來提取圖像的特徵,而全鏈接層是不可解釋的,從而CNN也不可解釋了
全鏈接層中的參數每每佔據CNN整個網絡參數的一大部分,從而使用全鏈接層容易致使過擬合。
而Global Average Pooling則是在最後一層,將卷積層設爲與類別數目一致,而後全局pooling,從而輸出類別個數個結果。
可是本文中,在average pooling 後面還跟了一個linear layer,加這個層主要是爲了方便起見,可以更容易擴展到其餘的數據集上。
作後的結構如圖所示:
網絡在訓練的時候還加了兩個額外的分類器,目的是爲了防止梯度消失,最後測試的時候能夠把這兩個分類器去掉。
最後的參數相比於alexnet少了12倍,相比於vgg-16來講少了3倍。
Inception v2 和 Inception v3 來自同一篇論文《Rethinking the Inception Architecture for Computer Vision》,做者提出了一系列能增長準確度和減小計算複雜度的修正方法。
問題:
解決方案:
主要貢獻:提出了batch normalization,主要在於加快訓練速度。數據歸一化方法很簡單,就是要讓數據具備0均值和1方差
網絡訓練的過程參數不斷的改變致使後續每一層輸入的的分佈也發生改變,而學習的過程又要使每一層適應輸入的分佈,所以咱們不得不下降學習率、當心地初始化。做者將分佈發生變化稱之爲internal covariate shift。
關於BN層,這一篇博客講得很好,http://blog.csdn.net/app_12062011/article/details/57083447我在這裏轉一下。
可是做者又說若是簡單的這麼幹,會下降層的表達能力。好比下圖,在使用sigmoid激活函數的時候,若是把數據限制到0均值單位方差,那麼至關於只使用了激活函數中近似線性的部分,這顯然會下降模型表達能力。爲此,做者又爲BN增長了2個參數,
用來保持模型的表達能力把BN放在激活函數以前,這是由於Wx+b具備更加一致和非稀疏的分佈。
此處若是 n=3,則與上一張圖像一致。最左側的 5x5 卷積可被表示爲兩個 3x3 卷積,它們又能夠被表示爲 1x3 和 3x1 卷積。
本文的主要目的是研究如何在增長網絡規模的同時,可以保證計算的高效率。
Rethinking這篇論文中提出了一些CNN調參的經驗型規則,暫列以下:
更小的卷積核
Inception Net v3 整合了前面 Inception v2 中提到的全部升級,還使用了:
RMSProp 優化器;
Factorized 7x7 卷積;
輔助分類器使用了 BatchNorm;
標籤平滑(添加到損失公式的一種正則化項,旨在阻止網絡對某一類別過度自信,即阻止過擬合)。
簡而言之,就是將尺寸比較大的卷積,變成一系列3×3的卷積的疊加,這樣既具備相同的視野,還具備更少的參數。
實驗代表,這樣作不會致使性能的損失。
Grid就是圖像在某一層的激活值,即feature_map,通常狀況下,若是想讓圖像縮小,能夠有以下兩種方式:
右圖是正常的縮小,但計算量很大。左圖先pooling會致使特徵表徵遇到瓶頸,違反上面所說的第一個規則,爲了同時達到不違反規則且下降計算量的做用,將網絡改成下圖:
結構如左圖表示,左邊兩個表明的是右圖中的左邊分支。
除了上述的模型結構的改進之外,Rethinking那篇論文還改進了目標函數。
原來的目標函數,在單類狀況下,若是某一類機率接近1,其餘的機率接近0,那麼會致使交叉熵取log後變得很大很大。從而致使兩個問題:
過擬合
致使樣本屬於某個類別的機率很是的大,模型太過於自信本身的判斷。
因此,使用了一種平滑方法,可使得類別機率之間的差異沒有那麼大.
解決深度網絡的退化問題,常規的網絡的堆疊(plain network)在網絡很深的時候,效果卻愈來愈差了。其中的緣由之一便是網絡越深,梯度消失的現象就愈來愈明顯,網絡的訓練效果也不會很好。
可是如今淺層的網絡(shallower network)又沒法明顯提高網絡的識別效果了,因此如今要解決的問題就是怎樣在加深網絡的狀況下又解決梯度消失的問題。
做者提出了Residual的結構:
即增長一個identity mapping(恆等映射),將原始所須要學的函數H(x)轉換成F(x)+x,而做者認爲這兩種表達的效果相同,可是優化的難度卻並不相同,做者假設F(x)的優化 會比H(x)簡單的多。這一想法也是源於圖像處理中的殘差向量編碼,經過一個reformulation,將一個問題分解成多個尺度直接的殘差問題,可以很好的起到優化訓練的效果。
這個Residual block經過shortcut connection實現,經過shortcut將這個block的輸入和輸出進行一個element-wise的加疊,這個簡單的加法並不會給網絡增長額外的參數和計算量,同時卻能夠大大增長模型的訓練速度、提升訓練效果,而且當模型的層數加深時,這個簡單的結構可以很好的解決退化問題。
接下來,做者就設計實驗來證實本身的觀點。
首先構建了一個18層和一個34層的plain網絡,即將全部層進行簡單的鋪疊,而後構建了一個18層和一個34層的residual網絡,僅僅是在plain上插入了shortcut,並且這兩個網絡的參數量、計算量相同,而且和以前有很好效果的VGG-19相比,計算量要小不少。這也是做者反覆強調的地方,也是這個模型最大的優點所在。
模型構建好後進行實驗,在plain上觀測到明顯的退化現象,並且ResNet上不只沒有退化,34層網絡的效果反而比18層的更好,並且不只如此,ResNet的收斂速度比plain的要快得多。
對於shortcut的方式,做者提出了三個選項:
對這三個選項都進行了實驗,發現雖然3的效果好於2的效果好於1的效果,可是差距很小,所以線性投影並非必需的,而使用0填充時,能夠保證模型的複雜度最低,這對於更深的網絡是更加有利的。另外,shortcut過程當中,stride是2能夠保證feature map的大小一致。
進一步實驗,做者又提出了deeper的residual block:
這至關於對於相同數量的層又減小了參數量,所以能夠拓展成更深的模型。因而做者提出了50、10一、152層的ResNet,並且不只沒有出現退化問題,錯誤率也大大下降,同時計算複雜度也保持在很低的程度。
這個時候ResNet的錯誤率已經把其餘網絡落下幾條街了,可是彷佛還並不知足,因而又搭建了更加變態的1202層的網絡,對於這麼深的網絡,優化依然並不困難,可是出現了過擬合的問題,而且也很容易出現梯度消失或者梯度爆炸問題,這是很正常的,做者也說了之後會對這個1202層的模型進行進一步的改進。
Inception v4 和 Inception -ResNet 在同一篇論文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》中介紹。爲清晰起見,咱們分紅兩個部分來介紹。
受 ResNet 的優越性能啓發,研究者提出了一種混合 inception 模塊。Inception ResNet 有兩個子版本:v1 和 v2。在咱們分析其顯著特徵以前,先看看這兩個子版本之間的微小差別。
Inception-ResNet v1 的計算成本和 Inception v3 的接近
Inception-ResNetv2 的計算成本和 Inception v4 的接近
它們有不一樣的 stem,正如 Inception v4 部分所展現的
兩個子版本都有相同的模塊 A、B、C 和縮減塊結構。惟一的不一樣在於超參數設置。在這一部分,咱們將聚焦於結構,並參考論文中的相同超參數設置(圖像是關於 Inception-ResNet v1 的)
問題:引入殘差鏈接,它將 inception 模塊的卷積運算輸出添加到輸入上。
方法:爲了使殘差加運算可行,卷積以後的輸入和輸出必須有相同的維度。所以,咱們在初始卷積以後使用 1x1 卷積來匹配深度(深度在卷積以後會增長)。
Inception ResNet 中的 Inception 模塊 A、B、C。注意池化層被殘差鏈接所替代,並在殘差加運算以前有額外的 1x1 卷積。
主要 inception 模塊的池化運算由殘差鏈接替代。然而,你仍然能夠在縮減塊中找到這些運算。縮減塊 A 和 Inception v4 中的縮減塊相同。
(左起)縮減塊 A(從 35x35 到 17x17 的尺寸縮減)和縮減塊 B(從 17x17 到 8x8 的尺寸縮減)。這裏參考了論文中的相同超參數設置(V,I,K)。(圖源:https://arxiv.org/pdf/1602.07261.pdf)
若是卷積核的數量超過 1000,則網絡架構更深層的殘差單元將致使網絡崩潰。所以,爲了增長穩定性,做者經過 0.1 到 0.3 的比例縮放殘差激活值。
激活值經過一個常數進行比例縮放,以防止網絡崩潰。
原始論文並無在求和以後使用批歸一化,以在單個 GPU 上訓練模型(在單個 GPU 上擬合整個模型)。
研究發現 Inception-ResNet 模型能夠在更少的 epoch 內達到更高的準確率。
Inception v4 和 Inception-ResNet 的網絡完整架構以下圖所示:
這篇論文裏,做者借鑑了resnet的殘差網絡的思想,將其應用到了inception-v3當中,結構以下:
論文:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
問題:某些模塊有沒必要要的複雜性。咱們應該添加更多一致的模塊來提升性能。
方法:Inception v4 的 stem 被修改了。這裏的 stem 參考了在引入 Inception 塊以前執行的初始運算集。
圖上部是 Inception-ResNet v1 的 stem。圖下部是 Inception v4 和 Inception-ResNet v2 的 stem
它們有三個主要的 Inception 模塊,稱爲 A、B 和 C(和 Inception v2 不一樣,這些模塊確實被命名爲 A、B 和 C)。它們看起來和 Inception v2(或 v3)變體很是類似。
Inception v4 引入了專用的「縮減塊」(reduction block),它被用於改變網格的寬度和高度。早期的版本並無明確使用縮減塊,但也實現了其功能。
縮減塊 A(從 35x35 到 17x17 的尺寸縮減)和縮減塊 B(從 17x17 到 8x8 的尺寸縮減)。這裏參考了論文中的相同超參數設置(V,I,k)。
inception-v4 是經過提出了更多新的inception module擴展網絡結構,可以達到和inception-resnet-v2相媲美的效果,這個有時間再研究一下。
網絡的性能分析圖
Xception 是 Google 繼 Inception 後提出的對 Inception-v3 的另外一種改進。
做者認爲,通道之間的相關性 與 空間相關性 最好要分開處理。採用 Separable Convolution(極致的 Inception 模塊)來替換原來 Inception-v3中的卷積操做。
在 Inception 中,特徵能夠經過 1×1卷積,3×3卷積,5×5 卷積,pooling 等進行提取,Inception 結構將特徵類型的選擇留給網絡本身訓練,也就是將一個輸入同時輸給幾種提取特徵方式,而後作 concat 。Inception-v3的結構圖以下:
對 Inception-v3 進行簡化,去除 Inception-v3 中的 avg pool 後,輸入的下一步操做就都是 1×1卷積:
提取 1×11×11×1 卷積的公共部分:
Xception(極致的 Inception):先進行普通卷積操做,再對 1×11×11×1 卷積後的每一個channel分別進行 3×33×33×3 卷積操做,最後將結果 concat:
傳統的卷積實現過程---->Depthwise Separable Convolution 的實現過程:
--->
Depthwise Separable Convolution 與 極致的 Inception 區別:
極致的 Inception:
第一步:普通 1×11×11×1 卷積。
第二步:對 1×11×11×1 卷積結果的每一個 channel,分別進行 3×33×33×3 卷積操做,並將結果 concat。
Depthwise Separable Convolution:
第一步:Depthwise 卷積,對輸入的每一個channel,分別進行 3×33×33×3 卷積操做,並將結果 concat。
第二步:Pointwise 卷積,對 Depthwise 卷積中的 concat 結果,進行 1×11×11×1 卷積操做。
兩種操做的循序不一致:Inception 先進行 1×11×11×1 卷積,再進行 3×33×33×3 卷積;Depthwise Separable Convolution 先進行 3×33×33×3 卷積,再進行 1×11×11×1 卷積。(做者認爲這個差別並無大的影響)
做者發現,在「極致的 Inception」模塊中,用於學習空間相關性的 3×33×33×3 的卷積,和用於學習通道間相關性的 1×11×11×1 卷積之間,不使用非線性激活函數時,收斂過程更快、準確率更高:
如今咱們有三種方式來處理不一樣卷積層之間的特徵圖:
標準鏈接
Residual/Skip 鏈接
DenseNet:密集鏈接性
DenseNet的思想是某一層的輸入是其前面每一層的輸出,即將不一樣層獲得的特徵圖進行融合做爲某一層的輸入,這樣CNN的每一層就能夠獲得前面不一樣層提取的特徵(淺層位置等基礎信息,深層語義信息),這樣網絡的表達能力會更好。圖示以下:
若是僅僅如以前那麼設計的話,很容易出現梯度爆炸,因此:用以前提到的1∗11*11∗1卷積!bottleneck降維
下圖是Dense Blocks的結構圖,在每一個Dense Blocks內部,每層的feature map的大小是一致的(方便特徵融合),不一樣Dense Blocks之間有Pooling層用於減少feature map的大小。
基礎框架:Lenet、Alexnet、VGG、Prelu
Inception系列(寬網絡):從Inception v1 到v4 以及Inception-Resnet系列
Resnet系列 (長網絡):從Resnet被提出後,許許多多該架構被相應提出,Desnet表現出其良好的優越性,殘差網絡使網絡可以更好的處理梯度消失問題。PreActResNet將bn和relu放在前面,獲得了很好的效果。還有Resnetx等,這裏很少介紹了。
輕型模型 (輕網絡):受限移動端的設備,主要思想是將卷積核分離,SqueezeNet 大量採用1x1的網絡。mobilenet將3x3的網絡分離爲n個3x3的卷積核和1x1的卷積核。Shufflenet系列考不一樣channel之間的關聯,提出group1x1,而後再進行混洗。
attention模型(重網絡):相似與文本的attention,主要針對不一樣channel的權重和每一個channel不一樣區域的權重。Residual Attention Network和Senet爲典型。
XreCis CSDN博客:https://blog.csdn.net/lly1122334/article/details/88717074
SENets-Residual Attention Networks