基於libtorch的Alexnet深度學習網路實現——Alexnet網路結構原理

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層

構成。下文我們將分別講解各層的結構、原理。

基於libtorch的Alexnet深度學習網路實現——Alexnet網路結構原理

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行,如下圖所示:

基於libtorch的Alexnet深度學習網路實現——Alexnet網路結構原理

輸出

: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

基於libtorch的Alexnet深度學習網路實現——Alexnet網路結構原理

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

基於libtorch的Alexnet深度學習網路實現——Alexnet網路結構原理

Alexnet網路的主要創新之處就是在Affine層增加了

Dropout

操作來避免過擬合(如上圖所示)。假設Affine層的輸入為長度為n的一維向量X,那麼其每個神經元的輸出可按下式計算:

基於libtorch的Alexnet深度學習網路實現——Alexnet網路結構原理

Dropout操作,就是隨機刪除X向量中一定比例的資料(也可以理解為隨機將X向量中一定比例的資料清零),那麼每個神經元的輸出為:

基於libtorch的Alexnet深度學習網路實現——Alexnet網路結構原理

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)

基於libtorch的Alexnet深度學習網路實現——Alexnet網路結構原理

Alexnet網路輸出1000個機率值,實際使用中,我們可以根據實際情況修改,比如我們如果分類cifa-10資料,總共只有10個分類,那麼把該層的輸出由1000改為10即可。

本文我們就講到這裡,下篇文章來我們將使用libtorch來實現本文所講的網路結構,並使用實現的網路對Cifar-10資料集進行訓練、分類。

歡迎關注“萌萌噠程式猴”微信公眾號,接下來會不定時更新更加精彩的內容噢~