卷積神經網絡AlexNet

NO IMAGE

卷積神經網絡 AlexNet

1.介紹

LeNet 是最早推動深度學習領域發展的卷積神經網絡之一。這項由 Yann LeCun 完成的開創性工作自 1988 年以來多次成功迭代之後被命名為 LeNet5。AlexNet 是 Alex Krizhevsky 等人在 2012 年發表的《ImageNet Classification with Deep Convolutional Neural Networks》論文中提出的,並奪得了 2012 年 ImageNet LSVRC 的冠軍,引起了很大的轟動。AlexNet 可以說是具有歷史意義的一個網絡結構,在此之前,深度學習已經沉寂了很長時間,自 2012 年 AlexNet 誕生之後,後面的 ImageNet 冠軍都是用卷積神經網絡(CNN)來做的,並且層次越來越深,使得CNN成為在圖像識別分類的核心算法模型,帶來了深度學習的大爆發。本文將詳細講解 AlexNet 模型及其使用 Keras 實現過程。開始之前,先介紹一下卷積神經網絡。

2. 卷積神經網絡

2.1 卷積層

卷積是一種數學運算,它採用某種方式將一個函數“應用”到另一個函數,結果可以理解為兩個函數的“混合體”。不過,這對檢測圖像中的目標有何幫助?事實證明,卷積非常擅長檢測圖像中的簡單結構,然後結合這些簡單特徵來構造更復雜的特徵。在卷積網絡中,會在一系列的層上發生此過程,每層對前一層的輸出執行一次卷積。卷積運算的目的是提取輸入的不同特徵,第一層卷積層可能只能提取一些低級的特徵如邊緣、線條和角等層級,更多層的網路能從低級特徵中迭代提取更復雜的特徵。
那麼,您會在計算機視覺中使用哪種卷積呢?要理解這一點,首先了解圖像到底是什麼。圖像是一種二階或三階字節數組,二階數組包含寬度和高度 2 個維度,三階數組有 3 個維度,包括寬度、高度和通道,所以灰階圖是二階的,而 RGB 圖是三階的(包含 3 個通道)。字節的值被簡單解釋為整數值,描述了必須在相應像素上使用的特定通道數量。所以基本上講,在處理計算機視覺時,可以將一個圖像想象為一個 2D 數字數組(對於 RGB 或 RGBA 圖像,可以將它們想象為 3 個或 4 個 2D 數字數組的相互重疊)。

卷積神經網絡AlexNet

圖1:卷積運算示意圖(左輸入,中過濾器,右輸出)點我看計算演示
應該注意的是,步幅和過濾器大小是超參數,這意味著模型不會學習它們。所以您必須應用科學思維來確定這些數量中的哪些值最適合您的模型。對於卷積,您需要理解的最後一個概念是填充。如果您的圖像無法在整數次內與過濾器擬合(將步幅考慮在內),那麼您必須填充圖像。可通過兩種方式實現此操作:VALID 填充和 SAME 填充。基本上講,VALID 填充丟棄了圖像邊緣的所有剩餘值。也就是說,如果過濾器為 2 x 2,步幅為 2,圖像的寬度為 3,那麼 VALID 填充會忽略來自圖像的第三列值。SAME 填充向圖像邊緣添加值(通常為 0)來增加它的維數,直到過濾器能夠擬合整數次。這種填充通常以對稱方式進行的(也就是說,會嘗試在圖像的每一邊添加相同數量的列/行)。

2.2 激活層

激活層主要是激活函數的作用,那麼什麼是激活函數呢?在神經網絡中,當輸入激勵達到一定強度,神經元就會被激活,產生輸出信號。模擬這一細胞激活過程的函數,就叫激活函數。將神經元的輸出 f,作為其輸入 x 的函數,對其建模的標準方法是用

卷積神經網絡AlexNet

或者 sigmoid 函數

卷積神經網絡AlexNet

。就梯度下降的訓練時間而言,AlexNet 提出了比上面方式快 6 倍的 ReLu 函數

卷積神經網絡AlexNet

。ReLU 全稱為修正線性單元(Rectified Linear Units)是一種針對元素的操作(應用於每個像素),並將特徵映射中的所有負像素值替換為零的非線性操作。其目的是在卷積神經網絡中引入非線性因素,因為在實際生活中我們想要用神經網絡學習的數據大多數都是非線性的(卷積是一個線性運算 —— 按元素進行矩陣乘法和加法,所以我們希望通過引入 ReLU 這樣的非線性函數來解決非線性問題)。

卷積神經網絡AlexNet

圖2: ReLU 函數(輸入小於0則輸出為0,輸入大於0則輸出原值)

2.3 池化層

您會在卷積網絡中看到的另一種重要的層是池化層。池化層具有多種形式:最大值,平均值,求和等。但最常用的是最大池化,其中輸入矩陣被拆分為相同大小的分段,使用每個分段中的最大值來填充輸出矩陣的相應元素。池化層可以被認為是由間隔為 s 個像素的池單元網格組成,每個池彙總了以池單元的位置為中心的大小為 z×z 的鄰域。如果我們設置 s = z(池化窗口大小與步長相同),我們獲得在 CNN 中常用的傳統的局部合併。 如果我們設置 s<z(每次移動的步長小於池化的窗口長度),我們就獲得重疊池化。在 AlexNet 中首次使用重疊池化來避免過擬合。

卷積神經網絡AlexNet

圖3:最大池化(左 16X16 大小分成了 4 塊,黑子圈中是最大的數字)

2.4 全連接層

全連接層是一個傳統的多層感知器,它在輸出層使用 softmax 激活函數(也可以使用其他分類器,比如 SVM)。“完全連接”這個術語意味著前一層中的每個神經元都連接到下一層的每個神經元。 這是一種普通的卷積網絡層,其中前一層的所有輸出被連接到下一層上的所有節點。卷積層轉換為全連接層時,總神經元個數不變。

3. AlexNet 模型

3.1 模型介紹

卷積神經網絡AlexNet

圖4:AlexNet 模型( 5 卷積層+ 3 全連接層共 8 層神經網絡,使用 2GPU 故分上下兩部分)
AlexNet 模型包含 6 千萬個參數和 65 萬個神經元,包含 5 個卷積層,其中有幾層後面跟著最大池化(max-pooling)層,以及 3 個全連接層,最後還有一個 1000 路的 softmax 層。為了加快訓練速度,AlexNet 使用了 Relu 非線性激活函數以及一種高效的基於 GPU 的卷積運算方法。為了減少全連接層的過擬合,AlexNet 採用了最新的 “Dropout”防止過擬合方法,該方法被證明非常有效。

3.2 局部歸一化(Local Response Normalization,簡稱LRN)

在神經生物學有一個概念叫做“側抑制”(lateral inhibitio),指的是被激活的神經元抑制相鄰神經元。歸一化(normalization)的目的是“抑制”,局部歸一化就是借鑑了“側抑制”的思想來實現局部抑制,尤其當使用 ReLU 時這種“側抑制”很管用,因為 ReLU 的響應結果是無界的(可以非常大),所以需要歸一化。使用局部歸一化的方法有助於增加泛化能力。

卷積神經網絡AlexNet

4. AlexNet 過擬合處理

4.1 數據擴充

減少圖像數據過擬合最簡單最常用的方法,是使用標籤-保留轉換,人為地擴大數據集。AlexNet 模型使用兩種不同的形式,這兩種形式都允許轉換圖像用很少的計算量從原始圖像中產生,所以轉換圖像不需要存儲在磁盤上。數據擴充的第一種形式由生成圖像轉化和水平反射組成。數據擴充的第二種形式包含改變訓練圖像中 RGB 通道的強度。

卷積神經網絡AlexNet

圖5:數據擴充三種方式

4.2 Dropout

對某一層神經元,Dropout 做的就是以 0.5 的概率將每個隱層神經元的輸出設置為零。以這種方式 “Dropped out” 的神經元既不用於前向傳播,也不參與反向傳播。所以每次提出一個輸入,該神經網絡就嘗試一個不同的結構,所有這些結構之間共享權重。因為神經元不能依賴於其他特定神經元而存在,所以這種技術降低了神經元複雜的互適應關係。正因如此,要被迫學習更為魯棒的特徵,這些特徵在結合其他神經元的一些不同隨機子集時有用。如果沒有 Dropout,AlexNet 網絡會表現出大量的過擬合。

卷積神經網絡AlexNet

圖6:Dropout示意圖

5. 源碼解讀

5.1數據集和導入依賴庫

# (1) Importing dependency
import keras
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.layers.normalization import BatchNormalization
import numpy as np
np.random.seed(1000)
# (2) Get Data
import tflearn.datasets.oxflower17 as oxflower17
x, y = oxflower17.load_data(one_hot=True)
# (3) Create a sequential model
model = Sequential()

AlexNet 模型建立在千分類問題上,其算力對計算機要求很高。這裡我們為了簡單復現,使用了 TensorFlow 的數據集 oxflower17 ,此數據集對花朵進行17 分類,每個分類有 80 張照片。Keras 包含許多常用神經網絡構建塊的實現,例如層、目標、激活函數、優化器和一系列工具,可以更輕鬆地處理圖像和文本數據。在 Keras 中有兩類主要的模型:Sequential 順序模型和使用函數式 API 的 Model 類模型。這裡使用 Sequential 模型。

5.3 第一次卷積+池化

# 1st Convolutional Layer
model.add(Conv2D(filters=96, input_shape=(224,224,3), kernel_size=(11,11), strides=(4,4), padding='valid'))
model.add(Activation('relu'))
# Pooling 
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# Batch Normalisation before passing it to the next layer
model.add(BatchNormalization())

卷積神經網絡AlexNet

卷積層 1 大小 224X224X3,卷積核大小 11X11X3,數量 48,步長為 4。
關於卷積層的計算如下:

  • 輸入數據體尺寸為
    卷積神經網絡AlexNet
  • 4個超參數(模型不會學習優化):
    1. 濾波器數量
      卷積神經網絡AlexNet
    2. 濾波器空間尺寸
      卷積神經網絡AlexNet
    3. 卷積運算步長
      卷積神經網絡AlexNet
    4. 零填充數量(SAME 填充)
      卷積神經網絡AlexNet
  • 輸出數據體尺寸為
    卷積神經網絡AlexNet
    • 卷積神經網絡AlexNet
    • 卷積神經網絡AlexNet
    • 卷積神經網絡AlexNet

這裡 W1=224,H1=224,D1=3,K=48,F=11,S=4,P=1.5。

計算卷積層 2 有 W2=(224-11+3)/4+1=55,同理 H2=55,D2=K*2=96。

經過卷積運算後,輸出特徵圖像大小為 55X55X96。
這裡使用了最大池化,步長為 S=2,則 W=(55-3)/2+1=27。
再經過池化後,輸出特徵圖像大小為 27X27X96。

5.4 第二次卷積+池化

# 2nd Convolutional Layer
model.add(Conv2D(filters=256, kernel_size=(11,11), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Pooling
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# Batch Normalisation
model.add(BatchNormalization())

卷積神經網絡AlexNet

卷積層 2 大小 55X55X96,卷積核大小 5X5,數量為 128 個,步長為 1。

同理,可以計算卷積後得到特徵圖像大小為 27X27X256。
經過池化,輸出特徵圖像大小為 13X13X256。**

5.5 第三次卷積

# 3rd Convolutional Layer
model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Batch Normalisation
model.add(BatchNormalization())

卷積神經網絡AlexNet

經過卷積後,特徵圖像大小為 13X13X384。

5.6 第四次卷積

# 4th Convolutional Layer
model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Batch Normalisation
model.add(BatchNormalization())

卷積神經網絡AlexNet

經過卷積後,特徵圖像大小為 13X13X284。

5.7 第五次卷積+池化

# 5th Convolutional Layer
model.add(Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Pooling
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# Batch Normalisation
model.add(BatchNormalization())

卷積神經網絡AlexNet

經過卷積後,特徵圖像大小為 13X13X256。

經過池化後,特徵圖像大小為 6X6X256。

5.8 全連接層6

# Passing it to a dense layer
model.add(Flatten())
# 1st Dense Layer
model.add(Dense(4096, input_shape=(224*224*3,)))
model.add(Activation('relu'))
# Add Dropout to prevent overfitting
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())

卷積神經網絡AlexNet

全連接層6大小為 6X6X256,共 4096 個神經元,輸出 4096X1 的向量。

5.9 全連接層7

# 2nd Dense Layer
model.add(Dense(4096))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())

卷積神經網絡AlexNet

全連接層7大小為 4096X1,共 4096 個神經元,輸出 4096X1 的向量。

5.10 全連接層8

# 3rd Dense Layer
model.add(Dense(1000))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())

卷積神經網絡AlexNet

全連接層8輸入大小為4096X1,共 4096 個神經元,輸出 1000X1 的向量。

5.11 輸出層及訓練

# Output Layer
model.add(Dense(17))
model.add(Activation('softmax'))
model.summary()
# (4) Compile 
model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'])
# (5) Train
model.fit(x, y, batch_size=64, epochs=1, verbose=1, validation_split=0.2, shuffle=True)

最後在全連接層經過softmax激活函數後得到結果。

卷積神經網絡AlexNet

在結果損失函數圖中,訓練集的損失值在迭代23次時達到最小。由於數據量有限,測試集的損失值無法降到理想位置。(橫座標是迭代次數,縱座標是損失函數的值)

卷積神經網絡AlexNet

可以看出,在訓練集上可以達到近90%的準確率。(橫座標是迭代次數,縱座標是準確率)
由於數據集太小,測試集的準確率無法達到理想的值。

6. 總結與展望

目前,您可以在  Mo 平臺中找到基於 AlexNet 的項目 Flower,此項目對原文的千分類進行整合,最終做成花卉的17分類。您在學習的過程中,遇到困難或者發現我們的錯誤,可以隨時聯繫我們。
項目源碼地址:www.momodel.cn:8899/explore/5cf…

總結一下 AlexNet 的主要貢獻:

  1. 2 路 GPU 實現,加快了訓練速度
  2. Relu 非線性激活函數,減少訓練時間,加快訓練速度
  3. 重疊池化,提高精度,不容易產生過擬合
  4. 為了減少過擬合,使用了數據擴充和 “Dropout”
  5. 使用局部響應歸一化,提高精度
  6. 5 個卷積層+ 3 個全連接層,結構性能良好

7. 參考

關於我們

Mo(網址:momodel.cn)是一個支持 Python 的人工智能在線建模平臺,能幫助你快速開發、訓練並部署模型。


Mo 人工智能俱樂部 是由網站的研發與產品設計團隊發起、致力於降低人工智能開發與使用門檻的俱樂部。團隊具備大數據處理分析、可視化與數據建模經驗,已承擔多領域智能項目,具備從底層到前端的全線設計開發能力。主要研究方向為大數據管理分析與人工智能技術,並以此來促進數據驅動的科學研究。

目前俱樂部每週六在杭州舉辦以機器學習為主題的線下技術沙龍活動,不定期進行論文分享與學術交流。希望能匯聚來自各行各業對人工智能感興趣的朋友,不斷交流共同成長,推動人工智能民主化、應用普及化。

卷積神經網絡AlexNet

相關文章

使用Seq2Seq實現中英文翻譯

電商購物評論的情感分析

積神經網絡GoogLeNet

殘差網絡