1. 程式人生 > >從AlexNet理解卷積神經網路的一般結構

從AlexNet理解卷積神經網路的一般結構

2012年AlexNet在ImageNet大賽上一舉奪魁,開啟了深度學習的時代,雖然後來大量比AlexNet更快速更準確的卷積神經網路結構相繼出現,但是AlexNet作為開創者依舊有著很多值得學習參考的地方,它為後續的CNN甚至是R-CNN等其他網路都定下了基調,所以下面我們將從AlexNet入手,理解卷積神經網路的一般結構。
這裡寫圖片描述

先給出AlexNet的一些引數和結構圖:
卷積層:5層
全連線層:3層
深度:8層
引數個數:60M
神經元個數:650k
分類數目:1000類

AlexNet結構圖:
這裡寫圖片描述
由於當時的顯示卡容量問題,AlexNet 的60M個引數無法全部放在一張顯示卡上操作,所以採用了兩張顯示卡分開操作的形式,其中在C3,R1,R2,R3層上出現互動,所謂的互動就是通道的合併,是一種串接操作。

卷積層

CNN中卷積層的作用

CNN中的卷積層,在很多網路結構中會用conv來表示,也就是convolution的縮寫。卷積層在CNN中扮演著很重要的角色——特徵的抽象和提取,這也是CNN區別於傳統的ANN或SVM的重要不同,在傳統機器學習演算法中,我需要人為的指定特徵是什麼,比如經典的HOG+SVM的行人檢測方案,HOG就是一種特徵提取方法。所以我們送入SVM分類器中的其實HOG提取出來的特徵,而不是圖片的本身。而在卷積神經網路中,大部分特徵提取的工作在卷積層自動完成了,越深越寬的卷積層一般來說就會有更好的表達能力。

卷積層如何操作

CNN中的卷積層操作與影象處理中的卷積

是一樣的,都是一個卷積核對影象做自上而下,自左而右的加權和操作,不同指出在於,在傳統影象處理中,我們人為指定卷積核,比如Soble,我們可以提取出來影象的水平邊緣和垂直邊緣特徵。而在CNN中,卷積核的尺寸是人為指定的,但是卷積核內的數全部都是需要不斷學習得到的。比如一個卷積核的尺寸為3×3×3,分別是寬,高和厚度,那麼這一個卷積核中的引數有27個。
在這裡需要說明一點:
卷積核的厚度=被卷積的影象的通道數
卷積核的個數=卷積操作後輸出的通道數
這兩個等式關係在理解卷積層中是非常重要的!!舉一個例子,輸入影象尺寸5×5×3(寬/高/通道數),卷積核尺寸:3×3×
3
(寬/高/厚度),步長:1,邊界填充:0,卷積核數量:1。用這樣的一個卷積核去卷積影象中某一個位置後,是將該位置上寬3,高3,通道3上27個畫素值分別乘以卷積核上27個對應位置的引數,得到一個數,依次滑動,得到卷積後的影象,這個影象的通道數為1(與卷積核個數相同),影象的高寬尺寸如下公式:

(53+2×0)1+1=3
所以,卷積後的影象尺寸為:3×3×1(寬/高/通道數)

AlexNet中的卷積層

在AlexNet中,卷積層是上圖所示的C1…..C5,一共5層。而每次卷積後的結果在上圖中可以看到,比如經過卷積層C1後,原始的影象變成了55*55的尺寸,一共有96個通道,分佈在2張3G的顯示卡上,所以上圖中一個立方體的尺寸是55×55×48,48是通道數目(後面會詳細的說明),而在這個立方體裡面還有一個5×5×48的小立方體,這個就是C2卷積層的核尺寸,48是核的厚度(後面會詳細說明)。這樣我們就能看到它每一層的卷積核尺寸以及每一層卷積之後的尺寸。我們按照上面的說明,推到下每一層的卷積操作:

需要說明的是,雖然AlexNet網路都用上圖的結構來表示,但是其實輸入影象的尺寸不是224×224×3,而應該是227×227×3,大家可以用244的尺寸推導下,會發現邊界填充的結果是小數,這顯然是不對的,在這裡就不做推導了。

輸入層:227×227×3
C1:96×11×11×3 (卷積核個數/寬/高/厚度)
C2:256×5×5×48(卷積核個數/寬/高/厚度)
C3:384×3×3×256(卷積核個數/寬/高/厚度)
C4:384×3×3×192(卷積核個數/寬/高/厚度)
C5:256×3×3×192(卷積核個數/寬/高/厚度)

針對這五層卷積,說明一下三點:
1.推導下C1後的輸出是什麼:
11×11×3的卷積核卷積227×227×3的影象,卷積後的尺寸是55×55×1。這是因為:

(22711+2×0)4+1=55
卷積核的個數為96,但是48個在一張顯示卡上,剩餘48個在另一張顯示卡上。所以單張顯示卡上的通道數為48,2為顯示卡個數。
最後的輸出:55×55×48×2
而剩下的層數與上述推導式相同的,我們可以逐層確定輸出是什麼。
2.注意推到過程中的池化操作
在C1,C2,C5的卷積操作後,影象做了最大池化(後面會說),這會影響輸出圖片的尺寸。
3.C3卷積層的特殊性
這裡寫圖片描述
看下上面這張圖,由於分顯示卡操作,上一層的輸出通道數(也就是卷積核的個數)總會是下一層卷積層卷積核厚度的2倍。但是C3是特殊的,這是為啥呢?????
這裡寫圖片描述
因為在這裡做了通道的合併,也就是一種串接操作,所以一個卷積核卷積的不再是單張顯示卡上的影象,而是兩張顯示卡的影象串在一起之後的影象,串在一起之後的通道數就是256,所以卷積核的厚度為256。
這裡寫圖片描述
這也就是為什麼,在這個圖上要畫兩個3*3*128的卷積核,他想表達的意思就是實際的卷積核尺寸是3×3×256!(上面這個結論是我猜的)

池化層與啟用層

嚴格上說池化層與卷積層不屬於CNN中的單獨的層,也不記入CNN的層數內,所以我們一般直說AlexNet一共8層,有5層卷積層與3層全連線層。但是在這裡為了邏輯上清晰,就把他們單獨拿出來說明下:

池化層

池化操作(Pooling)用於卷積操作之後,其作用在於特徵融合和降維,其實也是一種類似卷積的操作,只是池化層的所有引數都是超引數,都是不用學習得到的。
這裡寫圖片描述
上面這張圖解釋了最大池化(Max Pooling)的操作過程,核的尺寸為2×2,步長為2,最大池化的過程是將2×2尺寸內的所有畫素值取最大值,作為輸出通道的畫素值。
除了最大池化外,還有平均池化(Average Pooling),也就是將取最大改為取平均。
一個輸入為224×224×64的影象,經過最大池化後的尺寸變為112×112×64,可以看到池化操作的降維改變的是影象的寬高,而不改變通道數。

啟用層

池化操作用於卷積層內,而啟用操作則在卷積層和全連線層都會用到,由於之前我已經寫過關於啟用函式的部落格,在這裡只簡單說明下,具體內容大家可以在 理解啟用函式在神經網路模型構建中的作用這個部落格中瞭解。
深層網路中一般使用ReLU多段線性函式作為啟用函式,如下圖所示,其作用在於增加非線性。
這裡寫圖片描述
在全連線層中的啟用過程就很好理解了,因為全連線層內所有的神經元的輸出都是一個數,只要這個數x>0,則x=x;x<0,則x=0。
在卷積層中的啟用針對的是每一個畫素值,比如某卷積層輸出中某個通道中i行j列畫素值為x,只要這個數x>0,則x=x;x<0,則x=0。

全連線層

全連線層的作用

CNN中的全連線層與淺層神經網路中的作用是一樣的,負責邏輯推斷,所有的引數都需要學習得到。有一點區別在於第一層的全連線層用於連結卷積層的輸出,它還有一個作用是去除空間資訊(通道數),是一種將三維矩陣變成向量的過程(一種全卷積操作),其操作如下:
這裡寫圖片描述
輸入影象是W×H×C,那麼卷積核的尺寸為W×H×C,這樣的話整個輸入影象就變成了一個數,一共有k個數(第一層全連線層後的神經元個數),就有K個這樣的W×H×C的卷積核。所以全連線層(尤其是第一層)的引數量是非常可怕的,也是由於這個弊端,後來的網路將全連線取消了,這個有機會再說。

AlexNet中的全連線層

再回到AlexNet結構,R1,R2,R3就是全連線層。R2,R3很好理解,在這裡主要說明下R1層:
輸入影象:13×13×256
卷積核尺寸:13×13×256 個數2048×2
輸出尺寸:4096(列向量)
從最開始的結構中可以看到,R1中也有通道的互動:
這裡寫圖片描述
所以串接後的通道數是256,全卷積的卷積核尺寸也就是13×13×256,一個有4096個這樣尺寸的卷積核分別對輸入影象做4096次的全卷積操作,最後的結果就是一個列向量,一共有4096個數。這些數的排布其實就相當於傳統神經網了裡面的第一個隱藏層而已,通過R1後,後面的連結方式和ANN就沒有區別了。要學習的引數也從卷積核引數變成了全連線中的權係數。

Softmax層

Softmax作用

Softmax層也不屬於CNN中單獨的層,一般要用CNN做分類的話,我們習慣的方式是將神經元的輸出變成概率的形式,Softmax就是做這個的:
這裡寫圖片描述
這個很好理解,顯然Softmax層所有的輸出相加為1。即:
這裡寫圖片描述
而某一個輸出的就是概率,最後我們按照這個概率的大小確定到底屬於哪一類。
這裡寫圖片描述

AlexNet中的Softmax

AlexNet最後的分類數目為1000,也就是最後的輸出為1000,輸入為4096,中間通過R3連結,R3就是最後一層了,全連線的第3層,所有層數的第8層。
到這裡,AlexNet的所有結構就都說完了!說完了!說完了!,下面補充一些東西,算是一些延伸吧。

AlexNet 中60M引數

AlexNet只有8層,但是它需要學習的引數有60000000個,相比如他的層數,這是一個很可怕的數字了,我們來計算下這些引數都是怎麼來的:
C1: