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

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

參考: http://www.javashuo.com/article/p-wtikiofi-gt.htmlgithub

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歸一化層的使用google

  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

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

二、小卷積核和多卷積子層
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網絡結構,就是構造一種「基礎神經元」結構,來搭建一個稀疏性、高計算性能的網絡結構。

1、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相似,在此就再也不重複。

2、Inception V2
GoogLeNet憑藉其優秀的表現,獲得了不少研究人員的學習和使用,所以GoogLeNet團隊又對其進行了進一步地發掘改進,產生了升級版本的GoogLeNet。
GoogLeNet設計的初衷就是要又準又快,而若是隻是單純的堆疊網絡雖然能夠提升準確率,可是會致使計算效率有明顯的降低,因此如何在不增長過多計算量的同時提升網絡的表達能力就成爲了一個問題。
Inception V2版本的解決方案就是修改Inception的內部計算邏輯,提出了比較特殊的「卷積」計算結構。

一、卷積分解(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之間)。

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

4、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(’點個贊吧’)
相關文章
相關標籤/搜索