Convolutional Neural Networks (卷積神經網絡)

前言:


剛進實驗室,被叫去看CNN。看了一些博客和論文,消化了很久,同時覺得一些博客存在一些謬誤。我在這裏便儘量更正,並加入自己的思考。如果覺得本文有哪裏不妥或疑惑,請在下面發表評論,大家一起探討。

ps: 本篇博文原本來自我在cnblogs的博客,但是在那裏好像沒什麼人討論這個,所以乾脆連博客也遷回了csdn,還是這裏朋友多。

  卷積神經網絡(CNN)是deep learning的基礎。傳統的全連接神經網絡(fully connected networks) 以數值作爲輸入。如果要處理圖像相關的信息的話,要另外從圖像中提取特徵並採樣。而CNN把提特徵、下采樣和傳統的神經網絡整合起來,形成一個新的網絡。本文假設你已經有了簡單神經網絡的概念,如“層(layers)”、“神經元(neurons)”。


一. 理論基礎



                                                                       圖1


Α. 簡單網絡拓撲:

 

  如圖1所示,這是一個簡單的卷積神經網絡 CNN。其中C層代表對輸入圖像進行濾波後得到的所有組成的層,也稱“卷積層”。S層代表對輸入圖像進行下采樣(subsampling)得到的層。其中C1和C3是卷積層 ,S2和S4則是下采樣層。C、S層中的每一層都由多個二維平面組成,每一個二維平面是一個特徵圖 (feature map)。

 

 

以圖1所示的CNN爲例,講講圖像的處理流程:

  圖像輸入網絡後,通過三個濾波器(filter) 進行卷積,得到C1層的三個特徵圖(feature map)。C1層的三個特徵圖分別通過下采樣得到S2層的三個特徵圖。這三個特徵圖通過一個濾波器卷積得到C3層的三個特徵圖,然後和前面類似,下采樣得到S4層的三個特徵圖。最後,S4層的特徵圖光柵化後,變成向量。這個向量輸入到傳統的全連接神經網絡(fully connected networks)中進行進一步的分類。

  圖中的C1、S2 、C3、S4層中的所有特徵圖都可以用 “像素 x 像素” 定義圖像大小。你會說,圖像的大小不就是用像素x像素定義的麼? 沒錯,但這裏有點特殊,由於這些特徵圖組成了神經網絡的卷積層和下采樣層,而在神經網絡(neural networks)中,每一層都有“神經元” (neurons) 的概念。這些特徵圖中的每一個像素恰恰舊就代表了一個神經元。每一層所有特徵圖的像素個數,就是當層網絡的神經元個數,這是可以算出來的,怎麼算? 再往後面看一看。

 

  

Β. 隱層(hidden layer):

 

  提到了神經元的概念之後,就可以講述 a) CNN中C-S部分的隱層(NN部分的隱層就不在這裏講了) 還有 b) 層與層之間,神經元的連接情況的概念了。隱層就是一塊黑色的面紗,它隱藏了真相,但種種蛛絲馬跡(如濾波器的大小、步長,下采樣的範圍,偏置數等等)告訴你,你已經很逼近真相了。嗯,不扯了,就是說有了那些東西,你就可以算出神經元的數目、可學習的參數個數、神經元的連接數了。分爲兩種:別的層和卷積層之間的隱層、卷積層和下采樣層之間的隱層。

 

1.  別的層和卷積層之間的隱層:


 濾波器(卷積核)定義:

filter_width、filter_height → 濾波範圍的寬、高; 

filter_channels → 過濾圖像的通道數;

filter_types → 濾波器的種類。

例: 5x5x3 → 20: 濾波器寬高各爲5個像素,卷積通道數爲3,共20種


下面會涉及局部感受野的概念和權值共享

  

  一般來說,如果C層中的所有神經元都和輸入圖像上的每一個像素點建立連接,那麼這個連接數目是極其龐大的。需要學習的參數個數也另人瞠目結舌。

  舉個例子,若輸入圖像大小爲 200x200,C1層由6個特徵圖,每個特徵圖大小爲20x20(神經元數目爲20x20=400個)。並且,使濾波器爲10x10的單通道濾波器(channel = 1),且步長爲10---相當於相鄰的兩個濾波區域恰好不重疊,這樣便於計算啦。 那麼總共的連接數目是 200x200x(6x20x20) = 96000000。天哪,九千多萬個連接,如果每個連接一個參數的話,那就九千多萬的可訓練參數(learnable parameters),如此複雜的網絡,根本就沒有計算的可能,地球都毀滅了,參數還沒訓練好。。。

  在我們的生活中。看見一樣東西,通常都是先看到它的局部,一般不會一下就能看到一件物品的全部內容。這就是局部感受野,CNN用了這個策略。卷積層中的除了可加偏置之外,每一個神經元都只和輸入圖像中的一個局部區域中的像素點相連接。(此局部區域的大小就是濾波器的寬高積)

  C層的一個特徵圖(feature map) 是輸入圖像通過一種濾波器(filter) 得到的。假設這中濾波器提取 “T” 特徵。特徵圖上面的每一個神經元都通過這個濾波器和原圖像上面自己對應的那個局部區域相關聯(和局部區域中的像素點相連)。這樣一來啊,每個神經元獲得了自己對應區域的 T 特徵後,把大家的那份都整起來,不就相當於獲得原圖的 T 特徵了嗎 ?

  讓我們來算算,現在連接的數目是多少!每個神經元只和一個10x10的區域相連,那就是 10x10x(6x20x20) = 240000。現在最多隻有24w個可訓練參數了。 還可以減少 !

 

  ps: 每一個神經元都對應一個值,這個值由它指向的原圖的區域裏的所有像素點值通過濾波器卷積算出。

 

  下面,談談權值共享。我們已經知道,輸入圖像通過一種濾波器卷積得到一張特徵圖。特徵圖上的每個神經元都與原圖上的一個矩形濾波區域上的像素點連接,上例就是10x10。辣麼每一神經元和原圖上的10x10個輸入神經元有連接。由於這些神經元想要的是同一種特徵,所以它們通過同一個濾波器來濾波。因此,每一個神經元上的這10x10的連接上的參數是 一毛一樣的。 是不是很有道理的樣子 ?  實際上,這10x10個參數被這張特徵圖上的所有神經元共享。這就是權值共享啊! 那麼即使6張特徵圖,也只有6x10x10 = 600 個需要訓練的參數。(假設輸入層只有一張圖)

  進一步地,這10x10的參數彷彿只和濾波有關,就像是6個濾波器,每個都自帶100個參數一樣。而且這些參數需要訓練。就像是自學習的濾波器一樣! 

  e.g.  有一個5x5x3 → 20的濾波器,輸入一個原始圖像,通過卷積得到C層的20個特徵圖。

      可訓練參數 = (5x5x3 + 1) x 20 = 1520個

    

  每張特徵圖上神經元的數目和 輸入圖的寬高、濾波器的寬高、濾波器的步長(stride)均有關,且等於原圖上可取的濾波區域的數目。上面我們給出的例子裏面由於濾波器的寬高爲10x10且步長爲10,所以沒有兩個濾波區域是重疊的,比較理想。一般情況下,就需要按下面的公式來算。設特徵圖的寬高分別是 n 和 m。



(1)


推導過程很簡單,主要思想就是最右/下面的一個可放置濾波器的地方,就是最右/下面的濾波區域的右/下邊界,不超過輸入圖像的width/height。列出下面兩組不等式,解之即可得到 (1)。


(2)



                                                    圖2


如果輸入的這個層(指的是輸入給C層的那個層,不只是指最開始的Input層)的圖像只有一個特徵圖,那麼隱層的參數個數可以簡單地這樣計算--隱層可訓練參數個數 = (濾波器大小 + 可加偏置數目) x 濾波器種類。如果不是,情況就會不同,因爲原來當輸入層只有一個圖的時候,C層的神經元都指向輸入層的那個圖的一個區域。如果輸入層有P個圖(P > 1),特別是當C層的特徵圖的數目Q和P不同的時候,分配不均,C層的神經元就會指向輸入層的R個圖的R個區域了(R ≤ P)。這裏可以有多種分配策略,比如一個特徵圖上的神經元指向輸入層三個圖的區域啦,又一個特徵圖上的神經元指向輸入層六個圖的區域啦,這直接就影響到參數的計算了。具體策略具體算。文章最後面算LeNet-5參數的時候,會出現這樣的情況,後面的例子會說明。

 

  特徵圖的數目 = 濾波器的種類

   隱層可訓練參數個數:1. 輸入層只有一個特徵圖:  (濾波器大小 + 可加偏置數) x 濾波器種類

                 I.     濾波器大小 = filter_width x filter_height x filter_channels

                   II.    可加偏置數,一般爲1

            2. 輸入層不只一個特徵圖: 視具體情況而定

  隱層可訓練參數個數 = (濾波器大小 + 可加偏置數目) x 濾波器種類  

  卷積層上的神經元總數 = 特徵圖數目 x 可放置濾波器數目 = 特徵圖數目 x n x m

  連接數 = 神經元總數 x 神經元所連接的輸入圖像的局部區域大小



                                                      圖3


如圖3所示,輸出的特徵圖中的每一個神經元 (綠色小框),都指向輸入圖像的唯一的一個濾波區域(紅色小框)。人懶,只畫出了第一行。

  可以看到紅色的小框,即合法的濾波區域之間是有重疊(overlapping)的,這是故意的,因爲允許設置濾波器在輸入圖像上的移動步長。而且最後一個紅框離輸入圖像的右邊緣有一小段距離,還是故意的,因爲這可能是最右一個合法的濾波區域了。再往右按步長偏移放紅框,這個框的右邊界就超出輸入圖像的右邊界了。同理,濾波器往下的情況也是類似的。

  最後,你會發現,每一張特徵圖上的神經元個數就是輸入圖像的合法濾波區域個數。雖然,上面看好像每個神經元只有一條線指向區域,但是,實際上,這條線上有filter_width x filter_height 個連接。令 k = filter_width x filter_height,如果還加上一個可加偏置,那麼一個神經元上面就有(k+1)個參數了。一張feature map上的所有神經元共享這k+1個參數。像圖3有三個特徵圖,那麼上圖3的隱層參數總數就是3k+3。


2.  卷積層和下采樣層之間的隱層:

 

  爲啥需要下采樣,因爲雖然在得到卷積層的時候,我們使用了一些策略比如 “局部感受野”、“權值共享” 使得計算量大爲減少。但是得到的圖像信息可能仍然很多。下采樣取樣一般是減半(halve),通過把輸入的卷積層中的每個特徵圖上的2x2的區域的4個像素點值加起來,乘一個權值w,再加上一個偏置b,最後通過一個sigmoid函數得到S層的一個像素點(神經元)的值。在每一張feature map中,w和b是被其上的所有神經元共享的,也是唯一需要學習的參數。把一個2x2的區域濃縮成一個值,相當於總結出一個更高層的特徵。還有,每個2x2的採樣區域不重合。

  由於下采樣層S的特徵圖相當於C層的特徵圖寬高都減半,但畢竟C層的特徵圖的寬高可能是奇數啊。

  爲了不損失數據,可能會生成一些數據來彌補,如果缺失兩個格子,再copy一份即可。 如果是有地方只採到一個格子呢 ? 涉及到一些小策略。    

  

  簡單粗暴,用最直接的公式:  (3)


那麼下采樣層的神經元總數 = 總像素點個數 =  特徵圖數目 x S_width x S_height

  隱層可訓練參數個數 = 特徵圖數目 x (1+1) = 特徵圖數目 x 2     (1+1 是一個w加一個b)

  那麼連接數是怎麼計算的呢?  前面說過了,卷積層的2x2區域的4個像素加起來乘以一個w再加上b就得到下采樣層的一個神經元的值. 那麼這個神經元實際上有5個連接出去。爲什麼? 和4個像素的各有一個連接(四個連接上面的參數都是同一個w),和可加偏置b有一個連接,共5個連接。

  所以連接數 = 神經元總數 x (2x2+1) = 神經元總數 x 5

  

  下采樣不改變特徵圖的數目

 

  隱層可訓練參數個數 = 特徵圖數目 x 2

  下采樣層的神經元總數= 特徵圖數目 x S_width x S_height

  連接數  = 神經元總數 x 5



二. 計算實踐

 

下面以Yann LeCun的手寫數字識別CNN “LeNet-5” 爲例,算算裏面的一些參數:




                                                                    圖4


LeNet-5的網絡結構:Input-C1-S2-C3-S4-C5-F6

 

Input-C1

  這之間有個單通道濾波器 5x5x1 → 6,stride = 5。濾波器大小爲 5x5x1 = 25,有一個可加偏置,6中濾波器得到C1的6個特徵圖。按照我在上面給出的公式,可以算出:

  可訓練參數 = (5x5x1 + 1) x 6 = 156

  C1一層特徵圖神經元的總數 = floor( (32-5)/1 +1 ) x floor( (32-5)/1 + 1) = 28x28,也是C1特徵圖的大小。

  總神經元的個數 = 28x28x6

  每個神經元的的連接數 = 5x5 + 1 (5x5的濾波區域 + 1個可加bias)

  總連接數 = 28x28x6x(5x5+1) = 122,304個

  另外,不要把濾波區域(filter_width x filter_height) 和 濾波器的大小(filter_width x filter_height x filer_channels) 搞混了。在這個例子中“5x5” 和 “5x5x1” 很不一樣。

 

C1-S2

   可訓練參數 = 6 x (1+1) = 12個  (6個特徵圖 x (1個w+1個b))

   S2一層特徵圖神經元的總數 = ceiling(28/2) x ceiling(28/2) = 14x14,也是S2特徵圖的大小

   總神經元的個數 = 14x14x6個

   每個神經元的連接數 = 2x2 + 1 (2x2的採樣區域+1個可加bias)

   總連接數 = 14x14x6x(2x2 + 1) = 5,880個

 

S2-C3

  看着圖4,發現S2層的6個特徵圖,卷積得到了C3層的16個特徵圖。這裏用到的策略是組合。首先,我們要把S2層的6個特徵圖看成是首尾相連的。

那麼3個相鄰的特徵圖組合的組合數是6,4個相鄰的特徵圖組合的組合數也是6,4個不全相鄰的特徵圖組合的組合數是9。然後就是會有C3層的特徵圖上的神經元指向S2層的多個特徵圖的區域的情況出現。

  譬如,一種分配情況: C3的前6個特徵圖以S2中3個相鄰的特徵圖集合爲輸入,接下來的6個特徵圖以S2中4個相鄰的特徵圖集合爲輸入,再有3個特徵圖以不全相鄰的4個特徵圖子集(從9個裏面挑3個出來)爲輸入,最後一個特徵圖以S2中所有特徵圖作爲輸入。且濾波器爲 5x5x1 → 10,stride = 1。

  這樣,需要訓練的參數總數 = (5x5x1x3 + 1) x 6 + (5x5x1x4 + 1) x 6 + (5x5x1x4 + 1) x 3 + (5x5x1x6 + 1) x 1 =  1,516

  計算的過程很簡單,比如說第1項: (5x5x1x3 + 1) x 6  的意思就是前6個特徵圖中的一個,它上面的神經元,指向S2裏的三個特徵圖的5x5區域,再加上一個偏置,一張特徵圖的神經元共享權值。所以一張圖有 (5x5x1x3 + 1)個參數,然後總共有6個類似但不一樣(連接的S2的特徵圖不全一樣,所以參數不一樣)的圖。

  C3的神經元總數 = 16 x ( floor( (14-5)/1 + 1) x floor( (14-5)/1 + 1) ) = 1,600個

  連接數 =  (5x5x1x3+1)x100x6 + (5x5x1x4+1)x100x6 + (5x5x1x4+1)x100x3 + (5x5x1x6+1)x100x1 = 151,600個  

  爲啥上面的每一項裏面都有一個 “x1”呢,因爲濾波器的大小不只是寬高,還要乘以通道數。實際上你要把卷積核看成是立體的,只是在LeNet-5裏面用的都是單通道濾波器,所以厚度爲1而已。至於爲什麼要用16個卷積核,是經過實驗驗證比較合適 ?

 

C3-S4

   可訓練參數 = (1+1) x 16 = 32個

   S4一層特徵圖神經元的總數 = ceiling(10/2) x ceiling(10/2) = 5x5,也是S4特徵圖的大小

   總神經元的個數 = 25x16 = 400個

   每個神經元的連接數 = 2x2 + 1 = 5個 (2x2的採樣區域 + 1個可加bias)

   總連接數 = 400 x 5 = 2,000個

 

S4-C5

  S4-C5層的濾波器爲 5x5x1 → 120,所以C5層有120個特徵圖。每個特徵圖的大小爲 floor( (5-5)/1 + 1) x floor( (5-5)/1 + 1) = 1x1。每個特徵圖只有1個神經元。由於濾波區域的大小是5x5,這剛好是S4層的特徵圖的大小。相當於說,一個C5的特徵圖和它所連接的S4的特徵圖爲全連接。而且,在LeNet-5中,C5中的特徵圖是指向S4所有的特徵圖的。相當於說,C5的每一個神經元,和S4層上的每一個像素點都連接了。

  由於不同特徵圖是不會共享權值的,所以可訓練參數個數 = 連接數 = (5x5x1x16 + 1) x 120 = 48,120個

  C5層神經元的總數: 120個

 

C5-F6

  F6層有84個單元,C5和F6也是全連接的,同樣地: 可訓練參數個數 = 連接數 = (120 + 1) x 84 = 10,164個

 

  接下來就是傳統的神經網絡了。至於後面的NN部分做了什麼,怎麼做,在引用文獻的論文,或者鏈接博客的末尾也有講述。目前,我對部分不太瞭解。好好學習吧。

 


 

三. 關於pooling

  

  還記得上面網絡裏邊的下采樣層S嗎,就是用pooling技術把一個輸入圖的2x2區域裏的值,通過一些方法(加權,求平均,求最大)來得到S層的一個神經元的值。pooling就是所謂“池化”,把四個像素點的值以一定比例像調雞尾酒一樣勾勾兌兌,弄出一個新值來,最多再加一個偏置,就得到一杯新酒了。常見的pooling策略有 max-pooling、mean-pooling、stochastic-pooling三種。max-pooling就是從4個值裏邊選最大的那個,mean-pooling就是取平均、stochastic-pooling就是按照某種“重要性”的原則,4個點分別乘以不同的權值。

  pooling很直觀的一個目的就是爲了減少參數。除此之外,還能保證一定的不變性(invariance)。不變性包括 1) 平移不變性 2) 旋轉不變性 3) 伸縮不變性。普遍認同的是能保證小範圍的平移不變性,後面兩種存在爭議,讓人感覺很隨機 ? 再回去看三種pooling策略,前面兩個極其簡單粗暴,令人震驚。最後一個雖然比前面兩個溫和很多,但是權重的設置怎麼搞 ?  還是忒不靠譜。看到知乎上有人說—前面兩種pooling策略在參考文獻[2]中有詳細的分析。不過,我就沒再看下去了,還有別的事要忙。

 


 

References:


[1] Y. LeCun,L. Bottou,Y.Bengio,and P. Haffner. Gradient-based learning applied to document recognition. Proceedings of the IEEE,1998. 2

[2] Boureau, Y.-L; Bach,F.; LeCun, Y:; Ponce, J. Learning mid-level features for recognition. In CVPR, 2010.

[3] http://blog.csdn.net/zouxy09/article/details/8781543


發佈了36 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章