Deep Residual Learning


  最近在做一個分類的任務,輸入為3通道車型圖片,輸出要求將這些圖片對車型進行分類,最后分類類別總共是30個。

  開始是試用了實驗室師姐的方法采用了VGGNet的模型對車型進行分類,據之前得實驗結果是訓練后最高能達到92%的正確率,在采用了ImageNet訓練過的DataLayer之后,可以達到97%的正確率,由於我沒有進行長時間的運行測試,運行了十幾個小時最高達到了92%的樣子。

  后來是嘗試使用Deep Residual Learning的ImageNet(以后簡稱ResNet)的實現方法,十幾個小時的訓練可以達到94%的正確率,由於ResNet-50的模型太大,沒有進行長時間的測試,不知道能否達到跟ImageNet最好結果差不多的效果。

  下面對ResNet的模型進行簡單的介紹。

  ResNet的原理如下:

  首先假設我們簡單的一層:輸入——>中間層——>輸出。那么假設中間層的函數為F(x),我們得到的結果就是F(x)。那么對於ResNet,我們假設我們要擬合的函數為H(x),我改變了一種方式,我將輸入跳過中間層,直接與輸出相連。如圖:(論文原圖)。

  即我們的F(x)是由這個公式得到的:F(x):=H(x)-x。也就是說,我們要擬合的函數是H(x)=F(x)+x。上述是一個簡單的例子,在實際過程中,這H(x)等式右邊的這兩個分量是可以加上參數的。最終的公式為:Ws還有一個目的就是調整x的緯數,也就是當輸入與輸出緯數不相同時,Ws要負責將二者的緯數變為相同。

  那么這樣做有什么好處?在之前的實驗中,研究者們發現,理論上來說,一個層數越多的神經網絡,那么它所能擬合的函數就越復雜,得出的錯誤率就應該越小,但是研究者們得出的結論卻並不是這樣。如圖:                                                                                  

 

  在20-Layer和56-Layer的比較中發現,56 -Layer無論是Training error還是Test error都明顯高於20-Layer,這與理論上的關系並不符合。這個問題叫做degradation problem。這個問題表示了不是所有的函數都是很容易去優化的。

  所以這個方法直接將x加到輸出端,在理論上來說,如果這個Identity項是最優的,那么旁邊的非線性層的參數應該全部為0,然后一層Identity Mapping就代表了最優函數,但是通常情況下,這個x不是最優的,但是通常情況下,如果Identity Mapping接近於最優函數,那么這一項可以很好的幫助優化。他對於更深層的網絡傳遞到后來的誤差就會越小。

  在我這次的實驗中,采用了ResNet-50的模型。整個模型可參考:http://ethereon.github.io/netscope/#/gist/db945b393d40bfa26006

  這里我拿出一個部分進行介紹:

  在這是第一個Res層,最上面是一個輸入層,緊接着一個MaxPooling。res2a_branch代表的是卷積層,BN代表的是BatchNormalization。在這里作者對Identity項也進行了一次卷積操作。這個卷積操作是1*1的卷積。在原文中,作者介紹了當輸入輸出緯數不同時,有兩種選擇:選擇A,如果緯數不同,那么多余的緯數采用zero-padding,這樣不會增加參數。選擇B,如果緯數不同,那么采用1*1卷積來將緯數保持平衡。

在這個模型中采用的是選擇B。

  當緯數相同的時候,輸入是直接接到輸出的,是沒有左邊這個模塊的。

  經過測試,在訓練相同時間(十余個小時)的情況下,VGG最高到92%,ResNet-50的TOP1為6%。

  全文參考Deep Residual Learning for Image Recognition,作者:Kaiming He Xiangyu Zhang Shaoqing Ren Jian Sun。

  附torch實現代碼https://github.com/KaimingHe/deep-residual-networks

 


免責聲明!

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



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