Very Deep Convolutional Networks for Large-Scale Image Recognition-VGGNet解讀
作者:HYH
日期:2020-9-10
論文期刊:ICLR2015
標籤:VGG
論文:《Very Deep Convolutional Networks for Large-Scale Image Recognition》
一、簡介:
-
2014年,牛津大學計算機視覺組(Visual Geometry Group)和Google DeepMind公司的研究員一起研發出了一種新的深度卷積神經網路:VGGNet,並取得了ILSVRC2014比賽分類專案的第二名(第一名是GoogLeNet,也是同年提出的)。
-
VGGNet的產生主要源於2012年AlexNet將深度學習的方法應用到ImageNet的影象分類比賽中並取得了驚人的效果後,大家都競相效仿並在此基礎上做了大量嘗試和改進,例如,在卷積層使用更小的卷積核以及更小的步長(Zeiler&Fergus,2013; Sermanet,2014),又或者在整個影象和多個尺度上密集地訓練和測試網路(Sermanet,2014:Howard,2014)。但這些優化中作者覺得都沒有談到網路深度的工作,因此受到啟發,不僅將上面的兩種方法應用到自己的網路設計和訓練測試階段,同時想再試試深度對結果的影響。
-
因此VGGNet主要探索了卷積神經網路的深度與其效能之間的關係,併成功地構築了16~19層深的卷積神經網路,證明了增加網路的深度能夠在一定程度上影響網路最終的效能,使錯誤率大幅下降。所以到目前為止,VGG仍然被用來提取影象特徵。換句話說,VGGNet可以看成是加深版本的AlexNet,都是由卷積層、全連線層兩大部分構成。
-
他們最好的網路包含了13個卷積層和3個全連線層(VGG16),網路的結構非常一致,從頭到尾全部使用的是3x3的卷積核和2x2的池化核(Alexnet中使用的是3x3池化核)。他們的預訓練模型是可以在網路上獲得並在Caffe中使用。 VGGNet不好的一點是它耗費更多計算資源,並且使用了更多的引數,導致更多的記憶體佔用(140M)。其中絕大多數的引數都是來自於第一個全連線層。作者後來發現這些全連線層即使被去除,對於效能也沒有什麼影響,而且還可以使輸入的圖片尺寸不受限制,因此在後面的測試階段將這三個全連線層轉化成了卷積層使用。因此目前使用比較多的深層網路結構主要有ResNet(152-1000層),GooleNet(22層),VGGNet(19層)。而後面大多數模型都是基於這幾個模型進行改進,採用新的優化演算法,多模型融合等。
主要貢獻: 最重要的就是討論了在大規模影象識別中,神經網路深度對於其準確率的影響。
二、VGG的網路配置
因為論文主要討論的是網路結構的深度,所以一開始先給出了多種不同深度的網路,分別稱為為A-E網路,從11-19層,其中D和E被稱為VGG16和VGG19。各網路結構配置如下:
在這篇論文中分別使用了A、A-LRN、B、C、D、E這6種網路結構進行測試,這6種網路結構相似,都是由5層卷積層、3層全連線層組成,其中區別在於每個卷積層的子層數量不同,從A至E依次增加(子層數量從1到4),總的網路深度從11層到19層(新增的層以粗體顯示),表格中的卷積層引數表示為“conv⟨感受野大小⟩-通道數⟩”,例如con3-128,表示使用3x3的卷積核,通道數為128。為了簡潔起見,在表格中不顯示ReLU啟用功能。
基本瞭解了VGG的網路配置之後,可以提煉出一些VGG的特點:
1.小卷積核與多卷積子層
一般說到網路深度,就不得不提到卷積,雖然AlexNet有使用11x11和5x5的大卷積核,但大多數還是3x3卷積核,對於使用stride=4的11x11的大卷積核,原因在於一開始原圖的尺寸很大,最為原始的紋理、顏色等細節的特徵變化用大卷積核儘早捕捉到,後面到了更深的層數害怕會丟失掉較大區域性範圍內的特徵相關性,就轉為使用更多3x3的小卷積核(和一個5x5卷積)去捕捉細節變化(GoogleNet後面也有應用)。
而VGG雖然是在模仿AlexNet的網路結構,但它沒有采用AlexNet中比較大的卷積核尺寸(如7x7),而是通過降低卷積核的大小(3x3),增加捲積層的子層數來達到同樣的效能,因此自始自終使用3x3的小卷積核是VGG的一個重要特點。
問題:為什麼要用多個3x3的卷積核代替5x5卷積核甚至是7x7卷積核呢?
這裡作者主要說了兩個原因:一是降低計算量,他認為兩個3x3的卷積堆疊獲得的感受野大小,相當一個5x5的卷積;而3個3x3卷積的堆疊獲取到的感受野相當於一個7x7的卷積。以7x7為例,引數數量就從7x7=49降到了3x(3x3)=27.二是因為卷積後都伴有RELU啟用函式,因此更多的卷積核/層就意味著可以進行更多的非線性對映,可以增加網路的擬合/表達能力,使決策函式(softmax)更具有判別力。
2.特徵圖的通道數隨著層數的加深而增加
首先來看一下VGG16的立體網路結構圖:
VGG16處理過程如下:
1、輸入224x224x3的圖片,經64個3x3的卷積核做兩次卷積+ReLU,卷積後的尺寸變為224x224x64。
2、作max pooling(最大池化),池化單元尺寸為2x2,步長為2(效果為影象尺寸減半),池化後的尺寸變為112x112x64。
3、經128個3x3的卷積核做兩次卷積+ReLU,尺寸變為112x112x128。
4、作2x2的max pooling池化,尺寸變為56x56x128。
5、經256個3x3的卷積核做三次卷積+ReLU,尺寸變為56x56x256。
6、作2x2的max pooling池化,尺寸變為28x28x256。
7、經512個3x3的卷積核做三次卷積+ReLU,尺寸變為28x28x512。
8、作2x2的max pooling池化,尺寸變為14x14x512。
9、經512個3x3的卷積核做三次卷積+ReLU,尺寸變為14x14x512。
10、作2x2的max pooling池化,尺寸變為7x7x512。
11、與兩層1x1x4096,一層1x1x1000進行全連線+ReLU(共三層)。
12、通過softmax輸出1000個預測結果。
問題:這麼做的原因是什麼呢?
這裡引用崔同學在上次彙報中的解釋“因為在高層是想要提取區域性特徵,所以一般來說,從輸入到輸出,特徵影象會越來越小,同時在這個越來越小的過程中會當然會丟失掉一些重要的資訊,如果減小的太快或者是最終特徵影象太小就難免造成表徵瓶頸。”
所以VGG就採用每次池化後特徵圖的厚度增加1倍的策略來防止資訊丟失的太快。換句話說,特徵資訊從一開始輸入的224x224x3被變換到7x7x512,從原本較為local的資訊逐漸分攤到不同channel上,隨著每次的卷積和池化操作打散到channel層級上。
3.全連線轉卷積(測試階段)
問題1:全連線層為什麼需要固定輸入影象的尺寸?
要回答這個問題,首先看一下全連線層是如何工作的:
由上圖所示,我們假定要將一個221的feature map通過全連線層輸出一個4維向量,圖中的矩陣X便是這221的feature map,向量Y就是輸出的4維向量,全連線層的做法便是將feature map由矩陣形式展開成向量形式,該向量便是全連線層的輸入。
如上圖所示,全連線層的運算就是矩陣運算,輸出向量Y就是由權重矩陣W乘展開成向量的X’,我們可以看到,對於每一個yi,都是由權重矩陣的第i行與X’對應元素相乘,這個相乘的過程和用權重矩陣的第i行所構成的卷積核去卷積X會產生一樣的結果。
那麼將221的feature map通過全連線層得到4維向量就相當於以全連線層中的權重矩陣中的四行向量所組成的4個卷積核去卷積221的feature map,此時的卷積核的大小就和feature map的大小一樣,因此稱之為全卷積,全卷積最終得到114的矩陣,這和4維向量效果是一樣的。
個人理解:通過上面的過程基本就可以知道,當我們使用全連線層的時候,引數是一開始就根據輸入圖的尺寸設定好的,參照圖2,例如最後一層輸出的特徵圖尺寸是22(也就是2x2的矩陣),把它轉換為向量就是41,同時它作為下一個全連線層的輸入,而全連線層的輸出是一個4維向量(也就是4x1的矩陣),很明顯,輸入尺寸確定了,輸出尺寸也確定了,那這引數矩陣W也就確定了(只能是44的引數矩陣),而這引數矩陣確定了,那輸入的尺寸如果發生變化,比如變成33,開啟就是91的矩陣,明顯就不可能與44的引數矩陣相乘了,這就是全連線層需要固定影象尺寸的原因。
**簡單來說就是,全連線層的權重矩陣是固定的,每一次feature map的輸入過來必須都得是一定的大小(即與權重矩陣正好可以相乘的大小),所以網路最開始的輸入影象尺寸必須固定,才能保證傳送到全連線層的feature map的大小跟全連線層的權重矩陣匹配。
**
問題2、全連線層如何轉換為卷積層
看上圖感覺很容易明白,白色的長方體為最後一層輸出的特徵圖77512,原本全連線層的輸出是40961,那麼如果用4096組77512的卷積核對其進行卷積,就會得到40961*1的輸出向量,這和全連線層的輸出是等價的。
問題三:全連線層轉換為卷積層為什麼就可以處理任意尺寸的圖片輸入呢?
看這張圖就基本可以知道答案,上下分別是不同尺寸的圖輸入(14x14和16x16),很明顯,當這張圖經過最後一層卷積和池化之後分別變成了5x5和6x6的特徵圖,這在全連線層顯然是不可能同時往下進行的,要不就是全輸入14x14,或者全部輸入16x16,因為上面問題一說到的引數矩陣是固定的。而在這裡,當全連線層轉換為卷積層時,顯然就沒有這個問題,當不同尺寸的特徵圖經過三個卷積層後,雖然輸出的尺寸不一樣,但是並不影響它輸入到softmax層進行分類。
注:至於為什麼用4096這個引數的問題,基本的回答都是作者為了契合自己的模型而設定的引數,沒有特別的表徵意義。
這也是VGG的一個特點,在網路測試階段將訓練階段的三個全連線層替換為三個卷積層,使得測試得到的全卷積網路因為沒有全連線的限制,因而可以接收任意寬和高的輸入。
如上面的VGG網路結構圖所示,輸入影象是224x224x3,如果後面三個層都是全連線,那麼在測試階段就只能將測試的影象全部都縮放大小到224x224x3,才能符合後面全連線層的輸入數量要求,這樣就不便於測試工作的開展。 而“全連線轉卷積”,替換過程如下:
例如7x7x512的層要跟4096個神經元的層做全連線,則替換為對7x7x512的層作通道數為4096、卷積核為1x1的卷積
VGG模型訓練
1.預初始化權重
對於深度網路來說,網路權值的初始化十分重要。為此,論文中首先訓練一個淺層的網路結構A(網路結構見上圖),訓練這個淺層的網路時,隨機初始化它的權重就足夠得到比較好的結果。然後,當訓練深層的網路時,前四層卷積層和最後的三個全連線層使用的是學習好的A網路的權重來進行初始化,而其餘層則隨機初始化。
2、訓練影象尺寸選擇
S是訓練影象的最小邊,訓練尺度。
Q是測試影象的最小邊,測試尺度。
對原始圖片進行等比例縮放,使得S大於224,然後在圖片上隨機提取224x224視窗,進行訓練(注意只有S需要縮放,Q是不需要的,因為測試階段是將全連線層轉換為了卷積層,可以處理任意解析度的影象)。
在這裡,作者提供了兩種方法:
(1)單尺度訓練,直接按照固定的S(S是圖片尺寸,S=256和S=384)進行縮放(其中S=384網路的權重來自於預訓練的S=256網路以加速訓練),這個是AlexNet和ZFNet裡面用過的。
(2)多尺度訓練,每個訓練圖片被獨立的隨機縮放,S在[Smin,Smax]範圍內,這裡的Smin=256,Smax=512。原始訓練集上每張圖片中目標大小是不確定的,因此採用這一方法是有效的,其實這也可以看做是通過抖動縮放來增加訓練集。出於速度考慮,先預訓練S=384的單尺度模型,再微調多尺度模型。
測試與評估
VGG在測試的時候提出了輸入影象Q未必要等於S,並且之後更是率先提出了全卷積網路來實現dense評估。
1、單尺度評估
即測試影象大小Q固定,若S固定,則Q=S;若S抖動,則Q=0.5(Smin+Smax)
從表中可以看出:
• LRN層無效能增益(A-LRN) VGG作者通過網路A-LRN發現,AlexNet曾經用到的LRN層(local response normalization,區域性響應歸一化)並沒有帶來效能的提升,而且還浪費了記憶體計算損耗,因此在其它組的網路中均沒再出現LRN層。
• 隨著深度增加,分類效能逐漸提高(A、B、C、D、E) 從11層的A到19層的E,網路深度增加對top1和top5的錯誤率下降很明顯。
• 多個小卷積核比單個大卷積核效能好(B) VGG作者做了實驗用B和自己一個不在實驗組裡的較淺網路比較,較淺網路用conv5x5來代替B的兩個conv3x3,結果顯示這樣做比原來的top-1錯誤率提升了7%,證明了多個小卷積核比單個大卷積核效果要好。
• 訓練時的尺度抖動(S∈[256;512])得到了與固定最小邊(S=256或S=384)的影象訓練相比更好的結果。這證實了通過尺度抖動進行的訓練集增強確實有助於捕獲多尺度影象統計。
2、多尺度評估
即評估影象大小Q不固定,Q = {S{min}, 0.5(S{min} + S{max}), S{max}
作者通過試驗發現當使用固定值S訓練時,Q的範圍在[S−32,S,S+32]之間時,測試的結果與訓練結果最接近,否則可能由於訓練和測試尺度之間的巨大差異導致效能下降。 實驗結果表明測試時的尺度抖動與在單一尺度上相同模型的評估相比效能更優,並且尺度抖動優於使用固定最小邊S的訓練。
3、多裁剪評估(Multi-crop)和密集評估(Dense)方法
Dense(密集評估):即指全連線層替換為卷積層(第一FC層轉換到7×7卷積層,最後兩個FC層轉換到1×1卷積層),最後得出一個預測的score map,再對結果求平均。
Multi-crop(多裁剪評估):即對影象進行多樣本的隨機裁剪。對三個尺度上每個尺度進行50次裁剪(5x5大小的正常網格,並進行兩次翻轉)即總共150次裁剪的效果圖,然後通過網路預測每一個樣本的結構,最終對所有結果平均。
從論文中給出的結果來看,多裁剪評估表現要略好於密集評估,並且這兩種方法是互補的,因為它們的結合優於它們中的每一種。
多裁剪影象評估是密集評估的補充:當將ConvNet應用於裁剪影象時,卷積特徵圖用零填充,而在密集評估的情況下,相同裁剪影象的填充自然會來自於影象的相鄰部分(由於卷積和空間池化),這大大增加了整個網路的感受野,因此捕獲了更多的上下文。
4、卷積網路融合
這一部分就是將前面說到的方法進行一個融合並評估最終效果,從下圖可以看到VGG團隊在比賽時提交的7模型組合的測試誤差最低是7.3%(GoogleNet是6.7%).
在提交之後,他們考慮了只有兩個表現最好的多尺度模型(配置D和E)的組合,它使用密集評估將測試誤差降低到7.0%,使用密集評估和多裁剪影象評估將測試誤差降低到6.8%。
與當時最新的技術比較:
作者團隊在賽後對模型和其組合進行改良後,可以看到,效果與當時獲得第一名的GoogleNet非常接近,甚至在單模型的網路效能方面,已經超過了GoogleNet.
總結
最後進行一個簡單的總結,主要分為以下幾個方面:
1.解決了什麼
提高了大規模影象分類的精度。
2.使用的方法
搭建更深的卷積神經網路:使用3x3卷積核,模型達到16-19層,16層的被稱為VGG16,19層的被稱為VGG19。 使用Single-Scale和Multi-Scale訓練和評估模型。
3.實驗結果
該模型獲得ImageNet Challenge 2014的影象localization第一名,影象分類第二名,並且在賽後做了進一步改進,效果直逼GoogleNet。
4.待解決的問題
該模型還不夠深,只達到19層便飽和了,網路引數過多,達到1.3億引數以上。
補充:
通過增加深度能有效地提升效能。
最佳模型:VGG16,從頭到尾只有3x3卷積和2x2池化,簡潔優美。
卷積可代替全連線,可適應各種尺寸的圖片。