經典的CNN模型架構-LeNet、AlexNet、VGG、GoogleLeNet、ResNet

2021-02-23 貪心科技AI

作者:微塵,上海交大應用數學專業

知乎ID:微塵,感興趣的朋友可以關注

本文將引入 ImageNet圖像資料庫,並介紹以下幾種經典的CNN模型架構:LeNet、AlexNet、VGG、GoogleLeNet、ResNet

1.ImageNet介紹

ImageNet是一個包含超過1500萬幅手工標記的高解析度圖像的資料庫,大約有22000個類別。該數據 WordNet庫組織類似於的層次結構,其中每個領域叫同義詞集合。每個同義詞集合都是 ImageNet層次結構中的一個節點。每個節點都包含超過500幅圖像。

ImageNet大規模視覺識別挑戰賽(ILSVRC)成立於2010年,旨在提高大規模目標檢測和圖像分類的最新技術。

在對 ImageNet概覽之後,我們現在來看看不同的CNN模型架構。

2.LeNet 圖1

2010年,在 ImageNet挑戰賽也稱為 ILSVRC2010)中出現了一個CNN架構—— LeNet5,由 Yann Lecun創建。該網絡以一個32×32的圖像作為輸入,然後進入卷積層(C1),接著進入子採樣層(S2),目前子採樣層被池化層取代。然後是另一個卷積層序列(C3),跟著是一個池化層(即子採樣層)(S4)最後,有三個全連接層,包括最後的輸出層(OUTPUT)。該網絡用於郵局的郵政編碼識別。從那以後,在這個比賽的助力下,每年都會引入不同的CNN架構。LeNet5網絡架構如圖1所示。我們可以得出以下幾點:

網絡輸入是一個32×32的灰度圖像。實現的架構是CONY層,其次是池化層和一個全連接層。CONY層濾波器大小是5×5,步長為1

3. AlexNet架構

CNN架構的第一次突破發生在2012年。獲獎的CNN架構名叫 AlexNet。它是由多倫多大學的 Alex Krizhevsky和他的教授 Jeffry Hinton開發.

在第一次運行中,該網絡使用ReLU激活函數和0.5概率的 dropout來對抗過擬合。如圖2所示,架構中使用了一個標準化層,但是由於該網絡使用了大量的數據增強,因此在實踐中不再使用該標準化層。雖然有更精確的網絡可用,但由於 AlexNet相對簡單的網絡結構和較小的深度, AlexNet在今天仍然廣泛使用。比如計算機視覺。

圖2

可能由於當時GPU連接間的處理限制, AlexNet使用兩個單獨的GPU在 ImageNet資料庫上執行訓練,如圖3所示。

圖3

基於 AlexNet的交通標誌分類器

在本例中,我們將使用遷移學習進行特徵提取,並基於一個德國交通標誌數據集開發一個分類器。

這裡所用的 AlexNetMichael是由 Guerzhoy和 Davi Frossard實現的, AlexNet權重來自伯克利視覺學習中心。完整的代碼和數據集可以從這裡下載。AlexNet所需的圖像大小是227×227×3像素,而交通標誌圖像大小是32×32×3像素。為了將交通標誌圖像輸入 Alex Net,我們需要將圖像尺寸調整到 AlexNet期望的大小,即227x227×3,代碼如下


1original_image=tf.placeholder(tf float32,(None,32,32,3))
2 resized_image=tf.image. resize_images(original_imag,(227,227))


我們可以藉助 TensorFlow的tf.image. resize_images方法來做到這一點。

這裡的另一個問題是, AlexNet是在 ImageNet數據集上進行訓練的,該數據集有1000類圖像。因此,我們將用一個包含43個神經元的分類層來代替這個層。為此,計算出最後一個全連接層的輸出大小,因為全連接層是一個2D形狀,所以最後一個元素是輸出的大小。fc7.get_shape.as_list()[-1]可以做到。最後將此數據與交通標誌數據集的類別數量結合起來,可以得到最終全連接層的形狀: shape=(getshape.aslist[-],43)。如下代碼是在 TensorFlow中定義全連接層的標準方法。最後,使用 softmax計算概率大小:

1#Refer AlexNet implementation code, returns last fully connected layer
2fc7 = AlexNet(resized, feature_extract=True)
3shape = (fc7.get_shape().as_list()[-1], 43)
4fc8_weight = tf.Variable(tf.truncated_normal(shape, stddev=1e-2))
5fc8_b = tf.Variable(tf.zeros(43))
6logits = tf.nn.xw_plus_b(fc7, fc8_weight, fc8_b)
7probs = tf.nn.softmax(logits)

4 .VGGNet架構

2014年 ImageNet挑戰賽的亞軍是來自牛津大學視覺幾何團隊的VGGNet.這個卷積網絡是一個簡單而優雅的架構,只有7.3%的誤差率。它有兩個版本:VGG16和 VGG19.

VGG16是一個16層的神經網絡,不包括最大池化層和 softmax層。因此被稱為VGG16。VGG19由19個層組成,在 Keras中, Theano和 TensorFlow後端都有一個預先訓練好的模型。

這裡的關鍵設計考慮是深度。基於所有層中大小為3x3的卷積濾波器,可以通過添加更多的卷積層來增加網絡深度。這個模型的輸入圖像的默認大小是224×224×3。圖像以步長1、填充值1通過一系列卷積層。整個網絡中的卷積大小都是3×3。最大池化層以步長2通過2×2的窗口滑動,然後是另一個卷積層,後面是三個全連接層。前兩個全連接層各有4096個神經元,第三個全連接層有1000個神經元,主要負責分類。最後一層是 softmax層。VGG16使用一個較小的3×3卷積窗口,相比之下, AlexNet的11×11卷積窗口要大得多。所有隱含層構建過程都使用relu激活函數。VGGNet架構如下所示:

圖4

由於小的3×3卷積濾波器,使得 VGGNet深度增加。該網絡的參數數量約為1.4億個,大部分來自於第一個全連接層。在現代架構中, VGGNet的全連接層被全局平均池化(GAP)層替代,以最小化參數數量。

另一個觀察結果是,濾波器的數量隨著圖像大小的減小而增加。

VGG16圖像分類代碼示例

Keras應用程式模塊有預先訓練的神經網絡模型,以及在 ImageNet上預先訓練的權重。這些模型可以直接用於預測、特徵提取和調優。

①我在colab上運行的代碼,先在谷歌圖片上隨便找一張dolphin照片下載到本地,然後通過以下代碼上傳照片到colab

1from google.colab import files
2
3uploaded = files.upload()

②搭建模型和訓練模型、預測圖片類別

1#import VGG16 network model and other necessary libraries 
2
3from keras.applications.vgg16 import VGG16
4from keras.preprocessing import image
5from keras.applications.vgg16 import preprocess_input, decode_predictions
6import numpy as np
7
8#Instantiate VGG16 and returns a vgg16 model instance 
9vgg16_model = VGG16(weights='imagenet', include_top=False) 
10#include_top: whether to include the 3 fully-connected layers at the top of the network.
11#This has to be True for classification and False for feature extraction. Returns a model instance
12#weights:'imagenet' means model is pre-training on ImageNet data.
13model = VGG16(weights='imagenet', include_top=True)
14model.summary()
15
16#image file name to classify
17image_path = 'dol.jpg'
18#load the input image with keras helper utilities and resize the image. 
19#Default input size for this model is 224x224 pixels.
20img = image.load_img(image_path, target_size=(224, 224))
21#convert PIL (Python Image Library??) image to numpy array
22x = image.img_to_array(img)
23print (x.shape)
24
25#image is now represented by a NumPy array of shape (224, 224, 3),
26# but we need to expand the dimensions to be (1, 224, 224, 3) so we can
27# pass it through the network -- we'll also preprocess the image by
28# subtracting the mean RGB pixel intensity from the ImageNet dataset
29#Finally, we can load our Keras network and classify the image:
30
31x = np.expand_dims(x, axis=0)
32print (x.shape)
33
34preprocessed_image = preprocess_input(x)
35
36preds = model.predict(preprocessed_image)
37print('Prediction:', decode_predictions(preds, top=2)[0])

預測結果為大白鯊和虎鯊的結合,勉強過關嘿嘿嘿~

第一次執行上述代碼時, Keras將自動下載並緩存架構權重到磁碟目錄~/.keras/models中。這樣後續的運行將更快。

5. GoogLeNet架構

在2014年 ILSVRC的中,谷歌發布了自己的網絡 GoogLeNet它的性能比 VGGNet好一點, GoogLeNet的性能是6.7%,而 VGGNet的性能是7.3%(這裡性能指的是誤差率)。

GoogLeNet最吸引人之處在於它的運行速度非常快,主要原因是由於它引入了一個叫 inception模塊的新概念,從而將參數數量減少到500個,是 AlexNet的1/12。同時它的內存和功耗也都更低。

GoogLeNet有22層,所以它是一個非常深的網絡。添加的層數越多,參數的數量就越多,而且網絡很可能出現過擬合。同時計算量將會更大,因為濾波器的線性增加將會導致計算量的二次方增大。所以設計人員使用了 inception模塊和GAP。因為後全連接層容易過擬合,因此在網絡末端將使用GAP替代全連接層。GAP沒有需要學習或優化的參數。

5.1架構洞察

與前面架構不同, GoogLeNet設計人員沒有選擇特定的濾波器大小,而是將大小為1×1、3×3和5×5的所有三個濾波器和3×3的最大池化層都應用到同一個補丁中,並連接到單個輸出向量中。

使用1×1的卷積會減少計算量,因為在昂貴的3×3和5×5卷積下計算量會增加。在昂貴的3×3和5×5卷積之前使用的是帶有ReLU激活函數的1×1卷積。

在 GoogLeNet中, inception模塊一個疊著一個這種堆疊允許我們修改每個模塊而不影響後面的層。例如,你可以增加或減少任何一層的寬度。如圖5所示。

圖5

深度網絡在反向傳播過程中也會遇到所謂的梯度消失問題。通過在中間層添加輔助分類器可以避免這種情況。此外,在訓練過程中,中間層的損失將乘以因子0.3計入總損失

由於全連接層容易出現過擬合,所以用GAP層來替代。平均池化不排除使用 dropout,這是一種在深度神經網絡中克服過擬合的正則化方法。GoogLeNet在60之後添加一個線性層和一個GAP層,通過運用轉移學習技術來幫助其他層滑動自己的分類器。

5.2inception模塊示例6 .ResNet架構

一定深度後,向前反饋 convNet添加額外層會導致更高的訓練誤差和驗證誤差。性能只會隨著層的增加而增加到一定深度,然後會迅速下降。在 ResNet(殘差網絡)論文中,作者認為這種低度擬合未必是由梯度消失問題導致的,因為當使用批處理標準化技術時也會發生這種情況。因此,他們增加了一個新的概念叫殘餘塊。如圖6所示。ResNet團隊向網絡中添加了可以跳過卷積層的連接

圖6 殘餘塊

提示:ResNet使用標準的convNet,並添加每次可以跳過多個卷積層的連接。每條支路都有一個殘餘塊。

在2015年的 ImageNet ILSVRC挑戰賽中,勝出的是來自微軟的 ResNet,誤差率為3.57%。在某種意義上, ResNet就是VGG結構反覆重複後更深的網絡。與 VGGNet不同, ResNet有不同的深度,比如34層、50層、101層和152層。與8層的 AlexNet、19層的 VGGNet和22層的 GoogLeNet相比, ResNet多達152層 ResNet架構是一堆殘餘快。

其主要思想是通過向神經網絡添加連接來跳過多個層。每個殘餘塊都有3×3的卷積層。在最後一個卷積層之後,添加一個GAP層。只有一個全連接層可以對1000個類別進行分類。ResNet有不同的深度變體,例如基於 ImageNet數據集的34、50、101和152層。對於一個較深層次的網絡,比如超過50層,它將使用 bottleneck特性來提高效率。本網絡不使用 dropout。

需要注意的其他網絡架構包括:

7小結

在這一篇文章,我們學習了不同的CNN架構。這些模型是預先訓練好的已存在的模型,且在網絡架構上有所不同。每個網絡都是為解決特定架構的問題而設計的。所以,這裡我們描述了它們的架構差異。

參考資料:

1.Practical Convolutional Neural Networks: Implement advanced deep learning models using Python Paperback 王彩霞譯

2.github.com/huanghanchi/Practical-Convolutional-Neural-Networks/blob/master/Chapter04/CNN_1.py

知乎地址:https://zhuanlan.zhihu.com/p/93069133


相關焦點

  • 12 個 CNN 經典模型論文整理與 PyTorch 實現!
    點擊上方「深度學習專欄」,選擇「置頂」公眾號重磅乾貨,第一時間送達最近發現了一份不錯的原始碼,作者使用 PyTorch 實現了如今主流的卷積神經網絡 CNN 框架,包含了 12 中模型架構CNN 模型(12 篇)(lenet) LeNet-5, convolutional neural networks論文地址:http://yann.lecun.com/exdb/lenet/(alexnet) ImageNet Classification
  • 五個很厲害的 CNN 架構
    Five Powerful CNN Architectures作者 | Faisal Shahbaz翻譯 | 小哥哥、Jaruce、zackary、Disillusion校對 | 醬番梨        整理 | 菠蘿妹原文連結:https://medium.com/@faisalshahbaz/five-powerful-cnn-architectures-b939c9ddd57b
  • TensorFlowNews五大經典卷積神經網絡介紹:LeNet / AlexNet / GoogLeNet / VGGNet/
    前言:這個系列文章將會從經典的卷積神經網絡歷史開始,然後逐個講解卷積神經網絡結構,代碼實現和優化方向。(以下內容來翻譯自史丹福大學課程:http://cs231n.github.io/convolutional-networks/)在卷積網絡領域有幾個有名字的體系結構。
  • ResNet, AlexNet, VGG, Inception: 理解各種各樣的CNN架構
    特徵提取之後,使用圖像的這些特徵與其對應的類別標籤訓練一個分類模型。常用的分類模型有SVM,LR,隨機森林及決策樹等。上面流程的一大問題是特徵提取不能根據圖像和其標籤進行調整。如果選擇的特徵缺乏一定的代表性來區分各個類別,模型的準確性就大打折扣,無論你採用什麼樣的分類策略。
  • 常用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
  • 細品經典:LeNet-1, LeNet-4, LeNet-5, Boosted LeNet-4
    >在這個故事中,我將對以下網絡架構做一個簡短的回顧:Baseline Linear ClassifierOne-Hidden-Layer Fully Connected Multilayer NNTwo-Hidden-Layer Fully Connected Multilayer NNLeNet-1LeNet-4LeNet-
  • [深度學習] AlexNet,GoogLeNet,VGG,ResNet簡化版
    總結了一下這幾個網絡的比較重要的點,像這些經典的網絡,面試的時候,估計會經常問到,怎麼用自己的話說出來?不知道大家想過沒有。
  • 深度學習100+經典模型TensorFlow與Pytorch代碼實現大集合
    rasbt在Github上整理了關於深度學習模型TensorFlow和Pytorch代碼實現集合,含有100個,各種各樣的深度學習架構,模型,和技巧的集合Jupyter Notebooks,從基礎的邏輯回歸到神經網絡到CNN到GNN等,可謂一網打盡,值得收藏!
  • VGGNet、ResNet、Inception和Xception圖像分類及對比
    在這種背景下,目標是訓練一個模型,可以將輸入圖像分類為 1000 個獨立的對象類別。本節將使用由超過 120 萬幅訓練圖像、50000 幅驗證圖像和 100000 幅測試圖像預訓練出的模型。由於 Xception 架構具有與 Inception-v3 相同的參數數量,因此性能提升不是由於容量的增加,而是由於更高效地使用了模型參數。圖像分類準備工作本節使用 Keras 因為這個框架有上述模塊的預處理模塊。Keras 在第一次使用時會自動下載每個網絡的權重,並將這些權重存儲在本地磁碟上。換句話說,你不需要重新訓練網絡,而是使用網際網路上已有的訓練參數。
  • 深度學習算法優化:VGG,ResNet,DenseNe 模型剪枝代碼實戰
    深度學習算法優化系列七 | ICCV 2017的一篇模型剪枝論文,也是2019年眾多開源剪枝項目的理論基礎 。這篇文章是從源碼實戰的角度來解釋模型剪枝,源碼來自:https://github.com/Eric-mingjie/network-slimming 。我這裡主要是結合源碼來分析每個模型的具體剪枝過程,希望能給你剪枝自己的模型一些啟發。
  • 實戰 | 基於深度學習模型VGG的圖像識別(附代碼)
    本文演示了如何使用百度公司的PaddlePaddle實現基於深度學習模型VGG的圖像識別。準備工作VGG簡介牛津大學VGG(Visual Geometry Group)組在2014年ILSVRC提出的模型被稱作VGG模型 。
  • 小白學PyTorch | 5 torchvision預訓練模型與數據集全覽
    他們都有兩個相同的參數:transform和target_transform(後面細講)我們就用最經典最簡單的MNIST手寫數字數據集作為例子,先看這個的API:構建模型可以通過下面的代碼:import torchvision.models as modelsresnet18
  • 【小白學PyTorch】5.torchvision預訓練模型與數據集全覽
    他們都有兩個相同的參數:transform和target_transform(後面細講)我們就用最經典最簡單的MNIST手寫數字數據集作為例子,先看這個的API:在torch1.6.0版本中(應該是比較近的版本),主要包含下面的預訓練模型:構建模型可以通過下面的代碼:import torchvision.models as modelsresnet18 = models.resnet18
  • 零基礎入門深度學習(七):圖像分類任務之VGG、GoogLeNet和ResNet
    在上一節課中,我們為大家介紹了經典的LeNet和AlexNet神經網絡結構在眼疾識別任務中的應用,本節將繼續為大家帶來更多精彩內容。VGG是當前最流行的CNN模型之一,2014年由Simonyan和Zisserman提出,其命名來源於論文作者所在的實驗室Visual Geometry Group。AlexNet模型通過構造多層網絡,取得了較好的效果,但是並沒有給出深度神經網絡設計的方向。