Cs231n課堂內容記錄-Lecture 9 深度學習模型
Lecture 9 CNN Architectures
參見:https://blog.csdn.net/qq_29176963/article/details/82882080#GoogleNet_83
一、 LeNet-5:
神經網絡的第一個實例,用於識別郵票上的手寫數字,使用步長為1,大小為5*5的卷積核,對第一層進行操作,然後進行池化,通過幾層卷積和池化,在網絡的最後還有一些全連接層。LeNet在數據識別領域取得了成功。
二、 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
[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中訓練。
三、 ZFNet:
ZFNet是2013年ImageNet獲勝的模型,在超參數上對AlexNet進行了改進。
ZFNet網絡特點
ZFNet框架大體與AlexNet一致。它們具有相同的層數,基本結構;在步長上有一點改進,卷積核數量上也略有不同。
四、 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提出後就不需要這種操作了);
五、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*2、Softmax分類的結構(相當於我們提前進行了分類輸出),可以對前面幾個層進行更多的梯度訓練。當網絡深度很深的時候,一些梯度信號會最小化並且丟失了前面幾層的梯度信號,該方法能在一定程度上解決梯度消失的問題。
五、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”來加速計算(如下圖所示)。
六、擴展知識:
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專指不帶殘差功能的卷積神經網絡。
Cs231n課堂內容記錄-Lecture 9 深度學習模型