作者:葉 虎
編輯:陳人和
前 言
說起CNN分類網(wǎng)絡(luò),無法避開的是Google提出的Inception網(wǎng)絡(luò)。Inception網(wǎng)絡(luò)開始于2014年的GoogLeNet,并經(jīng)歷了幾次版本的迭代,一直到目前最新的Inception-v4,每個版本在性能上都有一定的提升。這里簡單介紹Inception網(wǎng)絡(luò)的迭代史,重點講述各個版本網(wǎng)絡(luò)設(shè)計所采用的trick,需要說明的是Inception網(wǎng)絡(luò)相對復(fù)雜一些,因為它采用了各式各樣的較tricky的模塊。
Inception-v1
Inception-v2
Inception-v3
Inception-v4
Inception-ResNet
小結(jié)
01
Inception-v1就是眾人所熟知的GoogLeNet,它奪得了2014年ImageNet競賽的冠軍,它的名字也是為了致敬較早的LeNet網(wǎng)絡(luò)。GooLenet網(wǎng)絡(luò)率先采用了Inception模塊,因而又稱為Inception網(wǎng)絡(luò),后面的版本也是在Inception模塊基礎(chǔ)上進行改進。原始的Inception模塊如圖2所示,包含幾種不同大小的卷積,即1x1卷積,3x3卷積和5x5卷積,還包括一個3x3的max pooling層。這些卷積層和pooling層得到的特征concat在一起作為最終的輸出,也是下一個模塊的輸入。
圖2 Inception模塊的原始版本
但是采用較大的卷積核計算復(fù)雜度較大,只能限制特征的channel數(shù)量。所以GoogLeNet采用了1x1卷積來進行優(yōu)化,即先采用1x1卷積將特征的channel數(shù)降低,然后再進行前面所說的卷積。這種“瓶頸層”設(shè)計也是后面很多網(wǎng)絡(luò)所常采用的,如ResNet網(wǎng)絡(luò)。改進后的Inception模塊如下圖所示:
圖3 采用1×1卷積改進后的Inception模塊
整個GoogLeNet網(wǎng)絡(luò)是由Inception模塊堆積而成,如下圖所示,整個網(wǎng)絡(luò)總22層
圖4 GoogLeNet網(wǎng)絡(luò)結(jié)構(gòu)
從圖中也可以看到,最終的卷積層之后采用Global Average Pooling層,而不是全連接層,這有助于減少參數(shù)量,最近的分類網(wǎng)絡(luò)也基本上是類似的思路。另外值得注意的一點是網(wǎng)絡(luò)中間層有兩個附屬的loss,這是一種“深度監(jiān)督”策略,文中說是為了避免梯度消失問題,也是一種正則化手段。
圖5 采用Global Average Pooling層替換FC層
02
首先計算特征的mean和var,然后進行歸一化,但是為了保證一定的可變度,增加了gamma和beta兩個訓(xùn)練參數(shù)進行縮放和偏移。在訓(xùn)練過程,還要記錄兩個累積量:moving_mean和moving_var,它是每個訓(xùn)練step中batch的mean和var的指數(shù)加權(quán)移動平均數(shù)。在inference過程,不需要計算mean和var,而是使用訓(xùn)練過程中的累積量。這種訓(xùn)練和測試之間的差異性是BN層最被詬病的,所以后面有一系列的改進方法,如Group Norm等。
03
Inception-v3引入的核心理念是“因子化”(Factorization),主要是將一些較大的卷積分解成幾個較小的卷積。比如將一個5x5卷積分解成兩個3x3卷積:
圖6 采用兩個3x3卷積替換5x5卷積
可以計算,采用5x5卷積,參數(shù)量是5x5=25,而兩個3x3卷積的參數(shù)量是3x3+3x3=18,參數(shù)量減少了28%,但是兩者效果是等價的(感受野)。據(jù)此,改進了GoogLeNet網(wǎng)絡(luò)中的Inception模塊:
另外的一個因子化,是將nxn的卷積分解成1xn和nx1卷積,如對3x3卷積進行分解:
圖8 3×3卷積分解成1×3和3×1兩個卷積
同樣地,這種分解也在保證效果相同下降低參數(shù)量。據(jù)此,提出了改進的Inception模塊B:
但是作者在實際中發(fā)現(xiàn)這種結(jié)構(gòu)不適合較早的層,只適合中等大小的特征(對于mxm大小的特征m的值在12-20之間)。而對于高級特征(m較小的后面層),作者提出了Inceptionmo模塊C,其特點是卷積組被擴展以產(chǎn)生更多不一樣的特征:
Inception-v3的另外的一個改進是不再直接使用max pooling層進行下采樣,因為這樣導(dǎo)致信息損失較大。一個可行方案是先進行卷積增加特征channel數(shù)量,然后進行pooling,但是計算量較大。所以作者設(shè)計了另外一種方案,即兩個并行的分支,如圖11 所示,一個是pooling層,另外一個卷積層,最后將兩者結(jié)果concat在一起。這樣在使用較小的計算量情形下還可以避免瓶頸層,這種策略其實在ShuffleNet網(wǎng)絡(luò)中也采用了,看來多讀paper還是有用的,可以借鑒別人論文的優(yōu)點。
組合3個改進的Inception模塊,最終的Inception-v3網(wǎng)絡(luò)如下圖12所示,較早的層采用模塊A,中間層采用模塊B,而后面層采用模塊C。這中間有點復(fù)雜,如果想深入理解網(wǎng)絡(luò)的整體結(jié)構(gòu),可以參考一下google的開源實現(xiàn)(slim/inception-v3)。特別要注意的一點是Inception-v3的默認輸入大小是299x229,而不是常規(guī)的224x224。
Inception-v3也像GoogLeNet那樣使用了深度監(jiān)督,即中間層引入loss。另外一點是Inception-v3采用了一種Label Smoothing技術(shù)來正則化模型,提升泛化能力。其主要理念是防止最大的logit遠大于其它logits,因為可能會導(dǎo)致過擬合。具體實現(xiàn)比較簡單,即改變one-hot編碼的label即可:
new_labels = (1 — ε) * one_hot_labels + ε / K
其中K是類別數(shù),而ε=0.1是一個超參數(shù)。
04
學(xué)習(xí)與推斷Inception-v4
Inception-v4是對原來的版本進行了梳理,因為原始模型是采用分區(qū)方式訓(xùn)練,而遷移到TensorFlow框架后可以對Inception模塊進行一定的規(guī)范和簡化。Inception-v4整體結(jié)構(gòu)如圖13所示,網(wǎng)絡(luò)的輸入是299x299大小。在使用Inception模塊之前,有一個stem模塊,如右圖所示,這個模塊在Inception-v3網(wǎng)絡(luò)也是存在的,它將輸出35x35大小的特征圖。
Inception-v4中的Inception模塊分成3組,基本上與Inception-v3網(wǎng)絡(luò)是一致的,但有細微的變化,如下圖所示:
05
Inception-ResNet
Inception-ResNet網(wǎng)絡(luò)是在Inception模塊中引入ResNet的殘差結(jié)構(gòu),它共有兩個版本,其中Inception-ResNet-v1對標(biāo)Inception-v3,兩者計算復(fù)雜度類似,而Inception-ResNet-v2對標(biāo)Inception-v4,兩者計算復(fù)雜度類似。Inception-ResNet網(wǎng)絡(luò)結(jié)構(gòu)如圖15所示,整體架構(gòu)與Inception類似,右圖兩個分別是Inception-ResNet-v1和Inception-ResNet-v2網(wǎng)絡(luò)的stem模塊結(jié)構(gòu),也即是Inception-v3和Inception-v4網(wǎng)絡(luò)的stem模塊。
Inception-ResNet-v1的Inception模塊如圖16所示,與原始Inception模塊對比,增加shortcut結(jié)構(gòu),而且在add之前使用了線性的1x1卷積對齊維度。對于Inception-ResNet-v2模型,與v1比較類似,只是參數(shù)設(shè)置不同。
不同Inception網(wǎng)絡(luò)的在ImageNet上的對比結(jié)果如下表所示,可以看到加入殘差結(jié)構(gòu),并沒有很明顯地提升模型效果。但是作者發(fā)現(xiàn)殘差結(jié)構(gòu)有助于加速收斂。所以作者說沒有殘差結(jié)構(gòu)照樣可以訓(xùn)練出很深的網(wǎng)絡(luò)。
06
小結(jié)
從最初的GoogLeNet,到最新的Inception-ResNet,Inception網(wǎng)絡(luò)在不斷的迭代中越來越好,相比其它模型,Inception網(wǎng)絡(luò)相對來說更復(fù)雜一些,主要在于模塊比較復(fù)雜,而且采用的模塊也是多樣化。未來的話,可能需要AutoML來設(shè)計更好的模塊結(jié)構(gòu)。
參考
GoogLeNet/Inception-v1: Going Deeper with Convolutions.
BN-Inception/Inception-v2: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift.
Inception-v3: Rethinking the Inception Architecture for Computer Vision.
Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
Review: Inception-v4?—?Evolved From GoogLeNet, Merged with ResNet Idea (Image Classification)
A Simple Guide to the Versions of the Inception Network
END