還沒關注?快來點這裡!?相對來說,Inception系列模型沒有ResNet系列和MobileNet系列那般經常出現在各大科研論文的開原始碼上,在我接觸的開原始碼裡,是比較少的。但是,它們都是非常優秀的經典卷積神經網絡,在當年的ILSVRC比賽中都取得了較好的成績,其思想至今還影響著模型算法發展的方向,特別是Inception V2裡提出來的batch normalization批歸一化經久不衰。因此,溫故而知新,了解和借鑑Inception系列經典神經網絡模型的設計思想對我們非常有意義,本文,將帶大家一起回顧從Inception V1到Inception V4的設計思想。
論文:
《Going deeper with convolutions》
https://arxiv.org/pdf/1409.4842.pdf
https://github.com/tensorflow/models/blob/master/research/slim/nets/inception_v1.pyInception V1卷積神經網絡提出於2014年,原名GoogLeNet,作者說是為了向開創性提出LeNet的Yann LeCuns致敬,在當年的ILSVRC比賽裡其以Top-5錯誤率為6.67%的優異成績在分類項目中遙遙領先於同年提出的VGGNet,它的特點是控制了參數量和計算量的同時,獲得了非常好的分類性能。
Inception V1有22層深,比VGGNet的19層更深但參數更少,表達能力更強;
借鑑Network In Network的思想,去除了網絡最後一層全連接層,改為全局平均池化層,大大減少了參數量,加快訓練速度的同時也達到了減輕過擬合的作用;同樣借鑑了Network In Network的思想,精心設計了Inception module,多分支多尺度進行通道堆疊,提高了網絡對不同尺度的適應性;在訓練時,增加了輔助分類器(auxiliary classifier),將中間某一層的輸出用於分類,並按一個較少的權重(0.3)加到最終分類結果中,這樣在增加網絡反向傳播梯度信號的同時,也起到了正則化和輔助監督的作用。
![]()
其中,左邊是基本的Inception module,包含四個分支:第一個分支對輸入進行1x1的卷積,可以起到跨通道融合信息、提高網絡表達能力及升維和降維的作用;第二個分支則是一個普通的3x3卷積操作;第三個分支用了5x5的卷積操作;第四個分支用了一個3x3的最大池化操作。而右邊的模塊則是改進了的Inception module,其是在標準Inception module的基礎上,於3x3和5x5卷積分支前面和3x3的最大池化層分支後面添加1x1的卷積,目的均是用於降維和減少參數量,以較少的計算量代價達到了增加一層特徵變換和非線性化的目的。從以上Inception module的結構圖,我們可以看到,其每個分支採用的操作都是不一樣的,包含了較多的尺度變換,但最終都會將各分支的結果匯總到concat操作內進行通道堆疊,因此,必須保證各分支的輸出feature map寬和高一致,通常是各分支採用相同的stride並且以same padding的方式進行操作。《Batch Normalization: Accelerating Deep Network Training byReducing Internal Covariate Shift》
https://arxiv.org/pdf/1502.03167.pdf《Rethinking the Inception Architecture for Computer Vision》https://arxiv.org/pdf/1512.00567.pdfhttps://github.com/tensorflow/models/blob/master/research/slim/nets/inception_v2.pyInception V2與Inception V3一同提出,有的人認為單獨提出Batch Normalization思想的應該叫BN-Inception,但很多書籍都把他們一起合稱為Inception V2,其主要是借鑑了VGGNet,用兩個3x3的卷積代替5x5的大卷積,Inception module改進為如下圖所示:
![]()
該結構比前代可以降低參數量並減輕過擬合。Inception V2更為著名的是提出了Batch Normalization(簡稱BN,其運行公式如下圖)。
![]()
BN主要是在訓練時對每一批次的每一通道都進行歸一化操作,學習mean和variance兩個參數,確保數據分布為N(0,1)正態分布,使得模型不需要頻繁的學習適應每一層的數據變化,從而可以在大學習率的情況下,加快訓練速度和收斂速度。
除此之外,Inception V2去除了局部響應歸一化LPR(Local Response Normalization),去除了淺層的輔助監督分類器,只保留了中層的輔助監督分類器,並且各Inception module之間取消了pooling層的銜接,更多的用stride為2來進行下採樣,部分Inception module則改為使用average pooling。Inception V2在訓練中則去除了Dropout和減輕L2正則(主要是BN已起到正則化的作用),減少數據增強儘量保有數據原貌,但對數據更徹底的進行洗牌打亂,儘可能發揮BN的功能作用。
通過以上方式的改進,在同等Acc情況下Inception V2比Inception V1訓練快了約14倍,並且取得了不凡的成效,Inception V2在ILSVRC分類項目中取得了4.8%的top-5錯誤率。
《Rethinking the Inception Architecture for Computer Vision》https://arxiv.org/pdf/1512.00567.pdfhttps://github.com/tensorflow/models/blob/master/research/slim/nets/inception_v3.py
Inception V3比Inception V2更加激進,它不是將一個大的卷積拆分為幾個小的二維卷積(5x5拆分為兩個3x3),而是直接引入了Factorization into small convolution的思想,即將一個較大的二維卷積拆分為兩個較小的一維卷積,比如將3x3拆分為1x3卷積和3x1卷積,如下圖所示:
![]()
從兩維卷積到一維卷積,一方面減少了參數量,起到加速訓練測試速度和減輕過擬合的作用,另一方面可增加多一個非線性激活層,起到擴展非線性變換的作用。作者在論文裡有指出,這種非對稱拆分卷積結構,可以讓模型學習到更多更豐富的空間特徵,增加模型特徵多樣性,其效果更加突出!
除此之外,Inception V3優化了Inception module結構,提出了如下兩種新的Inception module:
![]()
![]()
這些Inception module只在網絡的後半部出現,淺層還是使用了普通的卷基層,確保網絡可以有效提取更多的特徵。Inception V3與Inception V2在同一篇論文裡提出,它們的網絡結構和訓練方法還是有不少相同之處的,感興趣的朋友可以詳細研究官方的實現代碼來比較差異。
《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》
https://arxiv.org/pdf/1602.07261.pdfhttps://github.com/tensorflow/models/blob/master/research/slim/nets/inception_v4.pyhttps://github.com/tensorflow/models/blob/master/research/slim/nets/inception_resnet_v2.py
Inception V4、Inception_ResNet_V1及Inception_ResNet_V2在同一篇論文裡提出,Inception V4沿用了其前幾代的網絡設計思想但其網絡更加複雜,而後兩者則是結合了ResNet Residual Networks ,據說是為了與ResNet撕逼,為了證明Residual Networks只是加快了收斂速度,其中Inception_ResNet_V1就是用於與Inception V3進行比較的,但是Inception_ResNet_V1並沒有官方代碼。
Inception V4使用了更加複雜的Inception module,如下是其使用到的:
![]()
從中可以看到,Inception V4設計理念還是與其前幾代一脈相承的,網絡結構還是與V3一樣為三段式ABC,只是其在Inception module多分支裡的設計更加複雜了。
Inception_ResNet_V1主要用於與Inception V3進行比較,證明Residual Networks主要是加快了收斂速度,為了達到這一目的,作者們煞是苦心,在沿用前幾代設計思路的情況下精心設計了網絡結構,確保兩者的計算量、參數量和耗用內存儘可能相近,從而可以得出比較公正靠譜的結論,以下為Inception_ResNet_V1所使用到的網絡結構。
![]()
![]()
最終,Inception_ResNet_V1與Inception V3的比較結果如下表:
![]()
從上面表格可以看出,Inception_ResNet_V1與Inception V3的效果相差不大,符合了作者們的先前假設。
Inception_ResNet_V2的提出,主要是用來探索ResNet Residual Networks用於Inception module時所能帶來的性能提升,其Inception module複雜度與Inception V4是相當的,其所用的網絡結構如下:
![]()
作者們實驗發現,在Inception_ResNet的Resdual模塊輸出時如果採用scaling操作(0.1~0.3),可以讓訓練過程更加平穩,如下是scaling結構示意圖:
此外,在Inception_ResNet的Inception resnet module內在short cut連接前有採用了1x1的卷積,以確保卷積輸出後特徵圖的通道數與輸入特徵圖一致,方便進行short cut connect操作。
從2014年到2016年,google先後提出了Inception V1/V2/V3/V4等經典卷積神經網絡,在當年的ILSVRC比賽裡也取得了驚人成績,其中所提出的Inception module、BN及Factorization into small convolution等等思想依然綻放異彩,值得我們學習和借鑑,希望通過本文,我們都能夠掌握其中的設計思想!