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

貪心科技發表於2020-05-06

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

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

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

1.ImageNet介紹

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

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

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

2.LeNet

經典的CNN模型架構-LeNet、AlexNet、VGG、GoogleLeNet、ResNet
圖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在今天仍然廣泛使用。比如計算機視覺

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

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

經典的CNN模型架構-LeNet、AlexNet、VGG、GoogleLeNet、ResNet
圖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架構如下所示:

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

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

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

VGG16影像分類程式碼示例

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

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

1from google.colab import files
2
3uploaded = files.upload()
經典的CNN模型架構-LeNet、AlexNet、VGG、GoogleLeNet、ResNet

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

 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])

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

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

第一次執行上述程式碼時, 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所示。

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

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

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

5.2inception模組示例

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

6 .ResNet架構

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

經典的CNN模型架構-LeNet、AlexNet、VGG、GoogleLeNet、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。

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

  • 網路中的網路。
  • 超越ResNet
  • 分形網路,一種沒有殘餘的超深神經網路

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

相關文章