LeNet
CNN的開山之作,是LeCun在98年解決手寫是數字識别任務時提出的,從那時起CNN的基本架構就定下來了:卷積、池化、全連接配接層。
網絡結構

- 如圖 3.1 所示,最早的 LeNet 有 7 層網絡,包括 3 個卷積層, 2 個池化層,2 個全連接配接層,其中輸入圖像的尺寸是 32x32。
- C1 層為卷積層,有 6 個 5*5 的卷積核,原始圖像送入卷積層,是以生成了6 個(32-5+1) x(32-5+1) =28x28 的 feature map, 這一層需要訓練的參數為(5x5+1) x 6 =26 x 5 = 156 個參數,其中 5x5 是卷積核尺寸, 1 是偏置參數, 是以對應 6個 28x28 feature map,連接配接數為 6x26x28x28=122304;
- S2 層為池化層,所用到的是 2x2 最大池化來進行降維,得到 6 個 14x14 的feature map, 池化的過程是通過将每四個輸入相加乘以一個系數再加上一個偏置參數,是以 S2 層所需要訓練的參數為 2x6=12 個,連接配接數為(4+1)x6x14x14=5880;之後通過 Sigmoid 函數激活,送入下一層;
-
C3 層是卷積層,有 16 個卷積核,每一個卷積模闆是 5x5,每一個模闆有 6個通道,但是這一層并不是全連接配接,而是與輸入層部分連接配接,以 feature map0為例,用到的是 3 通道的 5x5 卷積核分别與上一層的 feature map 0,1,2 連接配接,得到的新的 feature map 大小為(14-5+1) x(14-5+1) =10x10,是以輸出為 16個 10x10 的 feature map, 所需要訓練的參數為(25x3+1) x6+(25x4+1) x9+
(25x6+1) =1516 個參數;連接配接數為 1516x10x10=151600;
- S4 層為池化層,與 S2 層相同, 2x2 最大池化,得到了 16 個 5x5 的 feature map, 送入 Sigmoid 激活函數送入下一層;需要的參數是 2x16=32,連接配接數為(4+1) x16x5x5=2000;
- C5 層為卷積層,有 120 個卷積核,每一個卷積模闆是 5x5,每一個模闆有16 個通道,得到 120 個 1x1 feature map(相當于全連接配接); 訓練參數為 120x(5x5x16+1)=48120,連接配接數為 48120;
- F6 層為全連接配接層,有 84 個神經元,與上一層 120 個 1x1feature map 全連接配接,得到 84 維特征向量;連接配接數為 120x84=10080;最後利用 84 維特征向量進行分類預測;
- O7 層為輸出層, 每一個類有一個RBF(Euclidean Radial Basis)功能單元,即徑向歐式距離函數。每個單元有 84 個輸入,輸出 yi 按照如下公式計算 也就是計算輸入向量與參數向量之間的歐式距離。
CNN經典網絡:LeNet、AlexNet、NIN、VGGLeNetAlexNetNINVGG參考部落格
AlexNet
2012 年 ImageNet Challenge 大賽上橫空出世的 AlexNet 重新整理了 Image Classificationde 記錄,也正式引領了深度學習的熱潮。
論文:http://202.119.24.249/cache/9/03/papers.nips.cc/40659828b5f8741d01b4efeb826c7f06/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
特點
- 提出用 ReLU 代替 Sigmoid 激活函數,因為 ReLU 是一種不飽和的非線性函數,具有更快的收斂速度,可以加速拟合訓練集;相對于 Sigmoid 函數,隻需要一個門檻值就可以得到激活值,而不用複雜的運算;
- 提出 GPU 訓練,甚至多個 GPU 并行運算,加速了訓練速度而且解決了單個 GPU 記憶體不足的問題;
- 提出資料增強的概念,對于原始圖檔經過随機裁剪、平移旋轉等操作,增加訓練樣本;
- 提出 Dropout 的概念,對每個隐層神經元的輸出有 0.5 的機率置 0,置 0的神經元不會參加前向傳播核反向更新,進而防止過拟合,代價是訓練疊代的次數增加一倍。
網絡結構
如圖 3.3 所示, AlexNet 采用的是兩台 GPU 伺服器,分為上下兩組,該模型一共分為八層,五個卷積層以及三個全連接配接層,在每一個卷積層中包含了激勵函數 ReLU 以及局部響應歸一(LRN)處理,然後在經過降采樣(pool 處理)。
- 第一層 conv1 卷積層,輸入的原始圖像是 227x227x3 的 3 通道 RGB 圖像,原始圖像被 96 個 11x11x3 的卷積核進行卷積運算,卷積過程的步長為 4,是以生成了[(227-11) /4+1]x[(227-11)/4+1]=55x55 尺寸的 feature map, 共有 96個,分為 2 組每組 48 個 55x55 特征映射,經過 relu 單元激活生成仍是 2 組55x55x48 特征映射;再經由 Max pooling 池化運算尺度為 3x3,步長為 2,是以池化後的尺寸為[(55-3) /2+1]x[(55-3) /2+1]=27x27,分在 2 個 GPU 上,每組為 27x27x48 feature map;
- 第二層 conv2 卷積層,輸入資料為前一層的27x27x96,為了後續處理,每幅特征映射左右上下各填充 2 個像素,每組被 48 通道的 5x5 卷積模闆進行卷積運算,第二層共有 256 個卷積核,卷積後得到[(27-5+2x2) /1+1]x[(27-5+2x2) /1+1]=27x27; 共有 256 個 27x27 的 feature map, 分在 2 個 GPU,每組各 128 個; 經由 relu 單元激活後送入 Max pooling, 依舊是步長為 2 的 3*3 池化尺度,得到[(27-3) /2+1]x[(27-3) /2+1]=13x13 的特征映射,分在 2 個 GPU,每組 128 個 13x13 的 feature map;
-
第三層 conv3 卷積層,輸入資料為前一層的 13x13x256,為了後續處理,每幅特征映射左右上下兩邊都要填充 1 個像素;每組被 256 通道的 3x3 卷積模闆,第三層共有 384 個卷積核,卷積後得到[(13-3+1x2) /1+1]x[(13-3+1x2)
/1+1]=13x13;共有 384 個 13x13 的 feature map, 分在 2 個 GPU,每組各 192個;經由 relu 單元送入第四層;
- 第四層 conv4 卷積層,輸入資料為前一層的 13x13x384,為了後續處理,每幅特征映射左右上下兩邊都要填充 1 個像素,每組被 192 通道的 3x3 卷積模闆,第四層共有 2 組 192 共 384 個卷積核,卷積運算後得到[(13-3+1x2)/1+1]x[(13-3+1x2) /1+1]=13x13;共有 384 個 13x13feature map, 分在 2 個GPU,每組各 192 個;經由 relu 單元送入第五層;
- 第五層 conv5 卷積層,輸入資料為前一層的 13x13x384,為了後續處理,每幅特征映射左右上下各填充 1 個像素, 每組被 192 通道 3x3 卷積模闆,第五層共有 256 個卷積核,卷積後得到[(13-3+1x2) /1+1] x[(13-3+1x2)/1+1]=13x13; 共有 256 個 13x13 的 feature map,分在 2 個 GPU,每組各 128個;經由 relu 單元送入池化,池化尺度為 3x3,步長為 2,池化得到尺寸(13-3) /2+1=6,得到了 2 組 6x6x128 個 feature map;
- 第六層 fc6 全連接配接層,輸入資料為 6x6x256,采用 6x6x256 尺寸濾波器進行卷積運算,每次卷積運算生成一個運算結果,通過一個神經元輸出,共有 4096個 6x6x256 尺寸的濾波器對輸入資料進行運算,通過 4096 個神經元輸出,經過relu 單元生成 4096 個值,并通過 drop 運算輸出 4096 個結果;
- 第七層 fc7 全連接配接層,第 6 層輸出 4096 個資料與第七層 4096 個神經元進行全連接配接,經由 relu 單元生成 4096 個資料,再經由 dropout7 處理後輸出 4096 個資料;
- 第八層 fc8 全連接配接層,第 7 層輸出的 4096 個資料與第八層 1000 個神經元進行全連接配接,經過訓練後輸出被訓練的數值。
NIN
NIN改進了傳統的CNN,采用了少量參數就取得了超過AlexNet的性能,AlexNet網絡參數大小是230M,NIN隻需要29M
論文:https://arxiv.org/pdf/1312.4400.pdf
網絡結構
如圖 所示,網絡總共四層,3mlpconv + 1global_average_pooling,主要創新在于 MLP 以及全局均勻池化部分,通過增強卷積子產品的方式加強了模型的分類能力。
傳統的卷積網絡用卷積提取特征,然後得到的特征再用FC+softmax邏輯回歸分類層進行分類。
使用全局平均池化層,每個特征圖作為一個輸出。這樣參數量大大減小,并且每一個特征圖相當于一個輸出特征(表示輸出類的特征)。
特點
- 提出了 MLP(多層感覺機,多層全連接配接層和非線性函數的組合) 對卷積層進行改進,傳統的卷積層隻是将前一層特征進行線性組合,然後進行非線性激活
,而在傳統卷積層之後增加一個微小的神經網絡[藍框部分]
對之前的特征進一步抽象,實作了對于同一個像素點的跨通道的組合,也就是可以等效為 1x1 的卷積核, 1x1 卷積核還可以用來降維,進而減少訓練的參數;[綠框部分]
以前的卷積層,局部感受野運算僅僅是是一個單層的神經網絡(線性濾波器對圖像進行内積運算,跟着一個非線性激活函數),mlpconv層可以看成局部感受野上進行conv運算之前,還進行mlp運算,而MLP網絡中,常見的使用三層的全連接配接結構,等效于普通卷積後,再添加一個1:1的卷積和Relu函數
優點:
- 提供了網絡層間映射的一種新可能;
- 增加了網絡卷積層的非線性能力。
- 提出了全局平均池化代替全連接配接層,除了能夠強化特征圖與類别的關系,最重要的是不需要訓練參數,可以避免過拟合,主要通過對于每一個特征圖求出平均數,然後再将平均數組成特征向量輸入 softmax 層中進行分類。
Global Average Pooling主要為了解決全連接配接層參數過多的問題,早期對于分類問題,最後一個卷積層的 Feature Map 通常與全連接配接層連接配接,最後通過 softmax 邏輯回歸分類。全連接配接層帶來的問題就是參數空間過大,容易過拟合。早期 Alex 采用了Dropout 的方法,來減輕過拟合,提高網絡的泛化能力,但依舊無法解決參數過多問題。
全連接配接層的存在有以下缺點:
- 全連接配接層是傳統的神經網絡形式,使用了全連接配接層是因為卷積層隻是作為特征提取器來提取圖像的特征,而全連接配接層是不可解釋的,進而CNN也不可解釋了。全連接配接層中的參數往往占據CNN整個網絡參數的一大部分,進而使用全連接配接層容易導緻過拟合。
Global Average Pooling的做法是将全連接配接層去掉,在最後一層,将卷積層設為與類别數目一緻,然後全局pooling,進而直接輸出各個類别結果。
使用全局平均 pooling 代替全連接配接層,使得最後一個多層感覺卷積層獲得的每一個特征圖能夠對應于一個輸出類别,優點如下:
- 全局平均池化更原生的支援于卷積結構,通過加強特征映射與相應分(種)類的對應關系,特征映射可以很容易解釋為分類映射
- 全局平均池化一層沒有需要優化的參數,減少大量的訓練參數有效避免過拟合
- 全局平均池化彙總(求和)空間資訊,是以其對空間變換是健壯的
VGG
VGGNet 在 AlexNet 的基礎上提出了加深網絡深度的方法來提高模型分類的能力,并一舉獲得了 ILSVRC 2014 的亞軍。(冠軍為GoogLeNet)
論文:https://arxiv.org/pdf/1409.1556.pdf
特點
- 加深了網絡的深度,由 AlexNet8 層加深到了 19 層,提高了模型的分類能力;
- 利用多個小卷積核來代替大卷積核;例如用 3 個 3x3 的卷積層,層與層之間有非線性激活函數,可以獲得 7x7 卷積層的感受野,但是對于 7x7 卷積核需要 7x7xcxc=49c^2 個參數,而對于 3 個 3x3 的卷積層組合,則隻需要 3x( 3x3) x c x c=27c^2 個參數;
那麼問題來了,2個3x3的卷積核可以替代一個5x5的卷積核嗎?
當然可以,我們舉一個最簡單的栗子:
假設我們卷積核的步長為1,padding為0,輸入的圖形高度為n,那麼我們用5x5的卷積核做一輪卷積運算,得到的圖形高度為((n−5+1)/1=n−4。現在我們用3x3的卷積核對這個相同的輸入進行卷積運算:1,第一次卷積得到的高度為((n−3+1)/1=n−2),現在我們對這個結果再進行一次卷積運算,卷積核依然為3x3,此時得到的卷積高度為:(n−2−3+1)/1=n−4) 顯然,兩次卷積結果是一樣的。
- 采用 Pre-trained 方法利用淺層網絡的訓練參數初始化深層網絡參數,加速收斂;
- 采用 Multi-Scale 方法進行資料增強,通過将圖像縮放到不同尺寸随機剪裁,獲得多個版本的資料,增加了很多資料量,防止過拟合;
網絡結構
- A: 8 個卷積層, 3 個全連接配接層,共計 11 層;
- B:在 A 的 stage2 和 stage3 分别增加一個 3x3 的卷積層, 10 個卷積層,總計 13 層;
- C:在 B 的基礎上, stage3, stage4, stage5 分别增加 1x1 的卷積層, 13 個卷積層,總計 16 層;
- D:在 C 的基礎上, stage3, stage4, stage5 分别增加 3x3 的卷積層, 13 個卷積層,總計 16 層;
- E:在 D 的基礎上, stage3, stage4, stage5 分别增加 3x3 的卷積層, 16 個卷積層,總計 19 層。\
- 第一層卷積
1,首先我們輸入一副圖檔,這個圖檔的像素尺寸是224x224,由于是彩色圖檔,有3個通道,是以實際輸入尺寸為224x224x3
2,我們引入卷積核,卷積核的大小為3x3,根據我們對卷積核的了解,由于輸入是一個3通道的張量,是以卷積核的深度也是3.是以卷積核的實際尺寸為3x3x3
3,根據圖例,我們的第一層卷積為224x224x64,這個大小是如何得到的?
根據問題2,我們知道我們引入的卷積核尺寸為3x3,根據上面的表,我們知道步長為1,此時卷積後得到的張量次元應該為(224-3+1)/1=222,是以不難推測,我們對原始輸入模型增加了padding:(224-3+1+2)/1=224. 我們知道,通過3x3x3的卷積核對原始輸入進行卷積後得到的張量深度為1,是以,我們采用了64個這樣的卷積核,最後得到了深度為64的張量。
4,我們引入2x2的最大池化層,縮小數組的次元,由224x224x64變為112x112x64(注意,池化層緊緊是縮小模型的長和寬,不會改變模型的深度,是以這裡深度依然為64,而非128)
- 第二層卷積
1,現在我們的輸入從原始圖像變成了由第一層卷積之後的輸出數組:112x112x64. 我們再次引入和之前相同尺寸的卷積核,但是深度由原來的3變成了64(3x3x64),并且引入了128個這個卷積核,是以經過這一輪卷積運算,數組變成了112x112x128.
2,我們引入2x2的池化層,将數組降維變成56x56x128的數組
- 第三層卷積
1,根據上面的思想,我們現在的輸入是56x56x128的數組,我們引入尺寸為3x3x128的卷積核,并且引用了256個,此時數組的大小變為56x56x256
2,我們依然引入2x2的池化層,模型降維成28x28x256
- 第四層卷積
1,我們按照上面的思路,首先把模型變為28x28x512的數組
2,通過池化層,将模型降維變成14x14x512的數組
- 第五層卷積
1,我們引入3x3x512的卷積核,但是不改變輸入模型的深度,這句話的意思是這種卷積核我們引入512個。
2,通過2x2的池化操作,我們将模型降維變成7x7x512
- 全連接配接層
這裡要注意一下,我們引入了全連接配接層,那麼對于全連接配接層而言,輸入不再是一個7x7x512的矩陣,現在輸入可以想象為一個25088的向量(這個25088就是7x7x512的結果),整個全連接配接層如下圖所示:
以上就是VGG16網絡的結構。
參考部落格
https://blog.csdn.net/qq_39751437/article/details/97622636
https://blog.csdn.net/qq_39382877/article/details/97512087