天天看點

什麼是GoogleNet?什麼是Inception?GoogleNet結構詳解(2014年)1 Inception

googleNet是2014年的ILSVRC的冠軍模型,GoogleNet做了更大膽的網絡上的嘗試,而不是像vgg繼承了lenet以及alexnet的一切架構。GoogleNet雖然有22層,但是參數量隻有AlexNet的1/12。

GoogleNet論文指出獲得高品質模型最保險的做法就是增加模型的深度,或者是它的寬度,但是一般情況下,更深和更寬的網絡會出現以下問題:

  1. 參數太多,容易過拟合,如果訓練資料有限,則這一問題更加突出;
  2. 網絡越大計算複雜度越大,難以應用;
  3. 網絡越深,容易出現梯度消失問題

總之更大的網絡容易産生過拟合,并且增加了計算量

【GoogleNet給出的解決方案】

  1. 将全連接配接層甚至一般的卷積都轉化為稀疏連接配接

GoogleNet為了保持神經網絡結構的稀疏性,又能充分利用密集矩陣的高計算性能,提出了名為Inception的子產品化結構來實作此目的。依據就是大量文獻都表明,将稀疏矩陣聚類為比較密集的子矩陣可以提高計算性能。(這一塊我沒有很明白,是百度到的知識,但是關鍵在于GoogleNet提出了Inception這個子產品化結構,在2020年的今日,這個子產品依然有巨大作用)

1 Inception

這是一種王中王結構,哦不,是網中網結構(Network in Network)。就是原來的節點也是一個網絡,使用了Inception,這個網絡結構的寬度和深度都可以擴大。進而帶來性能的提升。

什麼是GoogleNet?什麼是Inception?GoogleNet結構詳解(2014年)1 Inception

解釋說明:

  • 采用不同大小的卷積核意味着,大小不同的感受野,最後拼接意味着不同尺度特征的融合。
  • 之是以卷積核采用1,3,5,主要是為了友善對其,設定卷積步長stride=1後,隻需要分别設定pad=0,1,2,這樣卷積後就可以得到相同次元的特征,然後直接拼接在一起
  • 文章中說很多地方都表明pooling很有效果,是以這裡也引入了。。。。。。
  • 網絡越到後面,特征越抽象,而且每個特征所設計的感受野也更大了,是以,在層數的增加,3x3和5x5的卷積的比例增加(後面會看到)
  • 使用5x5的卷積核仍然會帶來巨大的計算量,為此文章借鑒NIN2,采用1x1的卷積核來降低次元。到底是如何使用1x1的卷積核降低次元的呢?假設有一個3x3x10的圖檔特征,長寬都是1,然後channel,我喜歡叫它厚度是10,我們想要降低次元到5,怎麼辦呢?首先我們需要找到一個1x1x10的卷積核,然後卷積結果應該是一個3x3x1的一個特征圖,我們可以找到5個這個的卷積核,卷積五次,得到的圖檔就會使3x3x5這樣的特征圖了,當然同理,1x1卷積核也可以用來提高次元.

從網上找了一張GoogleNet的美圖:

什麼是GoogleNet?什麼是Inception?GoogleNet結構詳解(2014年)1 Inception

還有一個:

什麼是GoogleNet?什麼是Inception?GoogleNet結構詳解(2014年)1 Inception

GoogLeNet網絡結構明細表解析如下:

0、輸入

原始輸入圖像為224x224x3,且都進行了零均值化的預處理操作(圖像每個像素減去均值)。

1、第一層(卷積層)

使用7x7的卷積核(滑動步長2,padding為3),64通道,輸出為112x112x64,卷積後進行ReLU操作

經過3x3的max pooling(步長為2),輸出為((112 - 3+1)/2)+1=56,即56x56x64,再進行ReLU操作

2、第二層(卷積層)

使用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類似,在此就不再重複。

到這裡!我們看美圖應該能看出來一點,GoogleNet的結構就是3+3+3總共九個inception子產品組成的,每個Inception有兩層,加上開頭的3個卷積層和輸出前的FC層,總共22層!然後每3層的inception之後都會有一個輸出結果,這個網絡一共有三個輸出結果,這是什麼情況呢?

這個是輔助分類器,GoogleNet用到了輔助分類器。因為除了最後一層的輸出結果,中間節點的分類效果也可能是很好的,是以GoogleNet将中間的某一層作為輸出,并以一個較小的權重加入到最終分類結果中。其實就是一種變相的模型融合,同時給網絡增加了反向傳播的梯度信号,也起到了一定的正則化的作用。

最後,我再提出兩個問題:

  1. 如果使用1x1進行特征壓縮,是否會影響最終結果?回答:不會,作者的解釋是,如果你想要把特征厚度從128變成256,你可以直接用3x3進行特征提取。如果你先用1x1進行壓縮到64,然後再用3x3把64channel的特征擴充成256,其實對後續的精度沒有影響,而且減少了運算次數。
  2. 為什麼inception是多個尺度上進行卷積再聚合?回答:直覺上,多個尺度上同時卷積可以提取到不同尺度的特征。而這也意味着最後分類判斷更加準确。除此之外,這是可以利用稀疏矩陣分解成密集矩陣計算的原理來加快收斂速度。(第二個好處沒有太看懂) 個人淺顯的了解就是:提取多個尺度的特征,再聚合的時候,就可以找到關聯性強的特征,這樣就能避免浪費在關聯性較弱的特征上的計算力吧。