1. 程式人生 > >VGG學習筆記-Very Deep Convolutional Networks for Large-Scale Image Recognition

VGG學習筆記-Very Deep Convolutional Networks for Large-Scale Image Recognition

主要是針對論文,進行了自我解讀,抽絲而成,請大家多多指教。             

摘要

       在這項工作中,主要研究卷積網路Convolutional networks (ConvNets)深度在大規模的影象識別環境下對準確性的影響。主要貢獻是使用非常小的(3×3)卷積濾波器架構對網路深度的增加進行了全面評估,這表明通過將深度推到16-19加權層可以實現對現有技術配置的顯著改進,在定位和分類過程中分別獲得了第一名和第二名,對於其他資料集泛化的很好,在其它資料集上取得了最好的結果。

1、引言

     卷積網路(ConvNets)近來在大規模影象和視訊識別方面取得了巨大成功,原因1有開源ImageNet和高效能運算系統的出現,例如GPU或大規模分散式叢集,原因2方法上從高緯淺層features encoding到深層的ConvNets。

     隨著ConvNets在計算機視覺領域越來越商品化,為了達到更好的準確性,很多人嘗試改進改進Krizhevsky等人(2012)最初的架構。從兩方面改進,1更小filter尺寸,在第一層卷積上更小的stride;2在整個影象和多個尺度上對網路進行密集地訓練和測試。

      該論文是在深度上下功夫。固定其他超引數,不斷增加層數,技巧:3×3filters。

 2.1 通用結構:

  •          input: 224×224 RGB
  •          預處理:從每個畫素中減去在訓練集上計算的RGB均值。
  •          Conv filter: 3×3,1×1(只在C中使用,可以看作輸入通道的線性變換(後面是非線性))
  •           stride:1
  •           padding: same,1,for 3×3
  •           pooling:5 max_pool (並非所有的conv後面都有),2×2 ,stride=2

          通用結構,多個conv層加3個FC層(2層4096+ 1層1000,然後 soft-max),所有隱藏層都配備了修正(ReLU(Krizhevsky等,2012))非線性。沒有使用區域性響應規劃化LRN(只有A-LRN使用),不使用的原因1是沒有幫忙改進效果,2是正價記憶體佔用和計算時間,在應用的地方,LRN層的引數是(Krizhevsky等,2012)的引數。

2.2配置

                      http://upload-images.jianshu.io/upload_images/3232548-bcc2ded7859ee146.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

                                                                                       圖1 不同VGG網路的結構

                                         

                                                                                   圖2 VGG-16的結構

                                Table 2

                                                                                  表1 引數數量(百萬級別)

        表1 表明,儘管深度很大,網路中權重數量並不大於具有更大卷積層寬度和感受野的較淺網路中的權重數量(144M的權重在(Sermanet等人,2014)中)

2.3 討論

       之前的競賽模型:11×11strides4 ,7×7strides2,VGG模型filters 3×3 strides1.很容易看到兩個3×3卷積層堆疊(沒有空間池化)有5×5的有效感受野;三個3×3卷積層堆疊具有7×7的有效感受野。意義呢? 在於1:2-3層relu,比單個relu,有更強的分辨能力;在於2:減少引數數量:1個7×7conv:7×7*C**2,3個3×3conv:3×3×3conv。少了80%。(這可以看作是對7×7卷積濾波器進行正則化,迫使它們通過3×3濾波器(在它們之間注入非線性)進行分解。)

      1×1conv層,維持input output維數不變,簡單線性計算,增加非線性出來(relu)。

      對此前人成果:Ciresan等人(2011)以前使用小尺寸的卷積濾波器,沒有在大規模的ILSVRC資料集上進行評估,Goodfellow等人(2014),街道號識別任務中採用深層ConvNets(11個權重層),顯示出增加的深度導致了更好的效能,GooLeNet(Szegedy等,2014),ILSVRC-2014分類任務的表現最好的專案,是獨立於我們工作之外的開發的,但是類似的是它是基於非常深的ConvNets(22個權重層)和小卷積濾波器(除了3×3,它們也使用了1×1和5×5卷積),它們的網路拓撲結構比我們的更復雜,並且在第一層中特徵圖的空間解析度被更積極地減少,以減少計算量。本模型:在單網路分類精度方面勝過Szegedy等人(the single-network classification accuracy更好)

3、1  如何訓練

     S = 訓練尺度  Q = 測試尺度(雖然裁剪尺寸固定為224×224,但原則上S可以是不小於224的任何值)不論256還是384,還是隨機的S,都必須crop成224×224,這樣才有統一的input shape。

  •      站在AlexNet肩膀上(只是沒有做圖片的cropping)
  •      loss:最優化multinomial logistic regression
  •      mini -batch fradientdescent:bp+momentum,batch_size:256,momentum:0.9,weight decay:L2=5e-4
  •      dropout:前2個FC rate :0.5
  •       learning_rate:設定為10e-2,當validetion loss 不下降時手動將learning_rate下降e-1,總共訓練了74個poches,下調了learning 3次。
  •      對比AlexNet,該模型能更快找到最低loss,在於1:深度+小filter===間接regularization ,在於2對某些層做了預初始化處理。

     weights的初始化的意義:影響反向傳遞的穩定性。如何確保良好的weights初始值?給予A模型隨機weights,訓練A模型,從而獲取訓練好的conv,FC的weights,給更深的模型使用,其他層的weights使用randdom weights(mean =0,var=0.01),bias =0。learning_rate從原始初始化值開始。值得注意的是,在提交論文之後,我們發現可以通過使用Glorot&Bengio(2010)的隨機初始化程式來初始化權重而不進行預訓練。

    圖片處理,input layer:壓縮,修剪到224×224,cpu計算(在迴圈訓練中進行),水平翻轉和RGB演的shift:依然保持識別的能力。下面解釋訓練影象歸一化。

      如何修剪原始圖片:crop_size:224×224,s=teainubf scale =最小邊,s==224.以此為修剪成為224×224就可以,s>>224,任意擷取一小部分圖片。那麼如何設定s?方法1單尺度訓練:對同一個模型,首先s固定為兩個值,256,384,對於s=256,處理,先訓練,獲取weights,s=384,使用上面的weights,learning_rate變小10倍(我們使用較小的初始學習率10e-3)。方法2:s取件[256,512]隨機取值,對原圖做scale,可看做data augmentation,增加樣本,訓練效果是一個模型對於不同scale圖片具備一致的預測能力,為了加速訓練,先訓練好s=384的模型,提取引數作為初始引數,再開始訓練。

3、2  如何測試

      測試圖片:Q!=S,only rescale not crop,測試模型:1st FC變成7×7卷積,2nd,3rd FC變成1×1卷積,fully-conv net :輸入是whole uncroped images,水平翻轉(增加樣本),輸出是3d tensor,通道是num_classes,w和h使用sum-pooled處理,輸出a vector of class scores,原圖的class score :原圖score和水平翻轉圖score的平均值。

    因為測試沒有做croping,速度更快,使用croping,預測精度更好(基於細緻的修剪圖片抽樣,同時需要坐padding,從而幫助抓住更多的圖片context),但修剪導致正價的時間成本vs產生的預測精度不划算。

3.3 實現細節

     模型編寫:c++caffe,大量modification

     能做到:使用多GPU,能接收全尺寸,無修剪,不同scale,mini-batch分GPU做反向傳遞,再收集取均值。gradient計算與但GPU計算無差異。4GPU,提速3.75倍,耗時2-3周

3.4 分類實驗

    資料集:1000 class,train130w張,valid5w,test10w

    measures評估指標:top1 error (錯誤預測佔比,預測錯誤圖片/總的圖片),top5 error(正確class超出前5預測class範圍的佔比,正確預測超過前5分數的總數/總數)

    實驗時,用validation set 作為測試集使用。

4.1 單一scale評估

   選取單一確定的Q值:方法1 Q=S,方法2 Q=0.5(Smin+Smax),在A-LRN模型中,LRN無效,所以後面模型就不採用了。

               Table 3

                                                                      表2:在單測試尺度的ConvNet效能

       觀察現象:1.越深,分類錯誤率越低。2.增加1×1conv效果更好,因為增加了non-linearity。3.3×3conv比1×1conv效果好,能抓住更多spatial context。4.到19層後,error rate saturate(無法進一步下降),相信更深模型+更大資料,可以下降。5,對比B和由B變形的寬淺模型B*,B的一對3×3conv兌換一個5×5conv放入B*,B*的conv深度只有B的一半,B精度高出7%,深且小的conv要優於淺且寬的conv模型。6、對原圖做浮動S處理,訓練處的模型,優於只做單一s值處理的訓練出來的模型,當然,測試時只用一個固定的Q值。

4.2 多 scale 評估

      用不同的scale處理後的圖片一起來測試模型。如果模型只被單一S處理的訓練,Q只選擇3個值,相差32,如果模型是被多S值圖片訓練而成:Q也是三個值,但區間很大[Smin,ave(Smin,Smax),Smax],實驗顯示多個S值處理樣本時,表現更優。

                   Table 4

        表3:ConvNet評估技術比較。在所有的實驗中訓練尺度S從[256;512]取樣,三個測試適度Q考慮:{256, 384, 512}。

4.3 多 srop 評估

    對資料樣本做多cropping處理後讓模型evaluate:

    combination樣本下的模型error < multi-crop樣本下的模型error < 只是scale樣本下模型error。

4.4convNet fusion

        將多個模型組合在一起使用,將多個模型的softmax output相加再取平均值,作為混合模型的output。上交結果後的模型都被多s處理的樣本所訓練,其表現更加好,由於上交的模型(值被單一s處理的樣本訓練)。

      http://upload-images.jianshu.io/upload_images/3232548-396bedeb565e428c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

                                                                     表4:多個卷積網路融合結果

 參考內容: