VGG Net學習筆記

1、簡介算法

       VGG Net由牛津大學的視覺幾何組(Visual Geometry Group)和 Google DeepMind公司的研究員一塊兒研發的的深度卷積神經網絡,在 ILSVRC 2014 上取得了第二名的成績,將 Top-5錯誤率降到7.3%。它主要的貢獻是展現出網絡的深度(depth)是算法優良性能的關鍵部分。目前使用比較多的網絡結構主要有ResNet(152-1000層),GooleNet(22層),VGGNet(19層),大多數模型都是基於這幾個模型上改進,採用新的優化算法,多模型融合等。到目前爲止,VGG Net 依然常常被用來提取圖像特徵。網絡

2、VGG Net的結構ide

  

                  圖1:VGG16結構圖函數

  輸入是大小爲224*224的RGB圖像,預處理(preprocession)時計算出三個通道的平均值,在每一個像素上減去平均值(處理後迭代更少,更快收斂)。性能

  圖像通過一系列卷積層處理,在卷積層中使用了很是小的3*3卷積核,在有些卷積層裏則使用了1*1的卷積核。測試

  卷積層步長(stride)設置爲1個像素,3*3卷積層的填充(padding)設置爲1個像素。池化層採用max pooling,共有5層,在一部分卷積層後,max-pooling的窗口是2*2,步長設置爲2。優化

  卷積層以後是三個全鏈接層(fully-connected layers,FC)。前兩個全鏈接層均有4096個通道,第三個全鏈接層有1000個通道,用來分類。全部網絡的全鏈接層配置相同。spa

  全鏈接層後是Softmax,用來分類。3d

  全部隱藏層(每一個conv層中間)都使用ReLU做爲激活函數。VGGNet不使用局部響應標準化(LRN),這種標準化並不能在ILSVRC數據集上提高性能,卻致使更多的內存消耗和計算時間(LRN:Local Response Normalization,局部響應歸一化,用於加強網絡的泛化能力)。orm

3、討論

  

  一、選擇採用3*3的卷積核是由於3*3是最小的可以捕捉像素8鄰域信息的的尺寸。

  二、使用1*1的卷積核目的是在不影響輸入輸出的維度狀況下,對輸入進行形變,再經過ReLU進行非線性處理,提升決策函數的非線性。

  三、2個3*3卷積堆疊等於1個5*5卷積,3個3*3堆疊等於1個7*7卷積,感覺野大小不變,而採用更多層、更小的卷積核能夠引入更多非線性(更多的隱藏層,從而帶來更多非線性函數),提升決策函數判決力,而且帶來更少參數。

  四、每一個VGG網絡都有3個FC層,5個池化層,1個softmax層。

  五、在FC層中間採用dropout層,防止過擬合,以下圖:

  

  左邊的圖爲一個徹底的全鏈接層,右邊爲應用dropout後的全鏈接層。

  咱們知道,典型的神經網絡其訓練流程是將輸入經過網絡進行正向傳導,而後將偏差進行反向傳播。dropout就是針對這一過程之中,隨機地刪除隱藏層的部分單元,進行上述過程。步驟爲:

  (1)、隨機刪除網絡中的一些隱藏神經元,保持輸入輸出神經元不變;

  (2)、將輸入經過修改後的網絡進行前向傳播,而後將偏差經過修改後的網絡進行反向傳播;

  (3)、對於另一批的訓練樣本,重複上述操做(1)。

  dropout能夠有效防止過擬合,緣由是:

  (1)、達到了一種vote的做用。對於單個神經網絡而言,將其進行分批,即便不一樣的訓練集可能會產生不一樣程度的過擬合,可是咱們若是將其公用一個損失函數,至關於對其同時進行了優化,取了平均,所以能夠較爲有效地防止過擬合的發生。

  (2)、減小神經元之間複雜的共適應性。當隱藏層神經元被隨機刪除以後,使得全鏈接網絡具備了必定的稀疏化,從而有效地減輕了不一樣特徵的協同效應。也就是說,有些特徵可能會依賴於固定關係的隱含節點的共同做用,而經過dropout的話,就有效地組織了某些特徵在其餘特徵存在下才有效果的狀況,增長了神經網絡的魯棒性。

  六、現在用得最多的是VGG16(13層conv + 3層FC)和VGG19(16層conv + 3層FC),注意算層數時不算maxpool層和softmax層,只算conv層和fc層。

3、訓練

  訓練採用多尺度訓練(Multi-scale),將原始圖像縮放到不一樣尺寸 S,而後再隨機裁切224*224的圖片,而且對圖片進行水平翻轉和隨機RGB色差調整,這樣能增長不少數據量,對於防止模型過擬合有很不錯的效果。

  初始對原始圖片進行裁剪時,原始圖片的最小邊不宜太小,這樣的話,裁剪到224*224的時候,就至關於幾乎覆蓋了整個圖片,這樣對原始圖片進行不一樣的隨機裁剪獲得的圖片就基本上沒差異,就失去了增長數據集的意義,但同時也不宜過大,這樣的話,裁剪到的圖片只含有目標的一小部分,也不是很好。

  針對上述裁剪的問題,提出的兩種解決辦法: 

  (1) 、固定最小邊的尺寸爲256;

  (2) 、隨機從[256,512]的肯定範圍內進行抽樣,這樣原始圖片尺寸不一,有利於訓練,這個方法叫作尺度抖動(scale jittering),有利於訓練集加強。

4、測試

  將全鏈接層等效替換爲卷積層進行測試,緣由是:

  卷積層和全鏈接層的惟一區別就是卷積層的神經元和輸入是局部聯繫的,而且同一個通道(channel)內的不一樣神經元共享權值(weight)。卷積層和全鏈接層的計算實際上相同,所以能夠將全鏈接層轉換爲卷積層,只要將卷積核大小設置爲輸入空間大小便可:例如輸入爲7*7*512,第一層全鏈接層輸出4096;咱們能夠將其看做卷積核大小爲7*7,步長爲1,沒有填充,輸出爲1*1*4096的卷積層。這樣的好處在於輸入圖像的大小再也不受限制,所以能夠高效地對圖像做滑動窗式預測;並且全鏈接層的計算量比較大,等效卷積層的計算量減少了,這樣既達到了目的又十分高效。

5、問題

  一、雖然 VGGNet 減小了卷積層參數,但實際上其參數空間比 AlexNet 大,其中絕大多數的參數都是來自於第一個全鏈接層,耗費更多計算資源。在隨後的 NIN 中發現將這些全鏈接層替換爲全局平均池化,對於性能影響不大,同時顯著下降了參數數量。

  二、採用 Pre-trained 方法訓練的 VGG model(主要是 D 和 E),相對其餘的方法參數空間很大,因此訓練一個 VGG 模型一般要花費更長的時間,所幸有公開的 Pre-trained model 讓咱們很方便的使用。

 

參考來源:Very Deep Convolutional Networks for Large-scale Image Recognition

相關文章
相關標籤/搜索