GoogLeNet,作爲 ILSVRC-2014的分類和檢測任務的冠軍,相比於當年分類任務第二名VGG Net的對於小卷積層(3x3)的簡單堆疊,GoogLeNet提出更具創意的Inception模塊,雖然網絡結構比較複雜,但是模型參數量卻降低了,僅爲AlexNet的1/12,而VGGNet的參數量卻是AlexNet的3倍,但模型精度卻比VGG要跟高。
正是因爲GoogLeNet的高性能,後續繼續在Inception v1版本上繼續優化,出現了Inception v2,Inception v3,Inception v4,Inception-ResNet v1,Inception-ResNet v2等優化模型,下面我們來具體看下。
一、Inception v1
首先,我們需要明確,提高深度神經網絡性能最直接的方式是增加深度和寬度,但是這樣會帶來兩個問題:
1.更大的尺寸通常意味着更多的參數,這會使增大的網絡更容易過擬合,尤其是在訓練集的標註樣本有限的情況下。
2.會耗費大量計算資源。
GoogLeNet的設計理念爲:
1.圖像中的突出部分可能具有極大的尺寸變化。
2.信息位置的這種巨大變化,卷積操作選擇正確的核大小比較困難。
3.對於較全局分佈的信息,首選較大的核,對於較局部分佈的信息,首選較小的核。
4.非常深的網絡容易過擬合。它也很難通過整個網絡傳遞梯度更新。
5.簡單地堆疊大卷積運算導致計算複雜度較高
出於上面的考慮,提出瞭如下圖所示的初始Inception 模塊
對前一層的輸入進行並行並行卷積操作,使用多個感受野大小的卷積(1x1, 3x3, 5x5).
但是上述初始Inception ,參數量過大,從而導致計算量過大。
受Network in Network的啓發,作者使用1x1卷積對特徵圖通道數進行降維,這就是Inception v1的最終網絡結構,如下:
inception結構的主要貢獻:
一是使用1x1的卷積來進行降維;二是在多個尺寸上同時進行卷積再聚合
最終,基於Inception v1的GoogLeNet網絡結構如下圖:
每一層的具體情況如下圖:
GoogLeNet v1一共包含22層,網絡參數量只有Alexnet的1/12。隨着網絡層數的加深,依然會存在梯度消失問題,所以作者在中間層加入兩個輔助的softmax,以此增加反向傳播的梯度大小,同時也起到了正則化的作用。在計算網絡損失的時候,中間的輔助softmax loss會乘以一個權重(0.3)加入到最後層的loss值中。在預測時,則忽略中間softmax層的輸出。
二、Inception v2
Inception v2 的改進主要在以下幾點:
1. 加入Batch Normalization(批歸一化)層,標準結構爲:卷積-BN-relu
2. 借鑑VGG的使用,使用兩個3*3的卷積串聯來代替Inception 模塊中的5*5卷積模塊。因爲兩個3*3的卷積與一個5*5的卷積具體相同的感受野,但是參數量卻少於5*5的卷積。並且因爲增加了一層卷積操作,則對應多了一次Relu,即增加一層非線性映射,使特徵信息更加具有判別性
3. 使用非對稱卷積對3*3的卷積進一步分解爲3*1和1*3的卷積。如下圖:
關於非對稱卷積,論文中提到:
1)先進行 n×1 卷積再進行 1×n 卷積,與直接進行 n×n 卷積的結果是等價的。
2)非對稱卷積能夠降低運算量,原來是 n×n 次乘法,分解之後,變成了 2×n 次乘法了,n越大,運算量減少的越多。
3)雖然可以降低運算量,但這種方法不是哪兒都適用的,這樣的非對稱卷積不要用在靠近輸入的層,會影響精度,要用在較高的層,非對稱卷積在圖片大小介於12×12到20×20大小之間的時候,效果比較好。
Inception v2中有以下三種不同的Inception 模塊,如下圖
第一種模塊(figure 5)用在35x35的feature map上,主要是將一個5x5的卷積替換成兩個3x3的卷積
第二種模塊(figure 6),進一步將3*3的卷積核分解爲nx1 和 1xn 的卷積,用在17x17的feature map上,具體模塊結構,如下圖:
第三種模塊(figure 7)主要用在高維特徵上,在網絡中用於8x8的feature map上,具體結構如下圖:
GoogLeNet Inception v2的完整網絡架構如下圖:
三、Inception v3
Inception v3整體上採用了Inception v2的網絡結構,並在優化算法、正則化等方面做了改進,具體如下:
1. 優化算法使用RMSProp替代SGD
2. 輔助分類器中也加入BN操作
3. 使用Label Smoothing Regularization(LSR)方法 ,來避免過擬合,防止網絡對某一個類別的預測過於自信,對小概率類別增加更多的關注。(關於LSR優化方法,可以參考下這篇博客https://blog.csdn.net/lqfarmer/article/details/74276680)
4. 將剛開始的第一個7x7的卷積核替換爲兩個3x3的卷積核
四、Inception v4
Inception v4中的三個Inception模塊如下:
1. Inception-A block:
使用兩個3x3卷積代替5x5卷積,並且使用average pooling,該模塊主要處理尺寸爲35x35的feature map;結構如下圖:
2. Inception-B block:
使用1xn和nx1卷積代替nxn卷積,同樣使用average pooling,該模塊主要處理尺寸爲17x17的feature map。結構如下圖:
3. Inception-C block:
該模塊主要處理尺寸爲8x8的feature map。結構如下圖:
在將feature map從35x35降到17x17,再到8x8時,不是使用的簡單的pooling層,而是使用了兩個Reduction結構,具體結構如下圖:
最終,Inception v4完整結構如下圖:
五、Inception-ResNet v1, v2
Inception-ResNet顧名思義,在Inception的基礎上引入了ResNet殘差網絡的思想,將淺層特徵通過另外一條分支加到高層特徵中,達到特徵複用的目的,同時也避免深層網絡的梯度消失問題。
Inception-ResNet v1:
三個基本模塊如下圖:
Inception-ResNet v1的 Reduction-A 模塊和 Inception v4的保持一致,
Reduction-B模塊如下:
完整架構如下:
Inception-ResNet v2:
三個基本模塊如下圖:
Inception-ResNet v2的 Reduction-A 模塊同樣與 Inception v4的保持一致,Reduction-B模塊如下:
Inception-Resnet v2的整體架構和v1保持一致,Stem具體結構有所不同,Inception-Resnet v2的Stem結構和Inception v4的保持一致,具體如下圖:
歡迎關注我的公衆號,本公衆號不定期推送機器學習,深度學習,計算機視覺等相關文章,歡迎大家和我一起學習,交流。