Alexnet網路在LeNet-5網路的基礎上發展起來,該網路是加深網路的開山之作,也即深度學習發展過程中的一個重要里程碑。該網路的主要創新點為:
1。 使用Relu函式作為啟用函式;
2。 增加Dropout方法來避免過擬合;
3。 使用最大值池化,之前的神經網路都使用均值池化;
4。 增加LRN層來增強模型的泛化能力(
後人證明L
RN的作用很小,所以一般都去掉了LRN層)。
無LRN層的Alexnet網路結構如下圖所示,其主要由
5個卷積層conv1~conv5
、
3個最大值池化層pool1~pool3
、
3個Affine層fc1~fc3
,以及輸出端的
Softmax層
構成。下文我們將分別講解各層的結構、原理。
01
—
conv1層
conv1為Alexnet網路的輸入層,將其資訊列出如下:
輸入
:3張227*227影象(也可以理解為一張227*227的RGB彩色圖,其具有三通道,每通道為1張227*227影象)。
卷積核
:96個3*11*11卷積核。
卷積步長
:4。
前文中我們講過卷積步長的概念,當時我們預設步長為1,也就是預設卷積視窗自左向右、從上往下滑動的步長為1個畫素點,但此處卷積步長不再是1個畫素點,而是4個畫素點:
卷積神經網路原理及其C++/Opencv實現(1)
填充(padding)
:0。
我們舉個例子來說明填充操作。假設填充長度為n,那麼將在矩陣左、右側都填充n列,上、下側都填充n行,如下圖所示:
輸出
:96個55*55卷積結果。這裡之所以得到55*55的卷積結果,可按以下公式計算:
行:(227-11)/4+1=55
列:(227-11)/4+1=55
更廣泛的公式:
行:(輸入行數+padding*2-卷積核行數)/卷積步長+1
列:(輸入列數+padding*2-卷積核列數)/卷積步長+1
這裡的卷積核為3個通道,也即維度為3*11*11,只因其輸入為3通道資料,所以每通道的輸入資料對應1個通道的11*11卷積核,最後把3通道資料對應位置的卷積結果相加,就是最終的卷積結果。假設卷積核為3通道的3*3矩陣,卷積步長為1,那麼3通道影象中某一點的卷積操作如下圖所示:
通道1的卷積結果:Σx1i*k1i,0≤i≤9
通道2的卷積結果:Σx2i*k2i,0≤i≤9
通道3的卷積結果:Σx3i*k3i,0≤i≤9
該點的最終卷積結果:Σx1i*k1i+Σx2i*k2i+Σx3i*k3i,0≤i≤9
02
—
pool1層
本層為最大值池化層,關於最大值池化操作、均值池化操作我們在前文講過:
卷積神經網路原理及其C++/Opencv實現(2)
下面列出該層的資訊:
輸入
:96張55*55的卷積結果圖。
池化視窗尺寸
:3*3。
池化視窗滑動步長
:2個畫素點。
池化模式
:最大值池化。
輸出尺寸
:96張27*27的池化結果。這裡得到的27*27尺寸與上述卷積結果的尺寸類似:
行:(55-3)/2+1=27
列:(55-3)/2+1=27
也即:
行:(輸入行數-池化視窗行數)/池化視窗滑動步長+1
列:(輸入列數-池化視窗列數)/池化視窗滑動步長+1
03
—
conv2層
conv2卷積層的資訊列出如下:
輸入
:96張27*27影象。
卷積核
:256個5*5卷積核。
卷積步長
:1。
填充(padding)
:2。
輸出
:256個27*27卷積結果。
行:(27+2*2-5)/1+1=27
列:(27+2*2-5)/1+1=27
04
—
pool2層
本層為最大值池化層,其資訊列出如下:
輸入
:256張27*27的卷積結果圖。
池化視窗尺寸
:3*3。
池化視窗滑動步長
:2個畫素點。
池化模式
:最大值池化。
輸出尺寸
:256張13*13的池化結果。
行:(27-3)/2+1=13
列:(27-3)/2+1=13
05
—
conv3層
conv3卷積層的資訊列出如下:
輸入
:256張13*13影象。
卷積核
:384個3*3卷積核。
卷積步長
:1。
填充(padding)
:1。
輸出
:384個13*13卷積結果。
行:(13+1*2-3)/1+1=13
列:(13+1*2-3)/1+1=13
06
—
conv4層
conv4卷積層的資訊列出如下:
輸入
:384張13*13影象。
卷積核
:384個3*3卷積核。
卷積步長
:1。
填充(padding)
:1。
輸出
:384個13*13卷積結果。
行:(13+1*2-3)/1+1=13
列:(13+1*2-3)/1+1=13
07
—
conv5層
conv5卷積層的資訊列出如下:
輸入
:384張13*13影象。
卷積核
:256個3*3卷積核。
卷積步長
:1。
填充(padding)
:1。
輸出
:256個13*13卷積結果。
行:(13+1*2-3)/1+1=13
列:(13+1*2-3)/1+1=13
08
—
pool3層
本層為最大值池化層,其資訊列出如下:
輸入
:256張13*13的卷積結果圖。
池化視窗尺寸
:3*3。
池化視窗滑動步長
:2個畫素點。
池化模式
:最大值池化。
輸出尺寸
:256張6*6的池化結果。
並將256*6*6的資料按順序展開成長度為9216的一維向量
。
行:(13-3)/2+1=6
列:(13-3)/2+1=6
09
—
fc1層
fc1層為Affine層,關於Affine層的計算過程,我們前文有講過:
卷積神經網路原理及其C++/Opencv實現(2)
本層資訊如下:
輸入
:長度為9216的一維向量。
輸出
:長度為4096的一維向量。
Dropout比例
:0。5
Alexnet網路的主要創新之處就是在Affine層增加了
Dropout
操作來避免過擬合(如上圖所示)。假設Affine層的輸入為長度為n的一維向量X,那麼其每個神經元的輸出可按下式計算:
Dropout操作,就是隨機刪除X向量中一定比例的資料(也可以理解為隨機將X向量中一定比例的資料清零),那麼每個神經元的輸出為:
Dropout操作通常刪除(清零)0。5比例的輸入資料,比如本層的輸入資料有9216個,那麼將隨機刪除9216*0。5=4608的資料,相當於只輸入一半的資料。
10
—
fc2層
本層為為Affine層,與fc1層類似,也包含了Dropout操作:
輸入
:長度為4096的一維向量。
輸出
:長度為4096的一維向量。
Dropout比例
:0。5
Dropout操作刪除(清零)0。5比例的輸入資料,本層的輸入資料有4096個,那麼將隨機刪除4096*0。5=2048的資料,相當於只輸入2048個數據。
11
—
fc3層
本層為全連線層,包含了Affine層和Softmax層,不過其Affine層的輸出不需要再經過Relu函數了,而是直接輸出到Softmax層,轉換為0~1的機率值。
輸入
:長度為4096的一維向量。
輸出
:長度為1000的一維向量。
關於Softmax層的計算,我們前文也有講過:
卷積神經網路原理及其C++/Opencv實現(2)
Alexnet網路輸出1000個機率值,實際使用中,我們可以根據實際情況修改,比如我們如果分類cifa-10資料,總共只有10個分類,那麼把該層的輸出由1000改為10即可。
本文我們就講到這裡,下篇文章來我們將使用libtorch來實現本文所講的網路結構,並使用實現的網路對Cifar-10資料集進行訓練、分類。
歡迎關注“萌萌噠程式猴”微信公眾號,接下來會不定時更新更加精彩的內容噢~