Lecture 9 CNN Architectures網絡
參見:https://blog.csdn.net/qq_29176963/article/details/82882080#GoogleNet_83app
1、 LeNet-5:框架
神經網絡的第一個實例,用於識別郵票上的手寫數字,使用步長爲1,大小爲5*5的卷積核,對第一層進行操做,而後進行池化,經過幾層卷積和池化,在網絡的最後還有一些全鏈接層。LeNet在數據識別領域取得了成功。ide
2、 AlexNet:函數
Alexnet是2012年ImageNet中勝出的模型,將錯誤率從25.8%下降至16.4%。性能
1.網絡結構:學習
[227x227x3] INPUT測試
[55x55x96] CONV1: 96 11x11 filters at stride 4, pad 0優化
[27x27x96] MAX POOL1: 3x3 filters at stride 2.net
[27x27x96] NORM1: Normalization layer
[27x27x256] CONV2: 256 5x5 filters at stride 1, pad 2
[13x13x256] MAX POOL2: 3x3 filters at stride 2
[13x13x256] NORM2: Normalization layer
[13x13x384] CONV3: 384 3x3 filters at stride 1, pad 1
[13x13x384] CONV4: 384 3x3 filters at stride 1, pad 1
[13x13x256] CONV5: 256 3x3 filters at stride 1, pad 1
[6x6x256] MAX POOL3: 3x3 filters at stride 2
[4096] FC6: 4096 neurons
[4096] FC7: 4096 neurons
[1000] FC8: 1000 neurons (class scores)
FC8與softmax層相連,進行1000個類別的ImageNet的圖像分類。
2.關於第一層形狀和參數數量的計算(number of parameters)
output_size = (input_size-filter_size)/stride +1
parameters_num = filter_size*filter_number
比較有趣的是,池化層參數數量爲零。由於它只對參數作了較少操做,只是觀察卷積層已有的參數,而後取了最大值。
3.AlexNet網絡特色
First use of ReLU;
Used Norm layers (not common anymore);
Heavy data augmentation;
Dropout 0.5;
Batch size 128;
SGD Momentum 0.9;
Learning rate 1e-2, reduced by 10 manually when val accuracy plateaus;
L2 weight decay 5e-4(正則化的權重衰減);
7 CNN ensemble: 18.2% -> 15.4%(模型集成,取平均)。
因爲當時所使用GPU的顯存不夠存放這麼多參數,所以從第一個卷積層開始將參數分爲兩組,在兩個GPU中訓練。
3、 ZFNet:
ZFNet是2013年ImageNet獲勝的模型,在超參數上對AlexNet進行了改進。
ZFNet網絡特色
ZFNet框架大致與AlexNet一致。它們具備相同的層數,基本結構;在步長上有一點改進,卷積核數量上也略有不一樣。
4、 VGGNet
VGGNet和GoogleNet是14年勝出的模型,它們與以前的網絡最大的不一樣之處在於擁有了更深層的網絡,分別是19層、22層。GoogleNet與VGGNet很相近,其實是VGGNet的一個本地化的改進,二者的魯棒性都很好。
VGG16網絡詳細信息:
INPUT: [224x224x3] memory: 224x224x3=150K params: 0
CONV3-64: [224x224x64] memory: 224x224x64=3.2M params: (3x3x3)x64 = 1,728
CONV3-64: [224x224x64] memory: 224x224x64=3.2M params: (3x3x64)x64 = 36,864
POOL2: [112x112x64] memory: 112x112x64=800K params: 0
CONV3-128: [112x112x128] memory: 112x112x128=1.6M params: (3x3x64)x128 = 73,728
CONV3-128: [112x112x128] memory: 112x112x128=1.6M params: (3x3x128)x128 = 147,456
POOL2: [56x56x128] memory: 56x56x128=400K params: 0
CONV3-256: [56x56x256] memory: 56x56x256=800K params: (3x3x128)x256 = 294,912
CONV3-256: [56x56x256] memory: 56x56x256=800K params: (3x3x256)x256 = 589,824
CONV3-256: [56x56x256] memory: 56x56x256=800K params: (3x3x256)x256 = 589,824
POOL2: [28x28x256] memory: 28x28x256=200K params: 0
CONV3-512: [28x28x512] memory: 28x28x512=400K params: (3x3x256)x512 = 1,179,648
CONV3-512: [28x28x512] memory: 28x28x512=400K params: (3x3x512)x512 = 2,359,296
CONV3-512: [28x28x512] memory: 28x28x512=400K params: (3x3x512)x512 = 2,359,296
POOL2: [14x14x512] memory: 14x14x512=100K params: 0
CONV3-512: [14x14x512] memory: 14x14x512=100K params: (3x3x512)x512 = 2,359,296
CONV3-512: [14x14x512] memory: 14x14x512=100K params: (3x3x512)x512 = 2,359,296
CONV3-512: [14x14x512] memory: 14x14x512=100K params: (3x3x512)x512 = 2,359,296
POOL2: [7x7x512] memory: 7x7x512=25K params: 0
FC: [1x1x4096] memory: 4096 params: 7x7x512x4096 = 102,760,448
FC: [1x1x4096] memory: 4096 params: 4096x4096 = 16,777,216
FC: [1x1x1000] memory: 1000 params: 4096x1000 = 4,096,000
TOTAL memory: 24M * 4 bytes ~= 96MB/image (only forward) (每一個數字佔用四字節內存)
TOTAL params : 138M parameters。
前向傳播佔用的總內存約爲每張圖像96MB,算入反向傳播的話加倍便可。
VGGNet網絡特色:
更小的filters,更深的網絡;
Only 3x3 CONV stride 1, pad 1 and 2x2 MAX POOL stride 2;
這種卷積核已是最小的卷積核了,網絡只關注相鄰的像素。整個網絡保持這種小卷積核的結構、並進行下采樣,簡潔而優雅,得到了ImageNet最好的7.3的錯誤率。
爲何使用小的卷積核?當使用小卷積核時,3個3x3的卷積層和1個7x7的卷積層擁有一樣有效的感覺野,可是小卷積核可讓咱們嘗試更深層的網絡和更多的卷積核,更非線性化,最終的效果比大卷積核的效果要好,且其參數數量更少,3x(3x3)<7x7。
倒數第二層FC(FC7,1000個,即類別層以前)的hidden number=4096被驗證已經可以很好地進行特徵表達,能夠用於在其餘數據中提取特徵,並有比較好的泛化性能;
做者先訓練了一個11層的網絡,使其收斂,以後將其擴展到16/19層,以此來解決深層網絡收斂困難的問題(Batch Normalization提出後就不須要這種操做了);
5、GoogleNet:
1.GoogleNet網絡特色:
l 22層網絡;
l 沒有FC層,所以節省了大量參數,僅有5million,比AlexNet少了12倍;
l 爲提升計算效率引入了「inception」 module和「bottleneck」的概念;
l 網絡有兩個輔助輸出(Auxiliary classification outputs)用於向低層的網絡注入額外的梯度,以此解決網絡收斂困難的問題(Batch Normalization提出後就不須要這種操做了);
2.「inception」 module
能夠將網絡當作是由局部網絡拓撲(「inception」 module)堆疊而成。對進入相同層的相同輸入並行應用不一樣類別的濾波操做。咱們未來自前面層的輸入進行不一樣的卷積操做、池化操做,從而獲得不一樣的輸出,最後須要將全部輸出在深度層面上鍊接到一塊兒。計算與串聯方式以下圖所示:
咱們經過inception操做在保持形狀不變的狀況下擴充了深度。爲何在通過不一樣的濾波器後咱們老是能獲得相同的尺寸?爲了讓輸出尺寸和輸入尺寸保持一致,咱們使用的方法是零填充(zero padding)。另外,輸入中的256是上一層中輸入的深度。
池化層在這個問題中也參與了運算,它保留了模型的深度,所以在每一層深度只能增長。
另外經過計算咱們能夠發現,卷積層的參數數量或者操做數量達到了854M,計算量極大。
3.「blottleneck」(瓶頸層):
使用 「inception」 module 後隨之而來的問題就是:
l 單層的參數就達到854M個,計算量極大;
l 且數據通過每個 「inception」 module 後深度都會增長(光池化層獲得輸出數據的尺寸就已經與原數據相同)。
爲解決上述問題,構建了稱之爲「bottleneck」的1x1卷積層以減小特徵深度(以下圖所示):
改進後的「inception」 module以下圖所示:
Bottleneck的目的是在卷積運算以前下降特徵圖的維度。咱們運用以前提到過的1*1卷積核,它可以保持形狀不變,減少深度,從而下降特徵圖的維度。
對於Bottleneck減少運算量的具體計算:對於相同的輸入大小28*28*256,咱們將計算量減小到了358M。
用1*1卷積核是否會致使一些信息丟失?結果可能會有一些信息丟失,但這樣的效果更好,對於處理計算複雜性這一點來講。
4.Full GoogleNet Architecture:
Stem Network更像咱們以前見過的正常的CNN結構。
咱們將初始模塊堆疊在一塊兒
在堆棧的頂部有分類輸出。全鏈接層已經被移除,沒有FC工做效果依然很好,還節省了不少參數。
5.Auxiliary classification outputs:
GoogleNet同時擁有兩個輔助輸出,它們是使用Softmax函數的一個帶有平均池化的小網絡,具備平均池化、1*1卷積、FC*二、Softmax分類的結構(至關於咱們提早進行了分類輸出),能夠對前面幾個層進行更多的梯度訓練。當網絡深度很深的時候,一些梯度信號會最小化而且丟失了前面幾層的梯度信號,該方法能在必定程度上解決梯度消失的問題。
5、ResNet:
1.ResNet網絡特色:
l 152層;
l 利用殘差層實現優化;
l 網絡由殘差盒堆疊而成(每個殘差盒包含兩個3x3 CONV);
l 若是將殘差盒中的全部權重置零,那麼殘差盒的輸出與輸入就是相等的,所以,在某種層度上,這個模型是相對容易去訓練的,並不須要添加額外的層;
l 神經網絡中添加L2正則化的做用是迫使網絡中的全部參數趨近於0,其餘網絡結構(如CONV)參數趨於0不太說得通。但在殘差網絡中,若是全部參數趨於0,那就是促使模型再也不使用他不須要的層,由於它只趨使殘差盒趨向同一性,也就不須要進行分類;
l 殘差鏈接在反向傳播時,爲梯度提供了一個超級「高速通道」(梯度通過殘差盒的加法門分流而後彙總),這使得網絡訓練更加容易(DenseNet和FractalNet也有相似的梯度直傳式的鏈接);
l 週期性的,會使用兩倍數量的filters,用stride 2 CONV進行下采樣(全部維度/2);
l 網絡起始處有一個額外的CONV;
l 沒有額外的FC;
l 只有一個全局的AVE POOL;
l 每個CONV後都帶有一個BN;
l 用一個額外的帶尺度因子的Xavier/2去初始化;
l 初始學習率爲0.1,當Validation error停滯時,將其縮小十倍;
l Mini-batch size = 256;
l Weight decay = 1e-5.
2.殘差盒(Residual block):
當咱們在普通卷積神經網絡[1]上堆疊愈來愈多的層時到底會發生什麼?咱們以VGG或者其餘的通常網絡爲例,咱們能僅僅經過擴展更多的層來獲得更好的效果嗎?答案是不能。
由上圖實驗結果可知,56層網絡的訓練偏差和測試偏差都高於20層的網絡。按理說。56層的NN擁有不少參數和更深的層數,應該會更早地達到過擬合,從而擁有更低的訓練偏差和更高的測試偏差。可是實驗代表56層的NN的訓練偏差比20層的NN更高了。
ResNet的做者假設:這是一個優化問題,層深的模型更難優化。因而,做者提出了殘差網絡的概念,其與常規網絡的區別以下圖所示:
Residual block使這些網絡層擬合的是殘差映射H(x)-x而不是直接映射H(x)。某種意義上能夠當作是一種對輸入的修正。以前咱們學習的是H(x),如今咱們把最終的表達分解爲F(x)+x,從而只需學習F(x),F(x)就是咱們所說的殘差。一般來講,網絡的層與層之間實際上相差不大的,一個恆等映射(x到x自己)加上很小的∆x(若恆等映射是最好的,只需將∆x置零)的學習過程更容易實現。
與GoogleNet相似,若是網絡層數較多的話,ResNet的殘差盒可使用「bottleneck」來加速計算(以下圖所示)。
6、擴展知識:
1.Network in Network(NiN):
每一個卷積層中都有一個徹底鏈接的MLP(micronetwork),以計算局部圖像塊的更多抽象特徵。這個模型是GoogleNet和ResNet模型「bottleneck」的靈感來源。
2.Identity Mappings in Deep Residual Networks:
在ResNet的基礎上進行修改,新的結構可以實現一種更直接的路徑用於在整個網絡中傳播信息(將激活層移動到殘差映射路徑中)。
3.Wide Residual Networks:
做者認爲殘差量是一個十分重要的因素而不是深度。使用了更寬的殘差模塊(FxK filters而不是F filters in each layer),寬網絡的另外一個優勢是便於使用並行計算。本文旨在比較網絡的寬度、深度和殘差鏈接所作出的貢獻。
4.ResNeXt:
經過多條平行路徑增長殘差盒寬度,這些分支總和被稱爲「cardinality」,思想相似於「inception」module。
5.Deep Networks with Stochastic Depth:
動機是在訓練過程當中經過短網絡減小消失梯度和訓練時間。該思想相似於Dropout,只不過這裏是沿網絡深度方向的dropout。方法是在每次訓練中隨機drop某層子集(即ResNet中∆x=0,該層爲恆等映射),在測試時使用完整的訓練好的網絡。
6.FractalNet:
做者認爲引入殘差可能不是必須的,關鍵在於有效地從淺層網絡轉型爲深層網絡。所以他使用了上圖所示這種分型結構,各層都以分形的形式存在,所以同時存在淺層和深層路徑到大輸出值。他們經過拋棄子路徑的方式訓練,相似於dropout,測試時使用整個分形網絡。
7.DenseNet:
密集鏈接卷積神經網絡。每一個Dense block中每層都與其後的全部層之前饋的形式鏈接,所以在這個Dense block內,你對其的輸入也是對全部其餘各層的輸入,你會計算每個卷積輸出,這些輸出與其後的全部層鏈接,全部這些值集中起來,共同做爲卷積層的輸入。這一方法能緩解梯度消失的問題,增強特徵圖的傳遞,鼓勵特徵的再利用。
8.SqueezeNet:
關注於構建高效網絡,壓縮網絡的大小。由一個個fire模塊組成,每一個fire模塊都含有一個squeeze層,其由許多1x1的filters組成。接着,它再傳遞給一個擴大層含有一些1x1和3x3的filters。參數只有AlexNet的1/50,性能類似。