卷積神經網絡之VGG

2014年,牛津大學計算機視覺組(Visual Geometry Group)和Google DeepMind公司的研究員一塊兒研發出了新的深度卷積神經網絡:VGGNet,並取得了ILSVRC2014比賽分類項目的第二名(第一名是GoogLeNet,也是同年提出的).論文下載 Very Deep Convolutional Networks for Large-Scale Image Recognition。論文主要針對卷積神經網絡的深度對大規模圖像集識別精度的影響,主要貢獻是使用很小的卷積核(\(3\times3\))構建各類深度的卷積神經網絡結構,並對這些網絡結構進行了評估,最終證實16-19層的網絡深度,可以取得較好的識別精度。 這也就是經常使用來提取圖像特徵的VGG-16和VGG-19。html

VGG能夠當作是加深版的AlexNet,整個網絡由卷積層和全鏈接層疊加而成,和AlexNet不一樣的是,VGG中使用的都是小尺寸的卷積核(\(3\times3\))。python

VGG的特色

  1. 結構簡潔,以下圖VGG-19的網絡結構

對比,前文介紹的AlexNet的網絡結構圖,是否是有種賞心悅目的感受。整個結構只有\(3\times3\)的卷積層,連續的卷積層後使用池化層隔開。雖然層數不少,可是很簡潔。網絡

  1. 小卷積核和連續的卷積層
    VGG中使用的都是\(3\times3\)卷積核,而且使用了連續多個卷積層。這樣作的好處:
    • 使用連續的的多個小卷積核(\(3\times3\)),來代替一個大的卷積核(例如(\(5\times5\))。
      使用小的卷積核的問題是,其感覺野必然變小。因此,VGG中就使用連續的\(3\times3\)卷積核,來增大感覺野。VGG認爲2個連續的\(3\times3\)卷積核可以替代一個\(5\times5\)卷積核,三個連續的\(3\times3\)可以代替一個\(7\times7\)
    • 小卷積核的參數較少。3個\(3\times3\)的卷積核參數爲\(3 \times 3 \times = 27\),而一個\(7\times7\)的卷積核參數爲\(7\times7 = 49\)
    • 因爲每一個卷積層都有一個非線性的激活函數,多個卷積層增長了非線性映射。
  2. 小池化核,使用的是\(2\times 2\)
  3. 通道數更多,特徵度更寬
    每一個通道表明着一個FeatureMap,更多的通道數表示更豐富的圖像特徵。VGG網絡第一層的通道數爲64,後面每層都進行了翻倍,最多到512個通道,通道數的增長,使得更多的信息能夠被提取出來。
  4. 層數更深
    使用連續的小卷積核代替大的卷積核,網絡的深度更深,而且對邊緣進行填充,卷積的過程並不會下降圖像尺寸。僅使用小的池化單元,下降圖像的尺寸。
  5. 全鏈接轉卷積(測試階段)
    這也是VGG的一個特色,在網絡測試階段將訓練階段的三個全鏈接替換爲三個卷積,使得測試獲得的全卷積網絡由於沒有全鏈接的限制,於是能夠接收任意寬或高爲的輸入,這在測試階段很重要。
    如本節第一個圖所示,輸入圖像是224x224x3,若是後面三個層都是全鏈接,那麼在測試階段就只能將測試的圖像所有都要縮放大小到224x224x3,才能符合後面全鏈接層的輸入數量要求,這樣就不便於測試工做的開展。
    全鏈接轉卷積的替換過程以下:

例如\(7 \times 7 \times 512\)的層要跟4096個神經元的層作全鏈接,則替換爲對\(7 \times 7 \times 512\)的層做通道數爲409六、卷積核爲\(1 \times 1\)卷積。
這個「全鏈接轉卷積」的思路是VGG做者參考了OverFeat的工做思路,例以下圖是OverFeat將全鏈接換成卷積後,則能夠來處理任意分辨率(在整張圖)上計算卷積,這就是無需對原圖作從新縮放處理的優點。
架構

VGG網絡結構

VGG網絡相比AlexNet層數多了很多,可是其結構卻簡單很多。函數

  • VGG的輸入爲\(224 \times 224 \times 3\)的圖像
  • 對圖像作均值預處理,每一個像素中減去在訓練集上計算的RGB均值。
  • 網絡使用連續的小卷積核(\(3 \times 3\))作連續卷積,卷積的固定步長爲1,並在圖像的邊緣填充1個像素,這樣卷積後保持圖像的分辨率不變。
  • 連續的卷積層會接着一個池化層,下降圖像的分辨率。空間池化由五個最大池化層進行,這些層在一些卷積層以後(不是全部的卷積層以後都是最大池化)。在2×2像素窗口上進行最大池化,步長爲2。
  • 卷積層後,接着的是3個全鏈接層,前兩個每一個都有4096個通道,第三是輸出層輸出1000個分類。
  • 全部的隱藏層的激活函數都使用的是ReLU
  • 使用\(1\times1\)的卷積核,爲了添加非線性激活函數的個數,並且不影響卷積層的感覺野。
  • 沒有使用局部歸一化,做者發現局部歸一化並不能提升網絡的性能。

VGG論文主要是研究網絡的深度對其分類精度的影響,因此按照上面的描述設計規則,做者實驗的了不一樣深度的網絡結構
性能

全部網絡結構都聽從上面提到的設計規則,而且僅是深度不一樣,也就是卷積層的個數不一樣:從網絡A中的11個加權層(8個卷積層和3個FC層)到網絡E中的19個加權層(16個卷積層和3個FC層)。卷積層的寬度(通道數)至關小,從第一層中的64開始,而後在每一個最大池化層以後增長2倍,直到達到512。
上圖給出了各個深度的卷積層使用的卷積核大小以及通道的個數。最後的D,E網絡就是大名鼎鼎的VGG-16和VGG-19了。
AlexNet僅僅只有8層,其可訓練的參數就達到了60M,VGG系列的參數就更恐怖了,以下圖(單位是百萬)
學習

因爲參數大多數集中在後面三個全鏈接層,因此雖然網絡的深度不一樣,全鏈接層確實相同的,其參數區別倒不是特別的大。測試

VGG訓練與測試

論文首先將訓練圖像縮放到最小邊長度的方形,設縮放後的訓練圖像的尺寸爲\(S \times S\)。網絡訓練時對訓練圖像進行隨機裁剪,裁剪尺寸爲網絡的輸入尺寸\(224 \times 224\)。若是\(S =224\),則輸入網絡的圖像就是整個訓練圖像;若是\(S > 224\),則隨機裁剪訓練圖像包含目標的部分。ui

對於訓練集圖像的尺寸設置,論文中使用了兩種方法:es5

  • 固定尺寸訓練,設置\(S = 256\)\(S = 384\)
  • 多尺度訓練,每一個訓練圖像從必定範圍內\([S_{min},S_{max}],(S_{min}=256,S_{max}=512)\)進行隨機採樣。因爲圖像中的目標可能具備不一樣的大小,所以在訓練期間考慮到這一點是有益的。這也能夠看做是經過尺度抖動進行訓練集加強,其中單個模型被訓練在必定尺度範圍內識別對象。

網絡性能評估

  • 單尺度評估,測試圖像固定尺度。結果以下表

    經過評估結果,能夠看出:
    • 局部歸一化(A-LRN)網絡,對網絡A的結果並無很大的提高。
    • 網絡的性能隨着網絡的加深而提升。應該注意到B,C,D這個網絡的性能。C網絡好於B網絡,說明額外添加的非線性激活函數,確實是有好處的;可是,D網絡好於C網絡,這說明也可使用非平凡的感覺野( non-trivial receptive fields)來捕獲更多的信息更有用。
    • 當網絡層數達到19層時,使用VGG架構的錯誤率就再也不隨着層數加深而提升了。更深的網絡應該須要更多的數據集。
    • 論文還將網絡B與具備5×5卷積層的淺層網絡進行了比較,淺層網絡能夠經過用單個5×5卷積層替換B中每對3×3卷積層獲得。測量的淺層網絡top-1錯誤率比網絡B的top-1錯誤率(在中心裁剪圖像上)高7%,這證明了具備小濾波器的深層網絡優於具備較大濾波器的淺層網絡
    • 訓練時的尺寸抖動(訓練圖像大小\(S \in [256,512]\))獲得的結果好於固定尺寸,這證明了經過尺度抖動進行的訓練集加強確實有助於捕獲多尺度圖像統計。
  • 多尺度評估,測試圖像的尺度抖動對性能的影響
    對同一張測試圖像,將其縮放到不一樣的尺寸進行測試,而後取這幾個測試結果的平均值,做爲最終的結果(有點像集成學習,所不一樣的是,這裏是測試圖像的尺寸不一樣)。使用了三種尺寸的測試圖像:\(Q\)表示測試圖像,\(S\)表示訓練是圖像尺寸:\(Q = S - 32\)\(Q = S + 32\),前面兩種是針對訓練圖像是固定大小的,對於訓練時圖像尺寸在必定範圍內抖動的,則可使用更大的測試圖像尺寸。\(Q = \{S_{min},0.5(S_{min} + S_{max}),S_{max}\}\).
    評估結果以下:

    評估結果代表,訓練圖像尺度抖動優於使用固定最小邊S

  • 稠密和多裁剪圖像評估
    Dense(密集評估),即指全鏈接層替換爲卷積層(第一FC層轉換到7×7卷積層,最後兩個FC層轉換到1×1卷積層),最後得出一個預測的score map,再對結果求平均。
    multi-crop,即對圖像進行多樣本的隨機裁剪,將獲得多張裁剪獲得的圖像輸入到網絡中,最終對全部結果平均

    從上圖能夠看出,多裁剪的結果是好於密集估計的。並且這兩種方法確實是互補的,由於它們的組合優於其中的每一種。
    因爲不一樣的卷積邊界條件,多裁剪圖像評估是密集評估的補充:當將ConvNet應用於裁剪圖像時,卷積特徵圖用零填充,而在密集評估的狀況下,相同裁剪圖像的填充天然會來自於圖像的相鄰部分(因爲卷積和空間池化),這大大增長了整個網絡的感覺野,所以捕獲了更多的圖像內容信息。

評估結論

  • 在訓練時,可使用多尺度抖動的訓練圖像,其精度好於固定尺寸的訓練集。
  • 測試時,使用多裁剪和密集評估(卷積層替換全鏈接層)像結合的方法

Keras實現

依照VGG的設計原則,只使用小尺寸的\(3\times3\)卷積核以及\(2 \times 2\)的池化單元,實現一個小型的網絡模型。

class MiniVGGNet:
    @staticmethod
    def build(width,height,depth,classes):
        
        model = Sequential()
        inputShape = (height,width,depth)
        chanDim = -1

        if K.image_data_format() == "channels_first":
            inputShape = (depth,height,width)
            chanDim = 1
        
        model.add(Conv2D(32,(3,3),padding="same",input_shape=inputShape))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))
        
        model.add(Conv2D(32,(3,3),padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))

        model.add(MaxPooling2D(pool_size=(2,2)))
        model.add(Dropout(0.25))

        model.add(Conv2D(64,(3,3),padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))

        model.add(Conv2D(64,(3,3),padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))

        model.add(MaxPooling2D(pool_size=(2,2)))
        model.add(Dropout(0.25))

        model.add(Flatten())
        model.add(Dense(512))
        model.add(Activation("relu"))
        model.add(BatchNormalization())
        model.add(Dropout(0.25))

        model.add(Dense(classes))
        model.add(Activation("softmax"))

        return model

最終輸出10分類,應用於CIFAR10,表現以下:

相關文章
相關標籤/搜索