【DL-CV】卷積神經網絡

【DL-CV】神經網絡的補充<前篇---後篇>【DL-CV】數據預處理&權重初始化segmentfault


經典神經網絡搞明白後,咱們接下來看看他的變種,也是本系列的主角——卷積神經網絡(Convolutional Neural Network/CNN)。
以往全鏈接層組成的神經網絡有一個很氣人的缺點就是對付大圖像效果很差:圖像尺寸一大,由於權重(形狀上的)大小與圖像尺寸有關係,參數量激增,致使效率低下。相比,卷積神經網絡就沒有這種煩人的特性了,他大大下降了網絡中的參數量,並且能經過增長層數(加到數十層)提升性能,很是勝任圖像識別的任務。數組

卷積神經網絡

clipboard.png

一個普通的卷積神經網絡由各類層按順序堆疊而成,這些層主要分三類:卷積層、池化層和全鏈接層。有時激活函數也算一層,它逐元素進行激活函數操做。並且爲了更好的理解如何組裝這個網絡,咱們先詳細介紹這幾種層的原理網絡

卷積層

注:如下例子輸入數據,輸出數據,卷積核的截面都是正方形(寬度和高度相等)函數

clipboard.png

有一張 32x32 的圖像,咱們保持輸入圖像數據的三維結構,則輸入是一個 32x32x3 的三維數組。咱們有一個5x5x3的卷積核(kernel)/濾波器(filter),讓這個卷積核在寬度和高度上滑過整個數據空間,在每一個位置,計算卷積核和數據的部分區域(二者重合的部分)的內積得到一個值,這個值加上偏置值b後通過激活函數做爲輸出的激活值。當卷積核完成這個操做後,會獲得一個由激活值組成的二維的特徵映射圖(feature map,簡稱特徵圖)性能

如上圖左,若是步長爲1(每次移動一個像素),會獲得一張 28x28x1 的特徵圖,有28x28個神經元。關於神經元:學習

  • 每一個神經元只與輸入數據的局部區域鏈接,該局部區域稱爲該神經元的感覺野(receptive field)。感覺野的大小(寬高)也就是卷積核的大小(寬高),一般爲正方形(寬高相等);而卷積核的深度是和輸入數據的深度相等的。上圖的感覺野大小是5x5。
  • 同一個特徵圖上的神經元都公用一套權重,也就是那個卷積核。這稱爲參數共享,是卷積層的特性,卷積層中的神經元經過參數共享(而不像普通網絡中每一個神經元都有本身的一組參數)大大減低參數量。

在一個卷積層中,一般會有多個卷積核,每一個卷積核都生成一個特徵圖,將這些特徵圖在深度方向堆疊起來就獲得輸出數據,做爲下一個卷積層的輸入或進入池化層。編碼


卷積核的理解:
卷積核就是卷積層的參數,是咱們要訓練的參數。
筆者對卷積核一個直觀的理解是,訓練好的卷積核至關於特徵提取器,他對整個圖進行掃描,並在每一個位置留下激活值(至關於該位置擁有某特徵的可能性),這些激活值組成的特徵圖就至關於某特徵分佈的機率圖。一個卷積覈對應一種特徵,使用多個卷積核提取圖像的多個特徵後,能夠餵給下一層卷積層讓下一層的卷積核提取更深一層的特徵(淺層特徵間的關係與組合),直到最後能夠獲得輸入圖像各類類別的可能性。spa


下面回到卷積層,注意到在卷積層中,有幾個超參數影響着輸出數據的尺寸(至於參數設定,文章最後):.net

  1. 卷積核的大小(F):影響着輸出數據的寬高
  2. 卷積核數量(K):影響着輸出數據的深度,卷積核數量與輸出數據的深度在數值上相等
  3. 步長(S):影響着輸出數據的寬高,步長越大,輸出數據的寬高越小
  4. 零填充(P):零填充指在輸入數據的寬和高兩個維度上用零填充指定寬度。如輸入數據大小爲32x32x3,填充爲2,則輸入數據大小變爲34x34x3。零填充很重要,若是隻進行卷積而不使用零填充,那麼輸出數據的尺寸會不斷縮小,致使特徵丟失

知道這些參數後,根據輸入數據的尺寸W1 ✖ H1 ✖ D1,咱們有公式計算輸出數據的尺寸W2 ✖ H2 ✖ D2對象

  • 寬:$W_2 = {(W_1-F+2P)\over S}+1$
  • 高:$H_2 = {(H_1-F+2P)\over S}+1$
  • 深度:$D_2=K$
  • 其中$(W_1-F+2P)$與$S$、$(H_1-F+2P)$與$S$必須是整除關係,不然意味着卷積核會超出輸入數據的邊界(步長爲一確定沒問題,大於一其餘參數就要當心設置了)
  • 每一個卷積核有 F ✖ F ✖ D1個權重,K 個卷積核,卷積層共有F ✖ F ✖ D1 ✖ K 個權重和K 個偏置值

$$$$

卷積操做的矩陣實現

實際應用中,咱們不多像上圖同樣在高維數組中迭代點積,由於這樣正向反向傳播都很差作,咱們喜歡的仍是慣用的矩陣操做。好消息是這是可行的,卷積運算本質上就是在卷積核和輸入數據的局部區域間作點積,利用這一點咱們能夠把卷積操做轉化爲矩陣乘法:

  • 把每一個卷積核都展開成行向量(每一個深度切片都展開成一行,拼起來得到一大行)做爲卷積核矩陣的一行,得到矩陣W
  • 把卷積操做的每一個點積區域展開成列向量(每一個深度切片都展開成一列,拼起來得到一大列)做爲輸入矩陣的一列,得到矩陣X
  • 這樣卷積操做就至關於X*W這個矩陣乘法了,輸出矩陣X*W的每一行對應某個卷積核得到的特徵圖的展開(輸出數據每一個深度切片的展開)

這裏只簡單介紹實現,帶圖的詳細說明請看此文章,很不錯

池化層

在連續的卷積層之間會週期性地插入一個池化層,它的做用是逐漸下降數據體的空間尺寸(數據降採樣),這樣的話就能減小網絡中參數的數量,使得計算資源耗費變少,也能有效控制過擬合。

clipboard.png

池化操做的對象是每個特徵圖,也就是輸入數據的每一個深度切片。這裏介紹經常使用的最大池化,對於每個切片,會有一個掃描空間在寬度和高度上滑過整個切片,在每一個位置選出空間內的最大值做爲輸出。如上圖,輸入4x4x4的數據,使用最大池化,空間大小2x2,步長爲2,則輸出2x2x4的數據。

根據輸入數據的尺寸W1 ✖ H1 ✖ D1,空間大小F和步長S,咱們有公式計算輸出數據的尺寸W2 ✖ H2 ✖ D2

  • 寬:$W_2 = {(W_1-F)\over S}+1$
  • 高:$H_2 = {(H_1-F)\over S}+1$
  • 深度:$D_2=D_1$
  • 池化層不多使用零填充

在實際使用中,最大池化一般採用$F=2,S=2$(無重疊,普通池化);較少用的有$F=3,S=2$(有重疊,重疊池化)


除了最大池化外,還有平均池化、隨機池化、lp池化等,這裏就不深刻了,交給讀者自行了解。在圖像識別這一塊,一般經驗性的使用最大池化(性能好,反向傳播也容易)。


另:一些學者認爲能夠不使用池化層,轉而使用較大步長的卷積層來代替池化層實現數據尺寸的下降。一些發現也認爲在訓練一個良好的生成模型(如變化自編碼器,生成性對抗網絡)時,棄用池化層也是很重要的。這樣看來的話,將來的卷積網絡可能會向無池化層的方向發展

全鏈接層

clipboard.png

卷積神經網絡的最後一部分是全鏈接層組成的網絡(也就是前面講的普通的神經網絡)。圖像數據通過多層卷積層和池化層後,會獲得足夠小的特徵數據,把特徵數據的每一個切片展開成向量並拼成一個大向量,即可做爲全鏈接層的輸入,最後輸出類別得分。

全鏈接層轉化爲卷積層

任何全鏈接層均可以被轉化爲卷積層。只要把卷積核的尺寸改爲和輸入數據尺寸一致就能實現全鏈接了。
clipboard.png

舉個栗子,如上圖,若是最後池化層輸出數據大小爲 4x4xD,咱們要將其接入一個K = 4096 (神經元個數)的全鏈接層,則須要4096個尺寸爲4x4xD的卷積核,卷積後的到1x1x4096的輸出就對應着那個全鏈接層中的4096個神經元的值。若是第二個全鏈接層K=1000,則另須要1000個尺寸爲1x1x4096的卷積核,卷積後獲得1x1x1000的輸出對應着第二個全鏈接層中的1000個神經元,如此類推。


這種轉化參數量是沒有改變的,看似沒有好處,可是在下面的狀況,這種轉化能使計算高效化
clipboard.png

如今有一張大尺寸圖像,咱們有一個浮窗,讓浮窗在寬和高上滑過整張圖片,在每一個位置浮窗圍住的子圖像將做爲卷積神經網絡的輸入,而後網絡輸出該子圖像的評分數據。如今重點來了:

  • 若是這是個原版的卷積神經網絡(帶全鏈接層),由於網絡中的全鏈接層上改變了原先數據的維度,致使一次只能輸出某個子圖像的評分數據(向量)。整個過程就須要迭代屢次網絡才行
  • 若是這是個改版的卷積神經網絡(全鏈接層改爲卷積層),由於浮窗行爲與卷積層的共性,加之沒有全鏈接層,數據會維持三維結構;只需一次正向傳播便能獲得全部評分數據
  • 相比之下,改版的卷積神經網絡更高效,它在每一個子圖像的計算中共享了計算資源。

另:這種帶浮窗的設定,就是目標檢測的實現方法,一般在一個大圖像上,在不一樣的位置會有不一樣類別的物體,浮窗在每一個位置都進行一次識別,就能在一張圖中分辨出多個物體,所謂目標檢測。

組裝卷積神經網絡

介紹完各類層的原理後,最後介紹如何用這些層組成一個完整的卷積神經網絡,並解析各層參數的選用

一般卷積層有如下結構:
輸入→→[ [卷積層→→激活函數層]*N →→池化層 ]*M →→[全鏈接層→→激活函數層]*K→→全鏈接層→→輸出
池化層是能夠不用的,全鏈接層能夠轉化爲卷積層。*K、*N、*M 指重複若干次,其中N >=0,一般N<=3;M>=0;K>=0,一般K<3。N越大意味着池化前有更多的卷積層,這個思路適用於更大更深的網絡,由於在執行具備破壞性的池化操做前,多重的卷積層能夠從輸入數據中學習到更多的複雜特徵。

各層參數設定

輸入層:圖像的尺寸應該能被2整除屢次,如32,64,96,224等。以方便池化操做


卷積層:

  • 卷積核數量應該爲2n ,如64,128,512......
  • 卷積核尺寸推薦選較小的(如3x3,5x5),對應步長使用1。更大的卷積核尺寸(如7x7),一般只用在第一個面對原始圖像的卷積層上
  • 使用零填充,若是步長爲1,填充大小 $P =(F-1)/2$ 便能維持輸入輸出的寬高一致

池化層:

  • 一般使用最大池化,並使用2x2空間,步長爲2($F=2,S=2$)
  • 較少用的有3x3空間,步長爲2,重疊池化($F=3,S=2$)
  • 更大的空間極少用,池化效果太強,容易致使特徵丟失

全鏈接層:就很少說了,就是普通的mlp


本文完:介紹了普通卷積神經網絡的結構。在實際使用上,卷積神經網絡因其不一樣的結構又細分紅不一樣網絡(如AlexNet,VGGNet,ResNet等),它們都是卷積神經網絡的一種,這些之後再深刻

相關文章
相關標籤/搜索