經典網絡結構(LeNet , AlexNet , VGG , GoogLeNet)剖析


github博客傳送門
csdn博客傳送門

參考: https://my.oschina.net/u/876354/blog/1797489

LeNet

  1. C1層(卷積層):6@28×28
    (1)特征圖大小 ->(32-5+1)×(32-5+1)= 28×28
    (2)參數個數 -> 5×5+1)×6= 156 其中5×5為卷積核參數,1為偏置參數
    (3)連接數 -> 該層的連接數為(5×5+1)×6×28×28=122304

  2. S2層(下采樣層,也稱池化層):6@14×14
    (1)特征圖大小
    這一層的計算過程是:2×2 單元里的值相加,然后再乘以訓練參數w,再加上一個偏置參數b(每一個特征圖共享相同的w和b),然后取sigmoid值(S函數:0-1區間),作為對應的該單元的值。
    (2)參數個數 -> 2×6=12個參數
    (3)連接數 -> 該層的連接數為(2×2+1)×14×14×6 = 5880

  3. C3層(卷積層):16@10×10
    (1)特征圖大小 ->(14-5+1)×(14-5+1)= 10×10
    (2)參數個數 -> C3層的參數數目為(5×5×3+1)×6 +(5×5×4+1)×9 +5×5×6+1 = 1516
    (3)連接數 -> 特征圖大小為10×10,參數數量為1516,因此連接數為1516×10×10= 151600

  4. S4(下采樣層,也稱池化層):16@5×5
    (1)特征圖大小 -> 與S2的分析類似,池化單元大小為2×2,因此,該層與C3一樣共有16個特征圖,每個特征圖的大小為5×5。
    (2)參數數量 -> 與S2的計算類似,所需要參數個數為16×2 = 32
    (3)連接數 -> 連接數為(2×2+1)×5×5×16 = 2000

  5. C5層(卷積層):120
    (1)特征圖大小 -> 120個卷積核,每個卷積核5×5,120個特征圖,因此特征圖大小為(5-5+1)×(5-5+1)= 1×1。
    (2)參數個數 -> 本層的參數數目為120×(5×5×16+1) = 48120
    (3)連接數 -> 由於該層的特征圖大小剛好為1×1,因此連接數為48120×1×1=48120

  6. F6層(全連接層):84
    (1)特征圖大小 -> F6層有84個單元,之所以選這個數字的原因是來自於輸出層的設計,對應於一個7×12的比特圖,如下圖所示,-1表示白色,1表示黑色,這樣每個符號的比特圖的黑白色就對應於一個編碼。
    該層有84個特征圖,特征圖大小與C5一樣都是1×1,與C5層全連接。
    (2)參數個數 -> 由於是全連接,參數數量為(120+1)×84=10164。
    (3)連接數 -> 由於是全連接,連接數與參數數量一樣,也是10164。

  7. OUTPUT層(輸出層):10
    Output層也是全連接層,共有10個節點,分別代表數字0到9。如果第i個節點的值為0,則表示網絡識別的結果是數字i。
    (1)特征圖大小 -> 該層采用徑向基函數(RBF)的網絡連接方式,假設x是上一層的輸入,y是RBF的輸出,則RBF輸出的計算方式是:
    (類似平方差求和)
    上式中的Wij的值由i的比特圖編碼確定,i從0到9,j取值從0到7×12-1。RBF輸出的值越接近於0,表示當前網絡輸入的識別結果與字符i越接近。
    (2)參數個數 -> 由於是全連接,參數個數為84×10=840
    (3)連接數 -> 由於是全連接,連接數與參數個數一樣,也是840

AlexNet

AlexNet之所以能夠成功,跟這個模型設計的特點有關,主要有:
使用了非線性激活函數:ReLU
防止過擬合的方法:Dropout,數據擴充(Data augmentation)
其他:多GPU實現,LRN歸一化層的使用

  1. ReLU
    計算量大大減小 , 收斂速度變快

  2. 數據擴充
    最簡單、通用的圖像數據變形的方式:水平翻轉圖像,從原始圖像中隨機裁剪、平移變換,顏色、光照變換
    AlexNet在訓練時,在數據擴充(data augmentation)這樣處理:
    (1)隨機裁剪,對256×256的圖片進行隨機裁剪到224×224,然后進行水平翻轉,相當於將樣本數量增加了((256-224)^2)×2=2048倍;
    (2)測試的時候,對左上、右上、左下、右下、中間分別做了5次裁剪,然后翻轉,共10個裁剪,之后對結果求平均。作者說,如果不做隨機裁剪,大網絡基本上都過擬合;
    (3)對RGB空間做PCA(主成分分析),然后對主成分做一個(0, 0.1)的高斯擾動,也就是對顏色、光照作變換,結果使錯誤率又下降了1%。

  3. 重疊池化
    在AlexNet中使用的池化(Pooling)卻是可重疊的,也就是說,在池化的時候,每次移動的步長小於池化的窗口長度。
    AlexNet池化的大小為3×3的正方形,每次池化移動步長為2,這樣就會出現重疊。重疊池化可以避免過擬合,這個策略貢獻了0.3%的Top-5錯誤率。

  4. 局部歸一化(Local Response Normalization,簡稱LRN)
    在神經生物學有一個概念叫做“側抑制”(lateral inhibitio),指的是被激活的神經元抑制相鄰神經元。
    歸一化(normalization)的目的是“抑制”,局部歸一化就是借鑒了“側抑制”的思想來實現局部抑制,
    尤其當使用ReLU時這種“側抑制”很管用,因為ReLU的響應結果是無界的(可以非常大),所以需要歸一化。
    使用局部歸一化的方案有助於增加泛化能力。

  5. Dropout
    引入Dropout主要是為了防止過擬合。在神經網絡中Dropout通過修改神經網絡本身結構來實現,
    對於某一層的神經元,通過定義的概率將神經元置為0,這個神經元就不參與前向和后向傳播,
    就如同在網絡中被刪除了一樣,同時保持輸入層與輸出層神經元的個數不變,然后按照神經網絡的學習方法進行參數更新。
    在下一次迭代中,又重新隨機刪除一些神經元(置為0),直至訓練結束。
    Dropout應該算是AlexNet中一個很大的創新,以至於“神經網絡之父”Hinton在后來很長一段時間里的演講中都拿Dropout說事。
    Dropout也可以看成是一種模型組合,每次生成的網絡結構都不一樣,通過組合多個模型的方式能夠有效地減少過擬合,
    Dropout只需要兩倍的訓練時間即可實現模型組合(類似取平均)的效果,非常高效。

VGG

1、結構簡潔
VGG由5層卷積層、3層全連接層、softmax輸出層構成,層與層之間使用max-pooling(最大化池)分開,所有隱層的激活單元都采用ReLU函數。

2、小卷積核和多卷積子層
VGG使用多個較小卷積核(3x3)的卷積層代替一個卷積核較大的卷積層,一方面可以減少參數,另一方面相當於進行了更多的非線性映射,可以增加網絡的擬合/表達能力。
小卷積核是VGG的一個重要特點,雖然VGG是在模仿AlexNet的網絡結構,但沒有采用AlexNet中比較大的卷積核尺寸(如7x7),
而是通過降低卷積核的大小(3x3),增加卷積子層數來達到同樣的性能(VGG:從1到4卷積子層,AlexNet:1子層)。
VGG的作者認為兩個3x3的卷積堆疊獲得的感受野大小,相當一個5x5的卷積;而3個3x3卷積的堆疊獲取到的感受野相當於一個7x7的卷積。
這樣可以增加非線性映射,也能很好地減少參數(例如7x7的參數為49個,而3個3x3的參數為27)

  1. 輸入224x224x3的圖片,經64個3x3的卷積核作兩次卷積+ReLU,卷積后的尺寸變為224x224x64
  2. 作max pooling(最大化池化),池化單元尺寸為2x2(效果為圖像尺寸減半),池化后的尺寸變為112x112x64
  3. 經128個3x3的卷積核作兩次卷積+ReLU,尺寸變為112x112x128
  4. 作2x2的max pooling池化,尺寸變為56x56x128
  5. 經256個3x3的卷積核作三次卷積+ReLU,尺寸變為56x56x256
  6. 作2x2的max pooling池化,尺寸變為28x28x256
  7. 經512個3x3的卷積核作三次卷積+ReLU,尺寸變為28x28x512
  8. 作2x2的max pooling池化,尺寸變為14x14x512
  9. 經512個3x3的卷積核作三次卷積+ReLU,尺寸變為14x14x512
  10. 作2x2的max pooling池化,尺寸變為7x7x512
  11. 與兩層1x1x4096,一層1x1x1000進行全連接+ReLU(共三層)
  12. 通過softmax輸出1000個預測結果

GoogLeNet

GoogLeNet(從Inception v1到v4的演進)

2014年,GoogLeNet和VGG是當年ImageNet挑戰賽(ILSVRC14)的雙雄,GoogLeNet獲得了第一名、VGG獲得了第二名,這兩類模型結構的共同特點是層次更深了。
VGG繼承了LeNet以及AlexNet的一些框架結構(詳見 大話CNN經典模型:VGGNet),而GoogLeNet則做了更加大膽的網絡結構嘗試,雖然深度只有22層,但大小卻比AlexNet和VGG小很多,
GoogleNet參數為500萬個,AlexNet參數個數是GoogleNet的12倍,VGGNet參數又是AlexNet的3倍,
因此在內存或計算資源有限時,GoogleNet是比較好的選擇;從模型結果來看,GoogLeNet的性能卻更加優越。

解決深度網絡(過擬合, 參數過多, 梯度彌散)這些問題的方法當然就是在增加網絡深度和寬度的同時減少參數,為了減少參數,自然就想到將全連接變成稀疏連接。
但是在實現上,全連接變成稀疏連接后實際計算量並不會有質的提升,因為大部分硬件是針對密集矩陣計算優化的,稀疏矩陣雖然數據量少,但是計算所消耗的時間卻很難減少。

那么,有沒有一種方法既能保持網絡結構的稀疏性,又能利用密集矩陣的高計算性能。大量的文獻表明可以將稀疏矩陣聚類為較為密集的子矩陣來提高計算性能, 如人類的大腦是可以看做是神經元的重復堆積,因此,GoogLeNet團隊提出了Inception網絡結構,就是構造一種“基礎神經元”結構,來搭建一個稀疏性、高計算性能的網絡結構。

一、Inception V1
通過設計一個稀疏網絡結構,但是能夠產生稠密的數據,既能增加神經網絡表現,又能保證計算資源的使用效率。谷歌提出了最原始Inception的基本結構:
該結構將CNN中常用的卷積(1x1,3x3,5x5)、池化操作(3x3)堆疊在一起(卷積、池化后的尺寸相同,將通道相加),一方面增加了網絡的寬度,另一方面也增加了網絡對尺度的適應性。

  1. 輸入
    原始輸入圖像為224x224x3,且都進行了零均值化的預處理操作(圖像每個像素減去均值)。
  2. 第一層(卷積層)
    使用7x7的卷積核(滑動步長2,padding為3),64通道,輸出為112x112x64,卷積后進行ReLU操作
    經過3x3的max pooling(步長為2),輸出為((112 - 3+1)/2)+1=56,即56x56x64,再進行ReLU操作
  3. 第二層(卷積層)
    使用3x3的卷積核(滑動步長為1,padding為1),192通道,輸出為56x56x192,卷積后進行ReLU操作
    經過3x3的max pooling(步長為2),輸出為((56 - 3+1)/2)+1=28,即28x28x192,再進行ReLU操作
    3a、第三層(Inception 3a層)
    分為四個分支,采用不同尺度的卷積核來進行處理
    (1)64個1x1的卷積核,然后RuLU,輸出28x28x64
    (2)96個1x1的卷積核,作為3x3卷積核之前的降維,變成28x28x96,然后進行ReLU計算,再進行128個3x3的卷積(padding為1),輸出28x28x128
    (3)16個1x1的卷積核,作為5x5卷積核之前的降維,變成28x28x16,進行ReLU計算后,再進行32個5x5的卷積(padding為2),輸出28x28x32
    (4)pool層,使用3x3的核(padding為1),輸出28x28x192,然后進行32個1x1的卷積,輸出28x28x32。
    將四個結果進行連接,對這四部分輸出結果的第三維並聯,即64+128+32+32=256,最終輸出28x28x256
    3b、第三層(Inception 3b層)
    (1)128個1x1的卷積核,然后RuLU,輸出28x28x128
    (2)128個1x1的卷積核,作為3x3卷積核之前的降維,變成28x28x128,進行ReLU,再進行192個3x3的卷積(padding為1),輸出28x28x192
    (3)32個1x1的卷積核,作為5x5卷積核之前的降維,變成28x28x32,進行ReLU計算后,再進行96個5x5的卷積(padding為2),輸出28x28x96
    (4)pool層,使用3x3的核(padding為1),輸出28x28x256,然后進行64個1x1的卷積,輸出28x28x64。
    將四個結果進行連接,對這四部分輸出結果的第三維並聯,即128+192+96+64=480,最終輸出輸出為28x28x480
    第四層(4a,4b,4c,4d,4e)、第五層(5a,5b)……,與3a、3b類似,在此就不再重復。

二、Inception V2
GoogLeNet憑借其優秀的表現,得到了很多研究人員的學習和使用,因此GoogLeNet團隊又對其進行了進一步地發掘改進,產生了升級版本的GoogLeNet。
GoogLeNet設計的初衷就是要又准又快,而如果只是單純的堆疊網絡雖然可以提高准確率,但是會導致計算效率有明顯的下降,所以如何在不增加過多計算量的同時提高網絡的表達能力就成為了一個問題。
Inception V2版本的解決方案就是修改Inception的內部計算邏輯,提出了比較特殊的“卷積”計算結構。

1、卷積分解(Factorizing Convolutions)
大尺寸的卷積核可以帶來更大的感受野,但也意味着會產生更多的參數,比如5x5卷積核的參數有25個,3x3卷積核的參數有9個,前者是后者的25/9=2.78倍。
因此,GoogLeNet團隊提出可以用2個連續的3x3卷積層組成的小網絡來代替單個的5x5卷積層,即在保持感受野范圍的同時又減少了參數量
可以看出,大卷積核完全可以由一系列的3x3卷積核來替代,那能不能再分解得更小一點呢?GoogLeNet團隊考慮了nx1的卷積核,如下圖所示,用3個3x1取代3x3卷積
因此,任意nxn的卷積都可以通過1xn卷積后接nx1卷積來替代。GoogLeNet團隊發現在網絡的前期使用這種分解效果並不好,在中度大小的特征圖(feature map)上使用效果才會更好(特征圖大小建議在12到20之間)。

三、Inception V3
Inception V3一個最重要的改進是分解(Factorization),將7x7分解成兩個一維的卷積(1x7,7x1),3x3也是一樣(1x3,3x1),這樣的好處,既可以加速計算,
又可以將1個卷積拆成2個卷積,使得網絡深度進一步增加,增加了網絡的非線性(每增加一層都要進行ReLU)。另外,網絡輸入從224x224變為了299x299。

四、Inception V4
Inception V4研究了Inception模塊與殘差連接的結合。ResNet結構大大地加深了網絡深度,還極大地提升了訓練速度,同時性能也有提升。
Inception V4主要利用殘差連接(Residual Connection)來改進V3結構,得到Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4網絡。

print_r('點個贊吧');
var_dump('點個贊吧');
NSLog(@"點個贊吧!")
System.out.println("點個贊吧!");
console.log("點個贊吧!");
print("點個贊吧!");
printf("點個贊吧!\n");
cout << "點個贊吧!" << endl;
Console.WriteLine("點個贊吧!");
fmt.Println("點個贊吧!")
Response.Write("點個贊吧");
alert(’點個贊吧’)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM