Cs231n課堂內容記錄-Lecture 9 深度學習模型

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,性能類似。



[1] plain convolutional neural network專指不帶殘差功能的卷積神經網絡。

相關文章
相關標籤/搜索