【論文解讀】CNN深度卷積神經網絡-AlexNet

30.jpg

前言

本文主要CNN系列論文解讀——AlexNet的簡介、模型結構、參數計算、網絡結構的代碼實現等。原文發表于語雀文檔,排版更好看,目錄如下:
【論文解讀】CNN深度卷積神經網絡-AlexNet · 語雀?www.yuque.com

更多CNN論文解讀系列:

【論文解讀】CNN深度卷積神經網絡-AlexNet
【論文解讀】CNN深度卷積神經網絡-VGG
【論文解讀】CNN深度卷積神經網絡-Network in Network
【論文解讀】CNN深度卷積神經網絡-GoogLeNet
【論文解讀】CNN深度卷積神經網絡-ResNet
【論文解讀】CNN深度卷積神經網絡-DenseNet
有用的話,請點個贊哦:)


1.簡介

最早將CNN用于圖像分類領域的是90年代提出的LeNet,不過由于其效果并沒有大幅領先傳統的機器學習,故用的人比較少。 AlexNet是2012年論文《ImageNet Classification with Deep ConvolutionalNeural Networks》中提出的一種卷積神經網絡結構,并在12年的ImageNet分類賽上以大幅優勢領先第二名,從而使得深度卷積神經網絡CNN在圖像分類上的應用掀起一波熱潮,除此以外AlexNet有很多開創的進展,譬如使用Relu激活函數大幅提升訓練速度,采用了先進的Dropout,數據擴增,雙GPU并行訓練等。AlexNet成為后面卷積神經網絡模型的效仿對象和標桿。

還有一點,論文中采取了一種新的正則化方法:局部響應歸一化/正則化Local Respose Normalization(LRU)在之后被證明并無多少實際效果,故很少有應用,而Dropout的方式則得到了大規模的繼承。

1.1 資源下載

【2012】【AlexNet】imagenet-classification-with-deep-convolutional-neural-networks.pdf

2.Abstract

Abstract

We trained a large, deep convolutional neural network to classify the 1.2 million high-resolution images in the ImageNet LSVRC-2010 contest into the 1000 different classes. On the test data, we achieved top-1 and top-5 error rates of 37.5% and 17.0% which is considerably better than the previous state-of-the-art. The neural network, which has 60 million parameters and 650,000 neurons, consists of five convolutional layers, some of which are followed by max-pooling layers,and three fully-connected layers with a final 1000-way softmax. To make training faster, we used non-saturating neurons and a very efficient GPU implementation of the convolution operation. To reduce overfitting in the fully-connected layers we employed a recently-developed regularization method called “dropout”that proved to be very effective. We also entered a variant of this model in the ILSVRC-2012 competition and achieved a winning top-5 test error rate of 15.3%,compared to 26.2% achieved by the second-best entry.

翻譯

我們訓練了一個大型的深度卷積神經網絡,將ImageNet ILSVRC -2010競賽中的120萬幅高分辨率圖像分類為1000個不同的類。在測試數據上,我們的分別top-1和top-5錯誤率分別為37.5%和17.0%,比之前的水平有了很大的提高。該神經網絡有6000萬個參數和65萬個神經元,由5個卷積層(其中一些是Max pooling池化層)和3個全連接層(最后的1000路softmax層)組成。為了使訓練更快,我們使用了非飽和神經元和一個非常高效的GPU卷積運算方式(p.s.使用了Relu和雙路GPU)。為了減少全連通層的過擬合,我們采用了一種最近開發的正則化方法“Dropout”,該方法被證明是非常有效的。我們還在ILSVRC-2012比賽中加入了該模型的一個變體,并以top-5測試錯誤率15.3%獲勝,而第二名則是26.2%。

3.網絡結構

3.1 示意圖

由于當年的GPU限制,使用的是兩個GTX580雙路并行的訓練模式(GTX 580 GPU只有3GB的內存),且訓練了5~6天才得到。論文中的網絡結構圖如下:

image

現在的GPU可以訓練足夠大的CNN網絡,這里合并一下,網絡如下:

image

3.2 layer設計

整個AlexNet網絡共12層,包括輸入層×1、卷積層×5、池化層×3、全連接層×3,示意圖中隱藏了池化層。

第1層輸入層: 輸入為224×224×3 三通道的圖像。

第2層Conv層: 輸入為224×224×3,經過96個kernel size為11×11×3的filter,stride = 4卷積后得到shape為55×55×96的卷積層。P.S.個人猜測:這里(224-11)/4 + 1 = 54.25,為了不丟棄特征,故多滑動了一步為55,或者和雙路GPU的設計有關?!按照論文中filter size和stride的設計,輸入的圖片尺寸應該為227×227×3。

第3層Max-pooling層: 輸入為55×55×96,經Overlapping pooling(重疊池化)pool size = 3,stride = 2后得到尺寸為27×27×96 的池化層

第4層Conv層: 輸入尺寸為27×27×96,經256個5×5×96的filter卷積,padding=same得到尺寸為27×27×256的卷積層

第5層池化層: 輸入為27×27×256,,經pool size = 3,stride = 2的重疊池化,得到尺寸為13×13×256的池化層。

第6~8層Conv層: 第6層輸入為13×13×256,經384個3×3×256的filter卷積得到13×13×384的卷積層。 第7層輸入為13×13×384,經384個3×3×384的filter卷積得到13×13×384的卷積層。 第8層輸入為13×13×384,經256個3×3×384的filter卷積得到13×13×256的卷積層。 這里可見,這三層卷積層使用的kernel前兩個維度都是3×3,只是通道維不同。

第9層Max-pooling層: 輸入尺寸為13×13×256,經pool size = 3,stride = 2的重疊池化得到尺寸為6×6×256的池化層。該層后面還隱藏了flatten操作,通過展平得到9216個參數后與之后的全連接層相連。

第10~12層Dense層: 第10~12層神經元個數分別為4096,4096,1000。其中前兩層在使用relu后還使用了Dropout對神經元隨機失活,最后一層全連接層用softmax輸出1000個分類。

3.3參數計算

根據論文描述,AlexNet中有65萬個神經元,包括了6000萬個參數。下面我們進行參數計算,由于池化層不涉及參數計算,我們重點關注5個卷積層和最后3個全連接層。

image

4.論文解讀

1. 介紹

得益于GPU的發展,我們可以構建大尺寸的CNN網絡,而且當數據集規模和GPU能力更強時,訓練效果會更好;最終的AlexNet網絡包含5個卷積層和3個全連接層,這個深度很重要:去掉任何卷積層(每個不超過模型參數的1%)都會導致性能表現低下。

2. 數據集

這一節介紹了ImageNet數據集和ILSVRC的來源。ImageNet是一個包含超過1500萬張高分辨率圖像的數據集,屬于大約22000個類別。這些圖片是從網上收集來的,并由人工貼標簽者使用Amazon的土耳其機器人眾包工具進行標記。從2010年開始,作為Pascal Visual Object Challenge的一部分,每年都會舉辦一場名為ImageNet大型視覺識別挑戰賽(ILSVRC)的比賽。ILSVRC使用ImageNet的一個子集,每個類別大約有1000張圖片。總共大約有120萬張訓練圖像、5萬張驗證圖像和15萬張測試圖像。

3. 網絡結構The Architecture

3.1 非線性Relu

比較了在CIFAR-10數據集下,一個4層卷積的網絡結構,在以tanh和relu作為激活單元時損失和訓練輪數的關系,得出結論:使用ReLUs進行深度卷積神經網絡訓練的速度比使用tanh訓練的速度快幾倍

image

3.2 多GPU并行訓練

論文中展示的多GPU并行訓練是在當時GPU的內存較小的情況下,采用的無奈操作,得益于現在GPU內存的高速發展,此類操作如今沒有使用的必要了。

3.3 LRN

論文中提出,采用LRN局部響應正則化可以提高模型的泛化能力,所以在某些層應用了ReLU后,加上了LRN使得top-1和top-5的錯誤率分別降低了1.4%和1.2%。但是由于實際作用不大,后面LRN的方式并沒有被人們廣泛使用 3.4 Overlapping Pooling 論文中的Maxpooling采用的是重疊池化,傳統池化時卷積核提取的每一小塊特征不會發生重合,譬如kernel size記為z×z,步長stride記為s,當z = s時,就不會發生重合,當z > s時,就會發生重合,即重疊池化。AlexNet訓練中的stride為2,kernel size為z = 3,使用的就是重疊池化。 **

4. 降低過擬合

4.1 數據擴增

為了降低過擬合,提高模型的魯棒性,這里采用了兩種Data Augmentation數據擴增方式

  • 1.生成圖像平移和水平反射。通過從256×256幅圖像中提取隨機224×224塊圖像(及其水平反射),并在這些提取的圖像上訓練我們的網絡。這將我們的訓練集的大小增加了2048倍
  • 2.改變了訓練圖像中RGB通道的強度。在整個imagenet訓練集中對RGB像素值集執行PCA操作

4.2 Dropout

訓練采用了0.5丟棄率的傳統Dropout,對于使用了Dropout的layer中的每個神經元,訓練時都有50%的概率被丟棄。所以每次輸入時,神經網絡都會對不同的結構進行采樣,但是所有這些結構都共享權重。這種技術減少了神經元之間復雜的相互適應,因為神經元不能依賴于其他神經元的存在。因此,它被迫獲得更健壯的特征。測試時使用所有的神經元,但將它們的輸出乘以0.5。 論文中還提到了:Dropout使收斂所需的迭代次數增加了一倍

5.學習細節

訓練使用的是小批量隨機梯度下降,batch size = 128,動量momentum為0.9,weight deay權重衰減為0.0005;每一層的權重初始化為均值1標準差0.01的正態分布,在第2,4,5卷積層和全連接層中的bias初始化為常數1,其余層則為0.所有層采用了相同的初始化為0.01的學習率,不過可以手動調整。整個訓練過程在兩臺NVIDIA GTX 580 3GB gpu上用了5到6天的時間,120萬張圖像的訓練集,大約90輪迭代。 論文中提到:weight deay對模型的學習很重要。換句話說,這里的重量衰減不僅僅是一個正則化器:它減少了模型的訓練誤差。

7.討論

論文中指出:一個大型的、深度的卷積神經網絡能夠在一個高度挑戰的數據集上使用純監督學習獲得破紀錄的結果。如果去掉AlexNet網絡中的任意個卷積層,整體性能就會下降約2%,可見,網絡的深度很重要。

5.代碼實現

這里使用tensorflow2.0實現網絡結構,而不是完整的訓練。

import tensorflow as tf
# tf版本為2.0.0
net = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(filters=96, kernel_size=11, strides=4, activation='relu'),
    tf.keras.layers.MaxPool2D(pool_size=3, strides=2),
    tf.keras.layers.Conv2D(filters=256, kernel_size=5, padding='same', activation='relu'),
    tf.keras.layers.MaxPool2D(pool_size=3, strides=2),
    tf.keras.layers.Conv2D(filters=384, kernel_size=3, padding='same', activation='relu'),
    tf.keras.layers.Conv2D(filters=384, kernel_size=3, padding='same', activation='relu'),
    tf.keras.layers.Conv2D(filters=256, kernel_size=3, padding='same', activation='relu'),
    tf.keras.layers.MaxPool2D(pool_size=3, strides=2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(4096, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(4096, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(1000, activation='softmax')
])

# 輸出每一層的shape
X = tf.random.uniform((1,227,227,3)) # 這里為了演示正確,輸入改為227而不是論文中的224
for layer in net.layers:
    X = layer(X)
    print(layer.name, 'output shape\t', X.shape)

輸出:

conv2d output shape  (1, 55, 55, 96)
max_pooling2d output shape   (1, 27, 27, 96)
conv2d_1 output shape    (1, 27, 27, 256)
max_pooling2d_1 output shape     (1, 13, 13, 256)
conv2d_2 output shape    (1, 13, 13, 384)
conv2d_3 output shape    (1, 13, 13, 384)
conv2d_4 output shape    (1, 13, 13, 256)
max_pooling2d_2 output shape     (1, 6, 6, 256)
flatten output shape     (1, 9216)
dense output shape   (1, 4096)
dropout output shape     (1, 4096)
dense_1 output shape     (1, 4096)
dropout_1 output shape   (1, 4096)
dense_2 output shape     (1, 1000)

在《動手學深度學習》-tf2.0版一書中,有完整的訓練代碼。不過由于ImageNet規模較大,故數據集使用的是Fashion-MNIST,完整訓練可參考:深度卷積神經網絡(AlexNet)

6.總結

  • 1.AlexNet和LeNet設計上有一脈相承之處,也有區別。為了適應ImageNet中大尺寸圖像,其使用了大尺寸的卷積核,從11×11到5×5到3×3,AlexNet的卷積層和全連接層也帶來更多的參數6000萬(LeNet只有6萬),這一全新設計的CNN結構在圖像分類領域取大幅超越傳統機器學習,自此之后CNN在圖像分類領域被廣泛應用。
  • 2.使用了Relu替換了傳統的sigmoid或tanh作為激活函數,大大加快了收斂,減少了模型訓練耗時。
  • 3.使用了Dropout,提高了模型的準確度,減少過擬合,這一方式再后來也被廣泛采用。
  • 4.使用數據了2種數據擴增技術,大幅增加了訓練數據,增加模型魯棒性,減少過擬合。
  • 5.使用了LRN正則化、多GPU并行訓練的模式(不過之后并沒有被廣泛應用)
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容