Inception網絡模型


最近在研究inception模型,將v1到v4版本的論文都研讀了一下,這里做一下總結。

這里推薦一下這個GitHub,博主將常見的論文都做了翻譯,大家可以參考中文來加深理解。

1.Inception v1

1.1 Introduction

Inception V1是來源於《Going deeper with convolutions》,論文主要介紹了,如何在有限的計算資源內,進一步提升網絡的性能。

提升網絡的性能的方法有很多,例如硬件的升級,更大的數據集等。但一般而言,提升網絡性能最直接的方法是增加網絡的深度和寬度。其中,網絡的深度只的是網絡的層數,寬度指的是每層的通道數。但是,這種方法會帶來兩個不足:

  a) 容易發生過擬合。當深度和寬度不斷增加的時候,需要學習到的參數也不斷增加,巨大的參數容易發生過擬合。

  b) 均勻地增加網絡的大小,會導致計算量的加大。

因此,解決上述不足的方法是引入稀疏特性和將全連接層轉換成稀疏連接。這個思路的緣由來自於兩方面:1)生物的神經系統連接是稀疏的;2)有文獻指出:如果數據集的概率分布能夠被大型且非常稀疏的DNN網絡所描述的話,那么通過分析前面層的激活值的相關統計特性和將輸出高度相關的神經元進行聚類,便可逐層構建出最優的網絡拓撲結構。說明臃腫的網絡可以被不失性能地簡化。

但是,現在的計算框架對非均勻的稀疏數據進行計算是非常低效的,主要是因為查找和緩存的開銷。因此,作者提出了一個想法,既能保持濾波器級別的稀疏特性,又能充分密集矩陣的高計算性能。有大量文獻指出,將稀疏矩陣聚類成相對密集的子矩陣,能提高計算性能。根據此想法,提出了Inception結構。

1.2 Inception結構

inception結構的主要思路是:如何使用一個密集成分來近似或者代替最優的局部稀疏結構。inception V1的結構如下面兩個圖所示。

 

對於上圖中的(a)做出幾點解釋:

  a)采用不同大小的卷積核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合; 

  b)之所以卷積核大小采用1、3和5,主要是為了方便對齊;

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

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

但是,使用5x5的卷積核仍然會帶來巨大的計算量。 為此,文章借鑒NIN,采用1x1卷積核來進行降維,如圖中(b)所示。
例如:上一層的輸出為100x100x128,經過具有256個輸出的5x5卷積層之后(stride=1,pad=2),輸出數據的大小為100x100x256。其中,卷積層的參數為5x5x128x256。假如上一層輸出先經過具有32個輸出的1x1卷積層,再經過具有256個輸出的5x5卷積層,那么最終的輸出數據的大小仍為100x100x256,但卷積參數量已經減少為1x1x128x32 + 5x5x32x256,大約減少了4倍。

在inception結構中,大量采用了1x1的矩陣,主要是兩點作用:1)對數據進行降維;2)引入更多的非線性,提高泛化能力,因為卷積后要經過ReLU激活函數。

1.3 GoogLeNet

GoogLeNet是由inception模塊進行組成的,結構太大了,就不放出來了,這里做出幾點說明:

  a)GoogLeNet采用了模塊化的結構,方便增添和修改;

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

  c)雖然移除了全連接,但是網絡中依然使用了Dropout;

  d)為了避免梯度消失,網絡額外增加了2個輔助的softmax用於向前傳導梯度。文章中說這兩個輔助的分類器的loss應該加一個衰減系數,但看源碼中的model也沒有加任何衰減。此外,實際測試的時候,這兩個額外的softmax會被去掉。

參考文獻:

  [1] https://blog.csdn.net/qq_38906523/article/details/80061075

  [2] Inception v1的TensorFlow源碼:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/slim/python/slim/nets/inception_v1.py

 

2.Inception v2

2.1 introduction

Inception v2來自於論文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》

訓練DNN網絡的一個難點是,在訓練時每層輸入數據的分布會發生改變,所以需要較低的學習率和精心設置初始化參數。只要網絡的前面幾層發生微小的改變,那么后面幾層就會被累積放大下去。一旦網絡某一層的輸入數據的分布發生改變,那么這一層網絡就需要去適應學習這個新的數據分布,所以如果訓練過程中,訓練數據的分布一直在發生變化,那么將會影響網絡的訓練速度。作者把網絡中間層在訓練過程中,數據分布的改變稱之為:“Internal  Covariate Shift”。因此,作者提出對數據做歸一化的想法。

對數據進行了BN算法后,具有以下的優點:

  a)可以設置較大的初始學習率,並且減少對參數初始化的依賴,提高了訓練速度;

  b)這是個正則化模型,因此可以去除dropout和降低L2正則約束參數;

  c)不需要局部響應歸一化層;

  d)能防止網絡陷入飽和,即消除梯度彌散。

2.2 BN算法

BN算法通過下面公式,對某一層進行歸一化處理,也叫近似白化預處理:

 $$\widehat{x^{(k)}}=\frac{x^{(k)}-E[x^{(k)}]}{\sqrt{Var(x^{(k)})}}$$

其中,由於我們是采用批量梯度下降法的,所以$E[x^{(k)}]$是指在一批數據中,各神經元的平均值;$Var(x^{(k)})$是指在一批訓練數據時各神經元輸入值的標准差。

如果是僅僅使用上面的歸一化公式,對網絡某一層A的輸出數據做歸一化,然后送入網絡下一層B,這樣是會影響到本層網絡A所學習到的特征的。打個比方,比如我網絡中間某一層學習到特征數據本身就分布在S型激活函數的兩側,你強制把它給我歸一化處理、標准差也限制在了1,把數據變換成分布於s函數的中間部分,這樣就相當於我這一層網絡所學習到的特征分布被搞壞了。

於是,提出了“變換重構”,引入了可學習參數$\gamma $和$\beta $:

$$y^{(k)}=\gamma ^{(k)}\widehat{x^{(k)}}+\beta ^{(k)}$$

每一個神經元$x^{(k)}$都會有這樣的一對參數$\gamma $和$\beta $。當$\gamma ^{(k)}=\sqrt{Var(x^{(k)})}$和$\beta ^{(k)}=E[x^{(k)}]$時,是可以恢復出原始的某一層所學到的特征的。

通過上面的學習,我們知道BN層是對於每個神經元做歸一化處理,甚至只需要對某一個神經元進行歸一化,而不是對一整層網絡的神經元進行歸一化。既然BN是對單個神經元的運算,那么在CNN中卷積層上要怎么搞?假如某一層卷積層有6個特征圖,每個特征圖的大小是100*100,這樣就相當於這一層網絡有6*100*100個神經元,如果采用BN,就會有6*100*100個參數γ、β,這樣豈不是太恐怖了。因此卷積層上的BN使用,其實也是使用了類似權值共享的策略,把一整張特征圖當做一個神經元進行處理

卷積神經網絡經過卷積后得到的是一系列的特征圖,如果min-batch sizes為m,那么網絡某一層輸入數據可以表示為四維矩陣(m,f,p,q),m為min-batch sizes,f為特征圖個數,p、q分別為特征圖的寬高。在cnn中我們可以把每個特征圖看成是一個特征處理(一個神經元),因此在使用Batch Normalization,mini-batch size 的大小就是:m*p*q,於是對於每個特征圖都只有一對可學習參數:γ、β。說白了吧,這就是相當於求取所有樣本所對應的一個特征圖的所有神經元的平均值、方差,然后對這個特征圖神經元做歸一化。

參考文獻:

  [1] https://blog.csdn.net/qq_26898461/article/details/51221166

 

3.Inception v3

Inception v3是來源於論文《Rethinking the Inception Architecture for Computer Vision》,主要是引入了因子分解的思想。

3.1 General Design Principles

復雜的inception結構,使得我們很難對網絡進行修改。如果盲目的擴大網絡,反而會增大計算量。所以,本論文首先給出了幾條通用的原則和優化的思想:

  • 避免特征表示瓶頸,尤其是在網絡的前面。要避免嚴重壓縮導致的瓶頸。特征表示尺寸應該溫和地減少,從輸入端到輸出端。特征表示的維度只是一個粗淺的信息量表示,它丟掉了一些重要的因素如相關性結構。

  • 高維信息更適合在網絡的局部處理。在卷積網絡中逐步增加非線性激活響應可以解耦合更多的特征,那么網絡就會訓練的更快。

  • 空間聚合可以通過低維嵌入,不會導致網絡表示能力的降低。例如在進行大尺寸的卷積(如3*3)之前,我們可以在空間聚合前先對輸入信息進行降維處理,如果這些信號是容易壓縮的,那么降維甚至可以加快學習速度。

  • 平衡好網絡的深度和寬度。通過平衡網絡每層濾波器的個數和網絡的層數可以是網絡達到最佳性能。增加網絡的寬度和深度都會提升網絡的性能,但是兩者並行增加獲得的性能提升是最大的。所以計算資源應該被合理的分配到網絡的寬度和深度。 

3.2 Factorizing Convolutions with Large Filter Size

大尺度濾波器的卷積(如5*5,7*7)的引入,會產生大量的計算。例如一個5*5的卷積比一個3*3卷積濾波器多25/9=2.78倍計算量。當然5*5濾波器可以學習到更多的信息。那么我們能不能使用一個多層感知器來代替這個5*5卷積濾波器。

因此,提出了使用兩個級聯的3*3的濾波器來代替一個5*5的濾波器,這樣節省了(5*5)/(2*3*3)=1.39被計算量,如下圖的左圖所示。因此,inception v1中的模塊可以被替換成下圖的右圖所示。

受到上面的啟發,又進一步對卷進進一步分解,將3*3的卷積核分解為3*1+1*3,如下圖所示。這樣,又能進一步降低計算量。因此,一個n*n的卷積可以被1*n和n*1的卷積所代替。但實際上,在網絡模型的前期使用這樣的卷積分解,並不能達到一個很好的效果。通過在網絡中期使用,在特征圖的尺寸為12-20左右使用最佳。

3.3 其他思想

  • 利用輔助決策分支,來加快收斂速度。在inception v1中,引入了輔助決策分支。但是本文證明了,底層的輔助決策分支並不能起到很好的作用。如果輔助決策分支進行歸一化或者dropout,效果會更好。
  • 利用平行的池化與卷積,來進行特征圖尺寸縮小,不僅能較少計算量,又能防止特征瓶頸,如下圖所示。

  • 提出了Label Smoothing

參考文獻:

  [1] https://www.cnblogs.com/vincentqliu/p/7467298.html

 

4. Inception v4

 Inception V4來自於論文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》,主要提出了新的Inception結構,並且結合ResNet網絡提出了Inception-ResNet-v1和Inception-ResNet-v2。

4.1 introduction

文章中提出了一個疑問:當網絡更深更寬時,inception網絡能否一樣高效。基於這個想法,將inception和resnet兩者進行融合,進一步改善網絡。由於TensorFlow的出現,能大大簡化訓練,不需要將模型進行分割。因此,google采取了更加大膽的設計方法,提出了inception v4,其具有更加統一的inception結構。

4.2 inception v4,Inception-ResNet結構

 

 

 

可以看出,這3種結構還是相當復雜的,即使比之前的inception模塊統一了很多。

 

總結

inception是通過增加網絡的寬度來提高網絡性能,在每個inception模塊中,使用了不同大小的卷積核,可以理解成不同的感受野,然后將其concentrate起來,豐富了每層的信息。之后,使用了BN算法(BN使用在conv之后,relu之前),來加速網絡的收斂速度。在V3版本中,還使用了卷積因子分解的思想,將大卷積核分解成小卷積,節省了參數,降低了模型大小。在V4版本中,使用了更加統一的inception模塊,並結合了resnet的殘差思想,能將網絡做得更深。

 


免責聲明!

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



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