分類任務之LeNet-5、AlexNet、VGG、ResNet、GoogLeNet

1、LeNet-5

手寫體數字識別模型,是一個廣爲人知的商用的卷積神經網絡, 當年美國大多數銀行用它來識別支票上面的手寫數字。
Lenet-5 原始結構如下圖所示,包括:卷積層,降採樣,卷積層,降採樣,卷積層(實現全連接),全連接層,高斯連接層(進行分類)。

LeNet-5

在後期發展中,降採樣層被 max_poolingmax\_pooling 所取代,分類也被 softmaxsoftmax 所替代,現在 TensorflowTensorflow 或者其他框架下的網絡實現爲:在這裏插入圖片描述

總結:
(1)到現在LeNet-5的實際應用價值並不大,更多的時候是作爲學習實例,瞭解其中卷積、採樣、全連接、激活函數等CNN基礎內容。
(2)降採樣和池化的區別:原始的信號處理採用的就是採樣,說白了就是採集樣本,這種採樣一旦方式確定那麼接下來所有框選取的像素位置都是固定的,要麼隔一個、要麼隔兩個;池化中平均池化是利用了框選位置的所有像素特徵,最大池化雖然只用了最大像素值,但是這個像素值的位置是不確定的,所選取的特徵也是具有代表性的。
(3)LeNet-5 對於小尺寸的圖像還能夠有一定的識別率,但是當輸入圖像尺寸很大時,爲了滿足網絡對於輸入的要求需要進行縮放(到224*224),就會丟失局部細微特徵,LeNet-5 就比較難捕捉不同類別間的區別了。

2、AlexNet

AlexNet是2012年ImageNet圖像分類競賽(ILSVRC)的冠軍,以 Top-5 錯誤率15.3%打敗上一年的冠軍,而且遠遠超過當年的第二名。它使用 ReLUReLU 替了傳統的激活函數,而且網絡針對多GPU訓練進行了優化設計,用於提升速度。不過隨着硬件發展,現在我們訓練AlexNet都可以直接用簡化後的代碼來實現了。在這裏插入圖片描述
AlexNet 的輸入數據尺寸爲 2242243224*224*3,這比之前的 LeNet-5(3232132*32*1 的灰度圖)大了許多,但是隨着後人的優化發現227*227應該是最優的;其次它的參數量達到了 60M60M,這比LeNet-5的 60k60k 參數量也大得多。AlexNet 論文中特別提到幾點:

  • ReLU的使用,這使得訓練時的錯誤率能夠迅速下降到25%(比tanh快了將近7倍的時間);
  • 雙GPU,從上面的網絡結構就可以看出,中間的部分是分開的、分別在兩個相同的GPU上進行,因爲當時的GPU性能限制了網絡的大小,用兩個GPU是受制於硬件的無奈之舉但卻收到意外的好效果;
  • 局部響應歸一化LRN,相當於是做了亮度歸一化處理;
  • 使用Overlapping Pooling,就是池化層的池化大小大於步長,使得相鄰的池之間產生重疊。

對比來看,LeNet-5 總共5層,AlexNet總共8層,後者包括5個卷積層、3個全連接層,最終輸出分類爲1000。特別注意的是:2/4/5層卷積都只和同一GPU的上一層關聯,但是第3層卷積是交叉的,全連接的時候也是如此;LRN接在1/2層卷積之後,最大池化層則接在LRN和第5個卷積之後。在防止過擬合時採用兩種手段:數據增強(隨機剪裁,利用PCA調整RGB值),dropout。

總結:
(1)文章最後說道:“減少網絡中的任意一層都會降低模型的性能”,這其實也預示了深度神經網絡的發展,越深的網絡會擁有更好的表現。
(2)AlexNet的成功歸結於幾個方面:a. 百萬級數據集,使用數據增強;b. 激活函數 ReLU 對抗梯度消失;c. Dropout 避免過擬合;d. LRN 的使用;e . 雙GPU並行計算。

3、VGG

VGG是由牛津大學計算機視覺組和 Google DeepMind 公司研究員一起研發的深度卷積神經網絡,它通過反覆的堆疊 3*3 的小型卷積核和 2*2 的最大池化層,成功地構建了 16~19 層深的卷積神經網絡,並一舉獲得了 ILSVRC 2014年比賽的亞軍和定位項目的冠軍,在top5上的錯誤率爲7.5%,其中 VGG-16 的參數量爲 138M。

VGG 是目前最流行的網絡結構之一,因爲結構簡單、應用性極強而廣受研究者歡迎,尤其是它的網絡結構設計方法,爲構建深度神經網絡提供了方向


在這裏插入圖片描述

上圖給出了VGG的整體結構,以 feature map 大小來對卷積進程進行階段性劃分,作者每次使用的都是 3*3 卷積、2*2 池化,區別在於每一階段卷積的數量有所不同。VGG 包括多個不同的版本,每一個版本都是通過疊加捲積來實現網絡加深,版本之間的區別如下圖所示。


在這裏插入圖片描述

從上圖可以看到,作者在部分位置還使用了 1*1 卷積,其作用在於增加線性變換。1*1 的卷積層常被用來提煉特徵,即多通道的特徵組合在一起,凝練成較大通道或者較小通道的輸出,而每張圖片的大小不變。有時 1*1 的卷積神經網絡還可以用來替代全連接層。

創新點:
(1)多個小卷積連接代替一個大卷積:具體來說就是兩個 3*3 卷積代替一個 5*5卷積,3個 3*3 卷積代替一個 7*7 卷積;它的優勢在於既可以保證感受野的大小,又能夠減小參數量(相當於之前的一半),同時多個卷積的出現相當於增加了非線性操作次數,網絡學習特徵的能力也就更強。
(2)全部使用3*3的卷積核和2*2的池化核,通過不斷加深網絡結構來提升性能;網絡層數的增長並不會帶來參數量上的爆炸,因爲參數量主要集中在最後三個全連接層中。

4、ResNet

ResNet 由微軟研究院的Kaiming He等四名華人提出,在ILSVRC 2015比賽中取得冠軍,Top-5 上的錯誤率爲3.57%,其參數量比 VGG 低,效果非常突出。ResNet的結構可以極快的加速神經網絡的訓練,模型的準確率也有比較大的提升,同時ResNet的推廣性非常好,甚至可以直接用到InceptionNet 網絡中。ResNet的主要思想是在網絡中增加了直連通道,即Highway Network的思想。此前的網絡結構是性能輸入做一個非線性變換,而Highway Network則允許保留之前網絡層的一定比例的輸出。


在這裏插入圖片描述

ResNet 的核心就是上圖中的塊結構。按照傳統的卷積做法,我們只需要做 F(x) 的前向和反向傳播,但是一旦網絡達到一定的深度,反向傳播的梯度一層層積累會逐漸降低直至消失…爲了避免梯度消失,作者在 F(x) 上加入一個 x,保證反向梯度 在 1 左右,殘差指的就是上圖的 F(x) 部分。

參考解釋:
假設 FF 就是上面所說的 F(x)F(x),是求和前網絡映射;HH 是從輸入到求和後的網絡映射,也就是上圖中的 F(x)+xF(x)+x。現在把 5 映射到5.1,那麼引入殘差前是 F(5)=5.1F'(5)=5.1,引入殘差後是 H(5)=5.1H(5)=5.1, 也就是 H(5)=F(5)+5H(5)=F(5)+5, F(5)=0.1F(5)=0.1。這裏的 FF'FF 都表示網絡參數映射,引入殘差後的映射對輸出的變化更敏感。比如輸出從5.1變到5.2,映射 FF' 的輸出增加了 1/51=21/51=2%;而對於殘差結構輸出從5.1到5.2,映射 FF 是從0.1到0.2,增加了100%。明顯後者輸出變化對權重的調整作用更大,效果更好。
殘差的思想都是去掉相同的主體部分(也就是 xx),從而突出微小的變化。

明白了ResNet的思想,再來看看如何設計具體的殘差塊,文章給出了兩種形式,如下圖所示。
這兩種結構分別針對 ResNet34(左圖)和 ResNet50/101/152(右圖),左圖結構稱爲“building block”,右圖結構稱爲“bottleneck design”,目的就是爲了減少參數量。“bottleneck design” 的第一個 1*1 卷積把256維channel降到64維,然後在最後通過 1*1 卷積恢復,整體上用的參數數目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632。如果要實現相同通道數的話,“building block” (它裏面用了兩個 3x3 的卷積)需要的參數量爲: 3x3x256x256x2 = 1179648,差了16.94倍。 對於常規ResNet,可以用於34層或者更少的網絡中,對於Bottleneck Design的ResNet通常用於更深的如101這樣的網絡中,目的是減少計算和參數量。


在這裏插入圖片描述

進行卷積操作後,如果通道數量相同可以採用 H(x)=F(x)+x 的方式直接計算,如果使用的卷積數量不同、feature map 的通道不一致,則需要使用額外的卷積操作 W 來調整通道數量:H(x)=F(x)+W*x(具體實現需要看代碼)。
在這裏插入圖片描述
上圖給出了不同層數的ResNet,簡單算一下ResNet-101的層數:1+(3+4+23+3)*3+1=101。

5、GoogLeNet

GoogLeNet 是2014年ImageNet圖像分類競賽(ILSVRC)的冠軍,它將 Top-5 的錯誤率降低到6.67%。它的主要特點是:不僅在縱向上具有深度,在橫向上還具有寬度。由於圖像信息在空間尺寸上的巨大差異,如何選擇合適的卷積核大小來提取特徵就顯得比較困難了。空間分佈範圍更廣的圖像信息適合用較大的卷積核來提取其特徵,而空間分佈範圍較小的圖像信息則適合用較小的卷積核來提取其特徵。爲了解決圖像尺寸的差異,GoogLeNet 提出一種解決方案:Inception。實際上 Inception 來源於2014年 ICLR 的文章《Network In Network》(NIN),通過不斷的修改、優化,google的 Inception 一直從 v1 發展到 v4。
GoogLeNet這個名字也是挺有意思的,將 L 大寫是爲了向開山鼻祖的LeNet網絡致敬。同時 Inception 一詞來源於電影《盜夢空間》,後者的外文名就是“Inception”,意爲希望可以搭建更深的網絡。

在這裏插入圖片描述

5.1 Inception v1

下圖是最原始的Inception,也就是常說的 GoogLeNet,它致力於增加網絡深度和寬度,提高深度神經網絡性能。
在這裏插入圖片描述
考慮到多個不同size的卷積核能夠提高網絡的適應能力,該結構使用了1*1、3*3、5*5的卷積核,同時加入maxpool。文章指出,這種結構的主要問題是:每一層 filters 參數量爲所有分支上的總數和,多層 Inception 最終將導致模型的參數數量龐大,對計算資源有更大的依賴。我們知道1*1的卷積核擁有降維的作用,於是作者在維度較高的位置使用1*1卷積核,先進行降維然後再做卷積操作,這樣既有效保證了模型特徵的表達能力,又達到了減少3*3、5*5卷積核數量的目的,於是就有了上圖右邊的結構。4個分支最後通過一個聚合操作(tf.concat)實現合併,完整的 GoogLeNet 結構在傳統的卷積層和池化層後面引入了 Inception 結構,對比 AlexNet 雖然網絡層數增加,但是參數數量減少的原因是絕大部分的參數集中在全連接層。在這裏插入圖片描述
可以看到,GoogLeNet總共包含9個Inception,同時還有兩個分支,作爲輔助損失函數參與最終 Loss 的計算,可以從一定程度上緩解梯度消失的問題。每一個Inception包含兩個層,在第一個Inception之前還有3個卷積,輸出層之前加一個全連接,9*2+3+1=22。雖然增加了層數,但是網絡的參數數量卻大大降低,只有 6.8M 左右,這與AlexNet的 60M 相比,在計算速度上就擁有巨大優勢。

5.2 Inception v2

實際上在介紹 Inception v2之前應該先了解 VGG,因爲前者是借鑑了後者的“用兩個3*3卷積代替一個5*5卷積”的思路。這一思路在降低參數量的同時建立了更多的非線性變換,使得 CNN 對特徵的學習能力變得更強。

在這裏插入圖片描述

該模型的另一個貢獻就是提出了鼎鼎大名的 BatchNormalization,該方法可以有效防止 Internal covariate shift。簡單來說就是:每一次參數更新都會導致每一層卷積的輸出數據分佈發生改變(偏離0/1正態分佈中心),使得我們只能使用較小的學習速率(慢慢的試探、適應這種變化),這就導致梯度下降的速度變得很慢;BN就是在每一次卷積之後將分佈拉回0/1正態分佈中心,這使得我們可以使用較大的學習率,梯度下降的速度比原來快將近14倍。同時 BN 也具有正則化的效果,對防止過擬合也有一定作用,可以較少或者取消 Dropout 和 LRN 的使用,從而簡化網絡結構。

最終,Inception v2 取得了 Top-5 錯誤率 4.8% 的優異成績,優於正常人眼水平。

5.3 Inception v3

Inception v3 引入了 Factorization into small convolutions 的思想,也就是將一個較大的二維卷積拆成兩個較小的一維卷積,比如將 7*7 卷積拆成 1*7 卷積和 7*1 卷積,或者將 3*3 卷積拆成 1*3 卷積和3´1卷積,如下圖所示。在這裏插入圖片描述

上圖是兩種不同的拆分方式,這種方式將節約大量的參數(Inception v3 的參數量爲23.2M),加速運算並減輕過擬合(將7*7卷積拆成1*7卷積和7*1卷積,比拆成3個3*3卷積更節約參數),同時增加了非線性擴展模型的表達能力。論文中指出,這種非對稱的卷積結構拆分,其結果比對稱地拆爲幾個相同的小卷積核效果更明顯,可以處理更多、更豐富的空間特徵,增加特徵多樣性。
我們知道,在 Inception v1 中作者爲了減少深度模型中反向傳播時梯度消失的問題,而提出了在模型的中間與較底部增加了兩個輔助 Loss 的方案,他們在Inception v2 中思考了這個輔助 Loss 的作用,覺得它真正意義在於對訓練參數進行regularization,於是就在這些輔助 Loss 的FC層裏添加了BN或者dropout層(如下圖左邊所示的那樣),果然發現分類結果好了些。


在這裏插入圖片描述

在傳統的卷積網絡中,池化的作用在於剔除那些無關緊要的特徵,爲了不讓重要的特徵信息被過濾掉一般會在池化之前增加特徵的數量(用1*1卷積),但是這種操作會使得計算量大大增加。Inception v3 於是提出如下做法:將本來應該串聯進行的卷積、池化操作並行進行,即分別使用 pool 與 conv 直接減少 feature map size 的做法分別計算,之後再將兩者算出的 feature maps 組合起來,如上圖右邊所示。

Inception v2 和 v3 實際上屬於同一篇文章(2015年)的內容,但是一般將其看作兩個不同的 Inception 進化版本。經過一系列的優化,Inception v3 最終取得 Top-5 錯誤率 3.5%。

5.4 Inception v4

Inception v4 同樣來自於對 Inception 結構的完善優化,它發表於2016年的文章,整篇文章沒有公式,只有滿滿的結構圖、實驗分析圖。實際上在閱讀這篇文章之前應該先看一下 ResNet,雖然 Inception v4 本身與殘差塊無關,但是文章結合 Inception 結構和殘差塊提出了另外兩種模型。
在這裏插入圖片描述
上圖第一行最左邊給出了 Inception v4 的整體網絡結構,其他部分則是該結構的組成模塊,分別是:Stem、Inception-A、Inception-B、Inception-C、Reduction-A、Reduction-B。Inception-A 主要用來處理 35*35 的 feature map,Inception-B 主要用來處理 17*17 的 feature map,Inception-C 則是處理 8*8 的feature map,整體來說 Inception v4 的Inception 繼續沿襲 v2/v3 的結構,但是結構看起來更加簡潔統一,並且使用更多的 Inception module,實驗效果也更好。
之後文章結合 ResNet 提出了 Inception-ResNet-v1、Inception-ResNet-v2,前者的計算代價與 Inception v3 大致相同,後者的計算代價與 Inception v4 大致相同。不同模型的結構稍有變化,具體區別作者在文章中做出了詳細介紹。對比幾種模型作者最終得出結論:

(1)如果濾波器數量超過1000,殘差網絡開始出現不穩定,同時網絡會在訓練過程早期便會出現“死亡”,這意味着經過反覆迭代後,在平均池化(average pooling) 之前的層開始只生成0。通過降低學習率,或增加額外的batch-normalizatioin都無法避免這種狀況。
(2)將殘差模塊添加到activation激活層之前,對其進行放縮能夠穩定訓練;通常來說,將殘差放縮因子定在0.1到0.3。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章