ResNet, AlexNet, VGG, Inception: 理解各種各樣的CNN架構

2021-02-13 機器學習算法工程師

原作者保留版權。

卷積神經網絡(CNN)在視覺識別任務上的表現令人稱奇。好的CNN網絡是帶有上百萬參數和許多隱含層的「龐然怪物」。事實上,一個不好的經驗規則是:網絡越深,效果越好。

AlexNet,VGG,Inception和ResNet是最近一些流行的CNN網絡。

為什麼這些網絡表現如此之好?它們是如何設計出來的?為什麼它們設計成那樣的結構?回答這些問題並不簡單,但是這裡我們試著去探討上面的一些問題。

網絡結構設計是一個複雜的過程,需要花點時間去學習,甚至更長時間去自己動手實驗。首先,我們先來討論一個基本問題。

圖像分類指的是給定一個圖片將其分類成預先定義好的幾個類別之一。圖像分類的傳統流程涉及兩個模塊:特徵提取和分類

特徵提取 指的是從原始像素點中提取更高級的特徵,這些特徵能捕捉到各個類別間的區別。這種特徵提取是使用無監督方式,從像素點中提取信息時沒有用到圖像的類別標籤。

常用的傳統特徵包括GIST, HOG, SIFT, LBP等。特徵提取之後,使用圖像的這些特徵與其對應的類別標籤訓練一個分類模型。常用的分類模型有SVM,LR,隨機森林及決策樹等。

上面流程的一大問題是

特徵提取不能根據圖像和其標籤進行調整。如果選擇的特徵缺乏一定的代表性來區分各個類別,模型的準確性就大打折扣,無論你採用什麼樣的分類策略。

採用傳統的流程,目前的一個比較好的方法是使用多種特徵提取器,然後組合它們得到一種更好的特徵。

但是這需要很多啟發式規則和人力來根據領域不同來調整參數使得達到一個很好的準確度,這裡說的是要接近人類水平。

這也就是為什麼採用傳統的計算機視覺技術需要花費多年時間才能打造一個好的計算機視覺系統(如OCR,人臉驗證,圖像識別,物體檢測等),這些系統在實際應用中可以處理各種各樣的數據。

有一次,我們用了6周時間為一家公司打造了一個CNN模型,其效果更好,採用傳統的計算機視覺技術要達到這樣的效果要花費一年時間。

傳統流程的另外一個問題是

它與人類學習識別物體的過程是完全不一樣的。自從出生之初,一個孩子就可以感知周圍環境,隨著他的成長,他接觸更多的數據,從而學會了識別物體。

這是深度學習背後的哲學,其中並沒有建立硬編碼的特徵提取器。它將特徵提取和分類兩個模塊集成一個系統,通過識別圖像的特徵來進行提取並基於有標籤數據進行分類。

這樣的集成系統就是多層感知機,即有多層神經元密集連接而成的神經網絡。

一個經典的深度網絡包含很多參數,由於缺乏足夠的訓練樣本,基本不可能訓練出一個不過擬合的模型。

但是對於CNN模型,從頭開始訓練一個網絡時你可以使用一個很大的數據集如ImageNet。這背後的原因是CNN模型的兩個特點:神經元間的權重共享和卷積層之間的稀疏連接

這可以從下圖中看到。在卷積層,某一個層的神經元只是和輸入層中的神經元局部連接,而且卷積核的參數是在整個2-D特徵圖上是共享的


為了理解CNN背後的設計哲學,你可能會問:其目標是什麼?


(1)準確度

如果你在搭建一個智能系統,最重要的當然是要儘可能地準確。公平地來說,準確度不僅取決於網路,也取決於訓練樣本數量。因此,CNN模型一般在一個標準數據集ImageNet上做對比。

ImageNet項目仍然在繼續改進,目前已經有包含21841類的14,197,122個圖片。自從2010年,每年都會舉行ImageNet圖像識別競賽,比賽會提供從ImageNet數據集中抽取的屬於1000類的120萬張圖片。

每個網絡架構都是在這120萬張圖片上測試其在1000類上的準確度。

(2)計算量

大部分的CNN模型都需要很大的內存和計算量,特別是在訓練過程。因此,計算量會成為一個重要的關注點。同樣地,如果你想部署在移動端,訓練得到的最終模型大小也需要特別考慮。

你可以想像到,為了得到更好的準確度你需要一個計算更密集的網絡。因此,準確度和計算量需要折中考慮。

除了上面兩個因素,還有其他需要考慮的因素,如訓練的容易度,模型的泛化能力等。下面按照提出時間介紹一些最流行的CNN架構,可以看到它們準確度越來越高。

[AlexNet]

 是一個較早應用在ImageNet上的深度網絡,其準確度相比傳統方法有一個很大的提升。它首先是5個卷積層,然後緊跟著是3個全連接層,如下圖所示:

Alex Krizhevs提出的AlexNet採用了ReLU激活函數,而不像傳統神經網絡早期所採用的Tanh或Sigmoid激活函數,ReLU數學表達為:

ReLU相比Sigmoid的優勢是其訓練速度更快,因為Sigmoid的導數在穩定區會非常小,從而權重基本上不再更新。這就是梯度消失問題。因此AlexNet在卷積層和全連接層後面都使用了ReLU。

AlexNet的另外一個特點是其通過在每個全連接層後面加上Dropout層減少了模型的過擬合問題。Dropout層以一定的概率隨機地關閉當前層中神經元激活值,如下圖所示:

為什麼Dropout有效?

Dropout背後理念和集成模型很相似。在Drpout層,不同的神經元組合被關閉,這代表了一種不同的結構,所有這些不同的結構使用一個的子數據集並行地帶權重訓練,而權重總和為1。

如果Dropout層有 n 個神經元,那麼會形成2^n個不同的子結構。在預測時,相當於集成這些模型並取均值。這種結構化的模型正則化技術有利於避免過擬合。

Dropout有效的另外一個視點是:由於神經元是隨機選擇的,所以可以減少神經元之間的相互依賴,從而確保提取出相互獨立的重要特徵。

[VGG16]

(https://arxiv.org/abs/1409.1556)

是牛津大學VGG組提出的。VGG16相比AlexNet的一個改進是採用連續的幾個3x3的卷積核代替AlexNet中的較大卷積核(11x11,5x5)。

對於給定的感受野(與輸出有關的輸入圖片的局部大小),採用堆積的小卷積核是優於採用大的卷積核,因為多層非線性層可以增加網絡深度來保證學習更複雜的模式,而且代價還比較小(參數更少)。

比如,3個步長為1的 3x3 卷積核連續作用在一個大小為7的感受野,其參數總量為 3*(9C^2), 如果直接使用7x7卷積核,其參數總量為  49C^2,這裡  C 指的是輸入和輸出的通道數。

而且3x3卷積核有利於更好地保持圖像性質。VGG網絡的架構如下表所示:

可以看到VGG-D,其使用了一種塊結構:多次重複使用同一大小的卷積核來提取更複雜和更具有表達性的特徵。這種塊結構( blocks/modules)在VGG之後被廣泛採用。

VGG卷積層之後是3個全連接層。網絡的通道數從較小的64開始,然後每經過一個下採樣或者池化層成倍地增加,當然特徵圖大小成倍地減小。最終其在ImageNet上的Top-5準確度為92.3%。

儘管VGG可以在ImageNet上表現很好,但是將其部署在一個適度大小的GPU上是困難的,因為需要VGG在內存和時間上的計算要求很高。由於卷積層的通道數過大,VGG並不高效。

比如,一個3x3的卷積核,如果其輸入和輸出的通道數均為512,那麼需要的計算量為9x512x512。

在卷積操作中,輸出特徵圖上某一個位置,其是與所有的輸入特徵圖是相連的,這是一種密集連接結構。[GoogLeNet]

基於這樣的理念:在深度網路中大部分的激活值是不必要的(為0),或者由於相關性是冗餘。因此,最高效的深度網路架構應該是激活值之間是稀疏連接的,這意味著512個輸出特徵圖是沒有必要與所有的512輸入特徵圖相連。

存在一些技術可以對網絡進行剪枝來得到稀疏權重或者連接。但是稀疏卷積核的乘法在BLAS和CuBlas中並沒有優化,這反而造成稀疏連接結構比密集結構更慢。

據此,GoogLeNet設計了一種稱為inception的模塊,這個模塊使用密集結構來近似一個稀疏的CNN,如下圖所示。

前面說過,只有很少一部分神經元是真正有效的,所以一種特定大小的卷積核數量設置得非常小。同時,GoogLeNet使用了不同大小的卷積核來抓取不同大小的感受野。

Inception模塊的另外一個特點是使用了一中瓶頸層(實際上就是1x1卷積)來降低計算量:

> 這裡假定Inception模塊的輸入為192個通道,它使用128個3x3卷積核和32個5x5卷積核。5x5卷積的計算量為25x32x192,但是隨著網絡變深,網絡的通道數和卷積核數會增加,此時計算量就暴漲了。為了避免這個問題,在使用較大卷積核之前,先去降低輸入的通道數。

所以,Inception模塊中,輸入首先送入只有16個卷積核的1x1層卷積層,然後再送給5x5卷積層。這樣整體計算量會減少為16x192+25x32x16。這種設計允許網絡可以使用更大的通道數。

(譯者註:之所以稱1x1卷積層為瓶頸層,你可以想像一下一個1x1卷積層擁有最少的通道數,這在Inception模塊中就像一個瓶子的最窄處)

GoogLeNet的另外一個特殊設計是最後的卷積層後使用全局均值池化層替換了全連接層,所謂全局池化就是在整個2D特徵圖上取均值。

這大大減少了模型的總參數量。要知道在AlexNet中,全連接層參數佔整個網絡總參數的90%。使用一個更深更大的網絡使得GoogLeNet移除全連接層之後還不影響準確度。其在ImageNet上的top-5準確度為93.3%,但是速度還比VGG還快。

從前面可以看到,隨著網絡深度增加,網絡的準確度應該同步增加,當然要注意過擬合問題。但是網絡深度增加的一個問題在於這些增加的層是參數更新的信號,因為梯度是從後向前傳播的,增加網絡深度後,比較靠前的層梯度會很小。

這意味著這些層基本上學習停滯了,這就是梯度消失問題。深度網絡的第二個問題在於訓練,當網絡更深時意味著參數空間更大,優化問題變得更難,因此簡單地去增加網絡深度反而出現更高的訓練誤差。

殘差網絡 [ResNet]

https://arxiv.org/abs/1512.03385

設計一種殘差模塊讓我們可以訓練更深的網絡

深度網絡的訓練問題稱為退化問題,殘差單元可以解決退化問題的背後邏輯在於此:想像一個網絡A,其訓練誤差為x。

現在通過在A上面堆積更多的層來構建網絡B,這些新增的層什麼也不做,僅僅複製前面A的輸出。這些新增的層稱為C。

這意味著網絡B應該和A的訓練誤差一樣。那麼,如果訓練網絡B其訓練誤差應該不會差於A。但是實際上卻是更差,唯一的原因是讓增加的層C學習恆等映射並不容易。

為了解決這個退化問題,殘差模塊在輸入和輸出之間建立了一個直接連接,這樣新增的層C僅僅需要在原來的輸入層基礎上學習新的特徵,即學習殘差,會比較容易。

與GoogLeNet類似,ResNet也最後使用了全局均值池化層。利用殘差模塊,可以訓練152層的殘差網絡。其準確度比VGG和GoogLeNet要高,但是計算效率也比VGG高。152層的ResNet其top-5準確度為95.51%。

ResNet主要使用3x3卷積,這點與VGG類似。在VGG基礎上,短路連接插入進入形成殘差網絡。如下圖所示:

殘差網絡實驗結果表明:34層的普通網絡比18層網路訓練誤差還打,這就是前面所說的退化問題。但是34層的殘差網絡比18層殘差網絡訓練誤差要好。

隨著越來越複雜的架構的提出,一些網絡可能就流行幾年就走下神壇,但是其背後的設計哲學卻是值得學習的。這篇文章對近幾年比較流行的CNN架構的設計原則做了一個總結。

譯者註:可以看到,網絡的深度越來越大,以保證得到更好的準確度。網絡結構傾向採用較少的卷積核,如1x1和3x3卷積核,這說明CNN設計要考慮計算效率了。

一個明顯的趨勢是採用模塊結構,這在GoogLeNet和ResNet中可以看到,這是一種很好的設計典範,採用模塊化結構可以減少我們網絡的設計空間,另外一個點是模塊裡面使用瓶頸層可以降低計算量,這也是一個優勢。

這篇文章沒有提到的是最近的一些移動端的輕量級CNN模型,如MobileNet,SqueezeNet,ShuffleNet等,這些網絡大小非常小,而且計算很高效,可以滿足移動端需求,是在準確度和速度之間做了平衡。

機器學習算法全棧工程師

                            一個用心的公眾號

長按,識別,加關注

進群,學習,得幫助

你的關注,我們的熱度,

我們一定給你學習最大的幫助

公眾號商務合作請聯繫  ▶▶▶

相關焦點

  • 常用CNN網絡(AlexNet,GoogleNet,VGG,ResNet,DenseNet,inceptionV4)適合初學者
    /ZiliangWang0505/Alexnet_with_keras    GoogleNet    https://github.com/pinae/GoogLeNet-Keras-Test    VGG    https://github.com/geifmany/cifar-vgg
  • 五個很厲害的 CNN 架構
    我們來理解一下這種模型的結構。除了輸入層,這個模型有七層。由於結構十分的迷你,我們逐層來研究這個模型:第一層:卷積層,總共6個卷積核,核尺寸5*5,步長1*1。所以,當輸入圖像尺寸為32*32*1時,輸出尺寸為28*28*6。這層的參數個數為5*5*6+6(偏置項的個數)第二層:池化層,總共6個池化核,核尺寸為2*2,步長為2*2。
  • VGGNet、ResNet、Inception和Xception圖像分類及對比
    由於 Xception 架構具有與 Inception-v3 相同的參數數量,因此性能提升不是由於容量的增加,而是由於更高效地使用了模型參數。圖像分類準備工作本節使用 Keras 因為這個框架有上述模塊的預處理模塊。Keras 在第一次使用時會自動下載每個網絡的權重,並將這些權重存儲在本地磁碟上。換句話說,你不需要重新訓練網絡,而是使用網際網路上已有的訓練參數。
  • 經典的CNN模型架構-LeNet、AlexNet、VGG、GoogleLeNet、ResNet
    從那以後,在這個比賽的助力下,每年都會引入不同的CNN架構。LeNet5網絡架構如圖1所示。我們可以得出以下幾點:網絡輸入是一個32×32的灰度圖像。實現的架構是CONY層,其次是池化層和一個全連接層。CONY層濾波器大小是5×5,步長為13. AlexNet架構 CNN架構的第一次突破發生在2012年。
  • [深度學習] AlexNet,GoogLeNet,VGG,ResNet簡化版
    VGGvgg是14年和GoogLeNet同時提出的,獲得分類任務的第二名。其主要貢獻是通過減小卷積核大小然後增加網絡深度可以提高模型分類效果,而且VGG具有很好的泛化能力。超參數設置:使用了3x3和1x1大小的卷積核,1x1卷積核可以看做是對通道的一種線性變換。
  • 12 個 CNN 經典模型論文整理與 PyTorch 實現!
    點擊上方「深度學習專欄」,選擇「置頂」公眾號重磅乾貨,第一時間送達最近發現了一份不錯的原始碼,作者使用 PyTorch 實現了如今主流的卷積神經網絡 CNN 框架,包含了 12 中模型架構CNN 模型(12 篇)(lenet) LeNet-5, convolutional neural networks論文地址:http://yann.lecun.com/exdb/lenet/(alexnet) ImageNet Classification
  • 遷移學習人民幣面值識別(附源碼)-InceptionResNetV2
    /output/model-inception_resnet_v0-27.h5Epoch 1/1396/396 [==============================] - 1027s 3s/step -loss: 0.0288 - acc: 0.9957 - val_loss: 0.0118- val_acc: 0.999120000
  • 無需數學背景,讀懂ResNet、Inception和Xception三大變革性架構
    機器之心對本文進行了編譯介紹,更多架構可參閱機器之心文章《10 大深度學習架構:計算機視覺優秀從業者必備(附代碼實現)》。過去幾年來,計算機視覺領域中深度學習的諸多進展都可以歸結到幾種神經網絡架構。除開其中的所有數學內容、代碼和實現細節,我想探索一個簡單的問題:這些模型的工作方式和原因是什麼?
  • 通過簡單代碼理解卷積模塊:含Inception/ResNet/DenseNet/NASNet
    我發現直接用平實的代碼來理解要容易得多。所以在這篇文章中,我希望帶你了解一些精選的用 Keras 實現的最新架構中的重要卷積模塊。如果你在 GitHub 上尋找常用架構的實現,你會找到多得讓人吃驚的代碼。在實踐中,包含足夠多的注釋並用額外的參數來提升模型的能力是很好的做法,但這也會干擾我們對架構本質的理解。
  • 一文概覽Inception家族的「奮鬥史」: 從Inception v1到Inception-ResNet
    該架構的主要特點是更好地利用網絡內部的計算資源,這通過一個精心製作的設計來實現,該設計允許增加網絡的深度和寬度,同時保持計算預算不變。為了優化質量,架構決策基於赫布原則和多尺度處理。作者向 ILSVRC14 提交使用該架構的模型即 GoogLeNet,這是一個 22 層的深度網絡,它的質量是在分類和檢測領域進行了評估。
  • 乾貨 TensorFlow之深入理解AlexNet
    如何做到能達到那麼好的成績,好的廢話不多說,來開始看文章這張圖是基本的caffe中alexnet的網絡結構,這裡比較抽象,我用caffe的draw_net把alexnet的網絡結構畫出來了和paper裡面不太一樣,alexnet裡面採樣了兩個GPU,所以從圖上面看第一層卷積層厚度有兩部分,池化pool_size=(3,3),滑動步長為2個pixels,得到96個2727個feature。