Inception網絡家族

目錄

一、Inception v1(GoogleNet)

二、Inception v2

三、Inception v3

四、Inception v4


一、Inception v1(GoogleNet)

 

對左上圖做以下說明: 
1 . 採用不同大小(1x1,3x3,5x5,3x3的maxpooling)的卷積核意味着不同大小的感受野,最後拼接意味着不同尺度特徵的融合; 
2 . 之所以卷積核大小採用1、3和5,主要是爲了方便對齊。設定卷積步長stride=1之後,只要分別設定pad=0、1、2,那麼卷積之後便可以得到相同維度的特徵,然後這些特徵就可以直接拼接在一起了; 

3 . 文章說很多地方都表明pooling挺有效,所以Inception裏面也嵌入了;

4 . 網絡越到後面,特徵越抽象,而且每個特徵所涉及的感受野也更大了,因此隨着層數的增加,3x3和5x5卷積的比例也要增加。

 

對於右上圖做以下說明:

使用5x5的卷積核仍然會帶來巨大的計算量, 爲此,文章借鑑NIN,採用1x1卷積核來進行降維。

 

 

作者以Inception爲基本構造塊構造成了GoogLenet。GoogLenet有兩個主要特點: 

(1)在低層時候仍然用傳統的方式,高層用Inception塊疊加。(論文中說"

For technical reasons (memory efficiency during training), it seemed beneficial to start using Inceptionmodules only at higher layers while keeping the lower layers in traditional convolutional fashion.This is not strictly necessary, simply reflecting some infrastructural inefficiencies in our currentimplementation.") ,大概的意思就是因爲在訓練階段的內存效率問題

(2)網絡最後採用了average pooling來代替全連接層,想法來自NIN,事實證明可以將TOP1 accuracy提高0.6%。但是,實際在最後還是加了一個全連接層,主要是爲了方便以後大家finetune

(3)爲了解決梯度彌散的問題,在4a和4d的後面添加輔助loss,該loss僅在訓練的時候以一定的weight參與梯度傳遞,而在test的時候不用。

GoogleNet構架

每個Inception模塊包含兩層,即:2X9+4=22層

爲了避免梯度消失,網絡額外增加了2個輔助的softmax用於向前傳導梯度。文章中說這兩個輔助的分類器的loss應該加一個衰減係數,作者paper中的表述如下:但是在測試的過程中我們發現,這兩個額外的softmax會被去掉。

 

對於整個網絡部分細節的解釋如下:

 

二、Inception v2

在v1的基礎上,進行了改進,一方面了加入了BN層,減少了Internal Covariate Shift(內部neuron的數據分佈發生變化),使每一層的輸出都規範化到一個N(0, 1)的高斯,另外一方面學習VGG用2個3x3的conv替代inception模塊中的5x5,既降低了參數數量,也加速計算。

 

Bn的詳細解釋請參考我的另一篇博客:點擊打開鏈接

 

三、Inception v3

 

下面的準則來源於大量的實驗,因此包含一定的推測,但實際證明基本都是有效的。

1 . 避免表達瓶頸,特別是在網絡靠前的地方。 信息流前向傳播過程中顯然不能經過高度壓縮的層,即表達瓶頸。從input到output,feature map的寬和高基本都會逐漸變小,但是不能一下子就變得很小。比如你上來就來個kernel = 7, stride = 5 ,這樣顯然不合適。 

另外輸出的維度channel,一般來說會逐漸增多(每層的num_output),否則網絡會很難訓練。(特徵維度並不代表信息的多少,只是作爲一種估計的手段)

2 . 高維特徵更易處理。 高維特徵更易區分,會加快訓練。

3. 可以在低維嵌入上進行空間匯聚而無需擔心丟失很多信息。 比如在進行3x3卷積之前,可以對輸入先進行降維而不會產生嚴重的後果。假設信息可以被簡單壓縮,那麼訓練就會加快。

4 . 平衡網絡的寬度與深度。

上述的這些並不能直接用來提高網絡質量,而僅用來在大環境下作指導。

 

大尺寸的卷積核可以帶來更大的感受野,但也意味着更多的參數,比如5x5卷積核參數是3x3卷積核的25/9=2.78倍。爲此,作者提出可以用2個連續的3x3卷積層(stride=1)組成的小網絡來代替單個的5x5卷積層,(保持感受野範圍的同時又減少了參數量)如下圖:

如上左圖可見,爲作者採用的非對稱卷積形式的inception網絡結構,參數會比原來的少,但是隨之而來的問題是:

 

1 . 這種替代會造成表達能力的下降嗎? 

後面有大量實驗可以表明不會造成表達缺失;

 

2 . 3x3卷積之後還要再加激活嗎? 

見右上圖所示,作者也做了對比試驗,表明添加非線性激活會提高性能。但是整體的差別不大。

 

 

於是,任意nxn的卷積都可以通過1xn卷積後接nx1卷積來替代。實際上,作者發現在網絡的前期使用這種分解效果並不好,還有在中度大小的feature map上使用效果纔會更好。(對於mxm大小的feature map,建議m在12到20之間)。

總結如下圖:

 

(1) 圖4是GoogLeNet V1中使用的Inception結構;

(2) 圖5是用3x3卷積序列來代替大卷積核;

(3) 圖6是用nx1卷積來代替大卷積核,這裏設定n=7來應對17x17大小的feature map。該結構被正式用在GoogLeNet V2中。

 

四、Inception v4

 

v4研究了Inception模塊結合Residual Connection能不能有改進?發現ResNet的結構可以極大地加速訓練,同時性能也有提升,得到一個Inception-ResNet v2網絡,同時還設計了一個更深更優化的Inception v4模型,能達到與Inception-ResNet v2相媲美的性能。

 

對於Inception系列的網絡演變做如下總結:

 

1、Inception v1的網絡,將1x1,3x3,5x5的conv和3x3的pooling,stack在一起,一方面增加了網絡的width,另一方面增加了網絡對尺度的適應性;

2、v2的網絡在v1的基礎上,進行了改進,一方面了加入了BN層,減少了Internal Covariate Shift(內部neuron的數據分佈發生變化),使每一層的輸出都規範化到一個N(0, 1)的高斯,另外一方面學習VGG用2個3x3的conv替代inception模塊中的5x5,既降低了參數數量,也加速計算;

3、v3一個最重要的改進是分解(Factorization),將7x7分解成兩個一維的卷積(1x7,7x1),3x3也是一樣(1x3,3x1),這樣的好處,既可以加速計算(多餘的計算能力可以用來加深網絡),又可以將1個conv拆成2個conv,使得網絡深度進一步增加,增加了網絡的非線性,還有值得注意的地方是網絡輸入從224x224變爲了299x299,更加精細設計了35x35/17x17/8x8的模塊;

4、v4研究了Inception模塊結合Residual Connection能不能有改進?發現ResNet的結構可以極大地加速訓練,同時性能也有提升,得到一個Inception-ResNet v2網絡,同時還設計了一個更深更優化的Inception v4模型,能達到與Inception-ResNet v2相媲美的性能。

 

作者寫的很棒,轉載一下:

https://blog.csdn.net/gbyy42299/article/details/80481066

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章