1. 程式人生 > >從AlexNet剖析-卷積網路CNN的一般結構

從AlexNet剖析-卷積網路CNN的一般結構

作者:張旭    

     編輯:王抒偉

  本文4794字27圖,閱讀約11分鐘  

算了

想看多久看多久

640.png?wxfrom=5&wx_lazy=1參考目錄

一、卷積層

        1.CNN中卷積層的作用

        2.卷積層如何工作

        3.AlexNet中的卷積層

二、池化層與啟用層

        1.池化層

        2.啟用層

三、全連線層

        1.全連線層的作用

        2.AlexNet中的全連線層

四、Softmax層

        1.Softmax的作用

        2.AlexNet中的Softmax

五、AlexNet中60M引數

六、CNN的發展

背景:

2012年AlexNet在ImageNet大賽上一舉奪魁,雖然後來大量比AlexNet更快速更準確的卷積神經網路結構相繼出現,但是AlexNet作為開創者依舊有著很多值得學習參考的地方,所以下面我們將從AlexNet開刀,理解卷積神經網路的一般結構。

先看看AlexNet的一些引數和結構圖: 
卷積層:5層 
全連線層:3層 
深度:8層 
引數個數:60M 
分類數目:1000類

結構圖:

0?wx_fmt=png

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

。 

卷積層:

 1.CNN中卷積層的作用

CNN中的卷積層,在很多網路結構中會用conv來表示,也就是convolution的縮寫。

卷積層在CNN中扮演著很重要的角色——特徵的抽象和提取,這也是CNN區別於傳統的ANN或SVM的重要不同,在傳統機器學習演算法中,我需要人為的指定特徵是什麼

比如經典的HOG+SVM的行人檢測方案,HOG就是一種特徵提取方法。

所以我們送入SVM分類器中的其實HOG提取出來的特徵,而不是圖片的本身,所以有時特徵提取演算法的選擇會比分類模型更為重要。

而在CNN中,特徵提取的工作在卷積層自動完成了,越深越寬的卷積層一般來說就會有更好的表達能力,所以CNN是一種端對端的訓練,我們輸入的就是原始的資料,而不是人工提取的特徵.

從這個角度上再思考一步的話,其實CNN可以看做一個自學習的特徵提取+softmax分類器(這裡暫不考慮全連線的邏輯判斷層,因為在後來他就被取消了)。

2.卷積層如何工作:

CNN中的卷積層操作與影象處理中的卷積是一樣的,都是一個卷積核對影象做自上而下,自左而右的加權求和操作,不同之處在於,在傳統影象處理中,我們人為指定卷積核,比如Soble,我們可以提取出來影象的水平邊緣和垂直邊緣特徵。

而在CNN中,卷積核的尺寸是人為指定的,但是卷積核內的數全部都是需要不斷學習得到的。

比如一個卷積核的尺寸為3*3*3,分別是寬,高和厚度,那麼這一個卷積核中的引數有27個。 

在這裡需要說明一點: 

卷積核的厚度=被卷積的影象的通道數 
卷積核的個數=卷積操作後輸出的通道數 

這兩個等式關係在理解卷積層中是非常重要的!!

舉一個例子,輸入影象尺寸5*5*3(寬/高/通道數),卷積核尺寸:3*3*3(寬/高/厚度),步長:1,邊界填充:0,卷積核數量:1。

用這樣的一個卷積核去卷積影象中某一個位置後,是將該位置上寬3,高3,通道3上27個畫素值分別乘以卷積核上27個對應位置的引數,得到一個數,依次滑動,得到卷積後的影象,這個影象的通道數為1(與卷積核個數相同),影象的高寬尺寸如下公式: 
(5-3+2*0)/1 +1 = 3 
所以,卷積後的特徵尺寸為:3*3*1(寬/高/通道數)

3.AlexNet中的卷積層:

在AlexNet中,卷積層是上圖所示的C1…..C5,一共5層。而每次卷積後的結果在上圖中可以看到,比如經過卷積層C1後,原始的影象變成了55*55的尺寸,一共有96個通道,分佈在2張3G記憶體的顯示卡上

所以上圖中一個立方體的尺寸是55*55*48,48是通道數目(後面會詳細的說明).而在這個立方體裡面還有一個5*5*48的小立方體,這個就是C2卷積層的核尺寸,48是核的厚度(後面會詳細說明)。

這樣我們就能看到它每一層的卷積核尺寸以及每一層卷積之後的尺寸。我們按照上面的說明,推導下每一層的卷積操作:

輸入層:224*224*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的卷積核卷積224*224*3的影象,卷積後的尺寸是55*55*1。

因為:(224-11+3)/4+1=55 


卷積核的個數為96,但是48個在一張顯示卡上,剩餘48個在另一張顯示卡上。

所以單張顯示卡上的通道數為48,2為顯示卡個數。 


最後的輸出:55*55*48*2 
而剩下的層數與上述推導式相同的,我們可以逐層確定輸出是什麼。

 
2.注意推導過程中的池化操作
在C1,C2,C5的卷積操作後,影象做了最大池化(後面會說),這會影響輸出圖片的尺寸。 
3.C3卷積層的特殊性

0?wx_fmt=png

看下上面這張圖,由於分顯示卡操作,上一層的輸出通道數(也就是卷積核的個數)總會是下一層卷積層卷積核厚度的2倍。

但是C3是特殊的,這是為啥呢????? 

0?wx_fmt=png

因為在這裡做了通道的合併,也就是一種串接操作,所以一個卷積核卷積的不再是單張顯示卡上的影象,而是兩張顯示卡的影象串在一起之後的影象,串在一起之後的通道數就是256,所以卷積核的厚度為256。 

0?wx_fmt=png

這也就是為什麼,在這個圖上要畫兩個3*3*128的卷積核,他想表達的意思就是實際的卷積核尺寸是3*3*256!(上面這個結論是個人理解)

池化層與啟用層

嚴格上說池化層與啟用層不屬於CNN中的單獨的層,也不記入CNN的層數內,所以我們一般直說AlexNet一共8層,有5層卷積層與3層全連線層。

但是在這裡為了邏輯上清晰,就把他們單獨拿出來說明下

1.池化層

池化操作(Pooling)用於卷積操作之後,其作用在於特徵融合和降維,其實也是一種類似卷積的操作,只是池化層的所有引數都是超引數,都是不用學習得到的。

0?wx_fmt=jpeg

上面這張圖解釋了最大池化(Max Pooling)的操作過程,核的尺寸為2*2,步長為2,最大池化的過程是將2*2尺寸內的所有畫素值取最大值,作為輸出通道的畫素值。 


除了最大池化外,還有平均池化(Average Pooling),也就是將取最大改為取平均。 


一個輸入為224*224*64的影象,經過最大池化後的尺寸變為112*112*64,可以看到池化操作的降維改變的是影象的寬高,而不改變通道數。

2.啟用層

池化操作用於卷積層內,而啟用操作則在卷積層和全連線層都會用到,在這裡只簡單說明下,具體內容大家可以在 理解啟用函式在神經網路模型構建中的作用這個部落格中瞭解。 
深層網路中一般使用ReLU多段線性函式作為啟用函式,如下圖所示,其作用在於增加非線性。 

0?wx_fmt=png

在全連線層中的啟用過程就很好理解了,因為全連線層內所有的神經元的輸出都是一個數,只要這個數x>0,則x=x;x<0,則x=0。 


在卷積層中的啟用針對的是每一個畫素值,比如某卷積層輸出中某個通道中i行j列畫素值為x,只要這個數x>0,則x=x;x<0,則x=0。

全連線層:

1.全連線層的作用

CNN中的全連線層與傳統神經網路中的作用是一樣的,負責邏輯推斷,所有的引數都需要學習得到。

有一點區別在於第一層的全連線層用於連結卷積層的輸出,它還有一個作用是去除空間資訊(通道數),是一種將三維矩陣變成向量的過程(一種全卷積操作),其操作如下: 

0?wx_fmt=png

輸入影象是W*H*C,那麼卷積核的尺寸為W*H*C,這樣的話整個輸入影象就變成了一個數,一共有k個數(第一層全連線層後的神經元個數),就有K個這樣的W*H*C的卷積核。

所以全連線層(尤其是第一層)的引數量是非常可怕的,也是由於這個弊端,後來的網路將全連線取消了,這個有機會再說。

2.AlexNet中的全連線層

再回到AlexNet結構,R1,R2,R3就是全連線層。

R2,R3很好理解,在這裡主要說明下R1層: 
輸入影象:13*13*256 
卷積核尺寸:13*13*256 個數2048*2 
輸出尺寸:4096(列向量) 
從最開始的結構中可以看到,R1中也有通道的互動:

0?wx_fmt=png

所以串接後的通道數是256,全卷積的卷積核尺寸也就是13*13*256,一個有4096個這樣尺寸的卷積核分別對輸入影象做4096次的全卷積操作,最後的結果就是一個列向量,一共有4096個數。

這些數的排布其實就相當於傳統神經網了裡面的第一個隱藏層而已,通過R1後,後面的連結方式和ANN就沒有區別了。要學習的引數也從卷積核引數變成了全連線中的權係數。

Softmax層:

1.Softmax的作用

Softmax層也不屬於CNN中單獨的層,一般要用CNN做分類的話,我們習慣的方式是將神經元的輸出變成概率的形式,Softmax就是做這個的:

0?wx_fmt=png

這個很好理解,顯然Softmax層所有的輸出相加為1。而某一個輸出的就是概率,最後我們按照這個概率的大小確定到底屬於哪一類。 

2.AlexNet中的Softmax

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

AlexNet中60M引數:

AlexNet只有8層,但是它需要學習的引數有60000000(看看這數量級)個,相比如他的層數,這是一個很可怕的數字了

我們來計算下這些引數都是怎麼來的:

C1:96*11*11*3(卷積核個數/寬/高/厚度) 34848個 
C2:256*5*5*48(卷積核個數/寬/高/厚度) 307200個 
C3:384*3*3*256(卷積核個數/寬/高/厚度) 884736個 
C4:384*3*3*192(卷積核個數/寬/高/厚度) 663552個 
C5:256*3*3*192(卷積核個數/寬/高/厚度) 442368個 
R1:4096*6*6*256(卷積核個數/寬/高/厚度) 37748736個 
R2:4096*4096 16777216個 
R3:4096*1000 4096000個

在R1中卷積核尺寸是6*6*256而不是13*13*256是因為經過了最大池化。可以看到,全連線層(尤其是第一層)引數數量佔了絕大部分。

CNN的發展:

在AlexNet問世之後,CNN以一個很快的速度發展,截止到2016年,已經有了多代的網路結構問世,深度、寬度上也越來越大,效率和正確率上也越來越好: 
LeNet5—AlexNet—NiN—VGG—GoogleNet—ResNet —DenseNet
在這些結構中: 

NiN 引入1*1卷積層(Bottlenecklayer)和全域性池化;
VGG將7*7卷積核替換成3個3*3卷積核,起到了降引數的作用; 
GoogLeNet引入了Inception模組;
ResNet引入了殘差思想;

DenseNet在ResNet的直連思想基礎上,又做了進一步改進,將當前層的輸出特徵向之後所有的層做直連。


其中有些網路去除了AlexNet中提出的一些思想,比如全連線層,全尺寸卷積等等,但是AlexNet,甚至是更之前的LeNet5對CNN發展有著里程碑式的意義。 

PS:

如果你懂一些ANN相關知識,更好喔,如果你不懂,留言給小編,小編給你好好打一下基礎。


多謝大家支援公眾號

關於本文CNN相關知識和其他問題

歡迎大家加群在群中探討

歡迎留言或讚賞。


閱 

掃描燕哥微訊號

拉你進機器學習大牛群。

福利滿滿,名額已不多…

0.jpeg

目前80%的AI從業者已關注我們微信公眾號

0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif

0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif