【面試基礎--分類網絡】inception系列(v1,v2,v3,v4)

     主要參考: https://www.cnblogs.com/yifdu25/p/8542740.html

1. inception v1

paper: Going Deeper with convolutions

(*) code:  https://github.com/loveplay1983/inception/blob/master/inception.py (keras) 現在這個版本用的很少了

     inception v1 最關鍵的就是inception模塊。

                                  

   這樣的結構主要有以下改進:

  1. 一層block就包含1x1卷積,3x3卷積,5x5卷積,3x3池化(使用這樣的尺寸不是必需的,可以根據需要進行調整)。這樣,網絡中每一層都能學習到“稀疏”(3x3、5x5)或“不稀疏”(1x1)的特徵,既增加了網絡的寬度,也增加了網絡對尺度的適應性;
  2. 通過deep concat在每個block後合成特徵,獲得非線性屬性

      雖然這樣提高了性能,但是網絡的計算量實在是太大了,因此GoogLeNet借鑑了Network-in-Network的思想,使用1x1的卷積覈實現降維操作,以此來減小網絡的參數量,如圖所示。

                                      

      參數量爲:1x1x192x64+1x1x192x96+1x1x192x16+3x3x96x128+5x5x16x32+1x1x192x32=163328

      如果不加1x1,輸入28x28x192,輸出28x28x416:1x1x192x64+3x3x192x128+5x5x192x32=387072

      由此可見,降低了weights,同時降低了dimension。將這個模塊的優點概括如下:

(1)實現了通道降維和增維,1x1卷積用於降維,減小參數量和feature map的維度;

(2)由於1x1只有一個參數,相當於對原始feature map做scale,且訓練效果較好;

(3)增加了網絡深度和寬度;

(4)同時使用了1x1,3x3,5x5,具有多尺度的特點

      另外,它爲了保證網絡收斂,構建了三個額外的loss;也可以將全連接層替換成gloabal average pooling。

 

2. inception v2

paper: Batch Normalization: Accelerating Deep Network Training b y Reducing Internal Covariate Shift

      其實inception v2主要做的改進就是加入了batch normalization,BN在CNN中是非常重要的一個概念,因而這邊一起回顧一下。它在網絡結構上其實也做了一些改動,我將其和inception v3一起介紹,這裏重點就將BN。

      主要解決的問題:Internal Covariate Shift

      機器學習中有一個經典假設,源空間和目標空間的數據分佈是一致的。Covariate Shift 是其中的一個分支:源空間和目標空間的條件概率是一致的,但邊緣概率不同。

      對於神經網絡的各層輸出,在經歷了層內操作之後,各層輸出分佈會與對應的輸入信號分佈不同,而且差異會隨網絡深度增大而增加了,但每一層所指的label仍然不變。

      動機:參考了白化操作

      在傳統的機器學習中,對圖像提取特徵之前,都會對圖像做白化操作,輸入數據變換成0均值,單位方差的正態分佈。

      對於深度網絡,每個隱藏層的輸出都是下一個隱藏層的輸入,因而均可做白化。

     在一個mini-batch中,BN算法如下:

                           

      其中,測試時,其使用的方差是方差的無偏估計。無偏估計是指估計量的數學期望等於被估計參數。

     下面是整個網絡中訓練時的算法,包括了訓練和測試的過程。

                          

      理解:

(1)歸一化作用:經過BN後,大部分激活值落入非線性函數的線性區,對應倒數遠離飽和區,防止梯度小時,加速訓練收斂過程。

(2)增加shift和scale:往非線性區移動,避免完全變爲線性,降低網絡性能,因而希望找一個線性和非線性的平衡點。

      優點:

(1)有效遏制了梯度爆炸和消失

(2)解決了ICS問題

      其他的優點包括訓練更快,可以有更大的學習率,權重更易初始化,支持更多的激活函數。

 3. inception v3

paper: Rethinking the Inception Architecture for Computer Vision

code: https://github.com/ColeMurray/keras-inception-v3-tutorial (keras)

解決的主要問題:

(1)減少特徵的表徵性瓶頸。直觀上來說,當卷積不會大幅度改變輸入維度時,神經網絡可能會執行地更好。過多地減少維度可能會造成信息的損失,這也稱爲「表徵性瓶頸」。

(2)使用更優秀的因子分解方法,卷積才能在計算複雜度上更加高效。

主要做法:

(1)分解卷積核尺寸:

分解成對稱小核:使用2個3x3的卷積代替梯度(特徵圖,下同)爲35x35中的5x5的卷積,這樣既可以獲得相同的視野(經過2個3x3卷積得到的特徵圖大小等於1個5x5卷積得到的特徵圖),還具有更少的參數,還間接增加了網絡的深度,如下圖。

                                                      

                                                                                         figure 5 

分解成不對稱小核:3x3的卷積核表現的不錯,那更小的卷積核是不是會更好呢?比如2x2。對此,v2在17x17的梯度中使用1*n和n*1這種非對稱的卷積來代替n*n的對稱卷積,既降低網絡的參數,又增加了網絡的深度(實驗證明,該結構放於網絡中部,取n=7,準確率更高),如下。

                                                            

                                                                                     figure 6 

模塊中的濾波器組被擴展(即變得更寬而不是更深)在梯度爲8x8時使用可以增加濾波器輸出的模塊(如下圖),以此來產生高維的稀疏特徵。 

                                                    

                                                                                 figure 7

(2)避免使用瓶頸層

       inception模塊之間特徵圖的縮小,主要有下面兩種方式:

                                                    

      右圖是先進行inception操作,再進行池化來下采樣,但是這樣參數量明顯多於左圖(比較方式同前文的降維後inception模塊),因此v2採用的是左圖的方式,即在不同的inception之間(35/17/8的梯度)採用池化來進行下采樣。

      但是,左圖這種操作會造成表達瓶頸問題,也就是說特徵圖的大小不應該出現急劇的衰減(只經過一層就驟降)。如果出現急劇縮減,將會丟失大量的信息,對模型的訓練造成困難。

    因而inceptionv3採用一種並行的降維結構,如下圖:

    

      具體來說,就是在35/17/8之間分別採用下面這兩種方式來實現特徵圖尺寸的縮小,如下圖:   

                                                                         

                                                               figure 5'   35/17之間的特徵圖尺寸減小  

                                                               

                                                             figure 6' 17/8之間的特徵圖尺寸縮小

      這樣就得到Inception v3的網絡結構,如表所示。

                                         

(3)使用額外的分類器

       訓練早期不推薦使用額外的分類器。額外的分類器可以將梯度有效傳遞回去,不會有梯度消失的問題,加快了訓練;中間層空間特徵比較豐富,利於提高模型判別力。

 

4. inception v4 

paper: Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

code: https://github.com/titu1994/Inception-v4

      由於殘差連接的優越性,這裏考慮將inception 和 殘差連接在一起。這篇文章介紹了三個網絡,inception v4無殘差,inceotion resnet v1/v2均加入了殘差連接。

      接下來對比一下三個網絡的區別:

整體架構:

                                  inception v4                                                        inception-resnet-v1/v2

                                        

stem 模塊:

                 inception v4/ inception- resnet -v2                                  inception-resnet-v1

                     

inception 模塊:

inception v4: 

                                           inception A                          inception B                                    inception C

          

 

inception resnet v1:

                        inception A                                     inception B                                             inception C

                       

 

inception-resnet-v2

                        inception A                                     inception B                                             inception C

                          

reduction 模塊:

reduction A:

 

reduction B:

           inception v4                                                 inception resnet v1                                             inception resnet v2

          

      幾點說明:

(1)參數量:Inception-ResNet v1 的計算成本和 Inception v3 的接近。Inception-ResNetv2 的計算成本和 Inception v4 的接近。它們有不同的 stem,正如 Inception v4 部分所展示的。

(2)inception-residual中 1x1卷積作用:爲了使殘差加運算可行,卷積之後的輸入和輸出必須有相同的維度。因此,我們在初始卷積之後使用 1x1 卷積來匹配深度(深度在卷積之後會增加)。

(3)reduction block: Inception v4 引入了專用的「縮減塊」(reduction block),它被用於改變網格的寬度和高度。

(4)如果卷積核的數量超過 1000,則網絡架構更深層的殘差單元將導致網絡崩潰。因此,爲了增加穩定性,作者通過 0.1 到 0.3 的比例縮放殘差激活值。

                                                                         

(5)研究發現 Inception-ResNet 模型可以在更少的 epoch 內達到更高的準確率,結合殘差連接可以顯著加速 Inception 的訓練。inception-resnet有v1和v2兩個版本,v2表現更好且更復雜。

 

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