卷積神經網絡詳解

1 前言

    在dl中,有一個很重要的概念,就是卷積神經網絡CNN,基本是入門dl必須搞懂的東西。本文基本根據斯坦福的機器學習公開課、cs231n、與七月在線寒老師講的5月dl班第4次課CNN與經常使用框架視頻所寫,是一篇課程筆記。本只是想把重點放在其卷積計算具體是怎麼計算怎麼操做的,但後面不斷補充,故寫成了關於卷積神經網絡的通俗導論性的文章。有何問題,歡迎不吝指正。html

 

 

2 人工神經網絡

2.1 神經元

    神經網絡由大量的節點(或稱「神經元」、「單元」)和相互鏈接而成。每一個神經元接受輸入的線性組合,進行非線性變換(亦稱激活函數activation function)後輸出。每兩個節點之間的鏈接表明加權值,稱之爲權重(weight)。不一樣的權重和激活函數,則會致使神經網絡不一樣的輸出。git

    舉個手寫識別的例子,給定一個未知數字,讓神經網絡識別是什麼數字。此時的神經網絡的輸入由一組被輸入圖像的像素所激活的輸入神經元所定義。在經過激活函數進行非線性變換後,神經元被激活而後被傳遞到其餘神經元。重複這一過程,直到最後一個輸出神經元被激活。從而識別當前數字是什麼字。github

    神經網絡的每一個神經元/單元以下web

    相似wx + b的形式,其中網絡

  • a1~an爲輸入向量,固然,也經常使用x1~xn表示輸入
  • w1~wn爲權重
  • b爲偏置bias
  • f 爲激活函數
  • t 爲輸出

    若是隻是上面這樣一說,估計之前沒接觸過的十有八九又一定迷糊了。事實上,在20世紀50/60年代,上述簡單神經元被稱之爲感知機,能夠把感知機理解爲一個根據不一樣因素、以及各個因素的重要性程度而作決策的模型。框架

    舉個例子,這週末北京有一草莓音樂節,那去不去呢?決定你是否去有3個因素,這三個因素能夠對應三個輸入,分別用x一、x二、x3表示,此外,這三個因素對作決策的影響程度不同,各自的影響程度用權重w一、w二、w3表示。通常來講,音樂節的演唱嘉賓會很是影響你去不去,唱得好的前提下 即使天氣很差、沒人陪同均可忍受,但若是唱得很差還不如你上臺唱呢。因此,咱們能夠以下表示:機器學習

  • x1:是否有喜歡的演唱嘉賓。x1 = 1 你喜歡這些嘉賓,x1 = 0 你不喜歡這些嘉賓。嘉賓因素的權重w1 = 5
  • x2:天氣好壞。x2 = 1 天氣好,x2 = 0 天氣很差。天氣權重w2 = 2。
  • x3:是否有人陪你同去。x3 = 1 有人陪你同去,x2 = 0 沒人陪你同去。是否有陪同的權重w3 = 3。
    這樣,我們的決策模型函數便創建起來了:f(x) = g( w1*x1 + w2*x2 + w3*x3 + b ),g表示激活函數。不一樣的輸入會獲得不同的決策結果。

 

2.2 激活函數

    經常使用的激活函數有sigmoid、tanhrelu等等,前二者sigmoid/tanh比較常見於全連接層,後者relu常見於卷積層。這裏先簡要介紹下最基礎的sigmoid函數(btw,在本博客中SVM那篇文章開頭有提過)。函數

    sigmoid的函數表達式以下學習

 

    其中z是一個線性組合,好比z能夠等於:w0 + w1*x1 + w2*x2。經過代入很大的正數或很小的負數到函數中可知,g(z)結果趨近於0或1spa

    所以,sigmoid函數的圖形表示以下:

    也就是說,sigmoid函數的功能是至關於把一個實數壓縮至0到1之間。輸入很是大的正數時,輸出結果會接近1,而輸入很是大的負數時,則會獲得接近0的結果。壓縮至0到1有何用處呢?用處是這樣一來變能夠把激活函數看做一種「分類的機率」,好比激活函數的輸出爲0.9的話即可以解釋爲90%的機率爲正樣本。

2.3 神經網絡

    將下圖的這種單個神經元

    組織在一塊兒,便造成了神經網絡。下圖即是一個三層神經網絡結構

    上圖中最左邊的原始輸入信息稱之爲輸入層,最右邊的神經元稱之爲輸出層(上圖中輸出層只有一個神經元),中間的叫隱藏層。

    啥叫輸入層、輸出層、隱藏層呢?

  • 輸入層(Input layer),衆多神經元(Neuron)接受大量非線形輸入訊息。輸入的訊息稱爲輸入向量。
  • 輸出層(Output layer),訊息在神經元連接中傳輸、分析、權衡,造成輸出結果。輸出的訊息稱爲輸出向量。
  • 隱藏層(Hidden layer),簡稱「隱層」,是輸入層和輸出層之間衆多神經元和連接組成的各個層面。若是有多個隱藏層,則意味着多個激活函數。

    同時,每一層均可能由單個或多個神經元組成,每一層的輸出將會做爲下一層的輸入數據。好比下圖中間隱藏層來講,隱藏層的3個神經元a一、a二、a3皆各自接受來自多個不一樣權重的輸入,接着,a一、a二、a3又在自身各自不一樣權重的影響下 成爲的輸出層的輸入,最終由輸出層輸出最終結果。

    上圖(注:圖引自斯坦福機器學習公開課)中

  • 表示第j層第i個單元的激活函數
  • 表示從第j層映射到第j+1層的控制函數的權重矩陣
 

    此外,輸入層和隱藏層都存在一個偏置(bias unit),因此上圖中也增長了偏置項:x0、a0。針對上圖,有以下公式

    此外,上文中講的都是一層隱藏層,但實際中也有多層隱藏層的,即輸入層和輸出層中間夾着數層隱藏層,層和層之間是全鏈接的結構,同一層的神經元之間沒有鏈接。

 

 

3 卷積神經網絡之層級結構

   cs231n課程裏給出了卷積神經網絡各個層級結構,以下圖

    上圖中CNN要作的事情是:給定一張圖片,是車仍是馬未知,是什麼車也未知,如今須要模型判斷這張圖片裏具體是一個什麼東西,總之輸出一個結果:若是是車 那是什麼車

    因此

  • 最左邊是數據輸入層,對數據作一些處理,好比去均值(把輸入數據各個維度都中心化爲0,避免數據過多誤差,影響訓練效果)、歸一化(把全部的數據都歸一到一樣的範圍)、PCA/白化等等。CNN只對訓練集作「去均值」這一步。

    中間是

  • CONV:卷積計算層,線性乘積 求和。
  • RELU:激勵層,上文2.2節中有提到:ReLU是激活函數的一種。
  • POOL:池化層,簡言之,即取區域平均或最大。

    最右邊是

  • FC:全鏈接層
    這幾個部分中,卷積計算層是CNN的核心,下文將重點闡述。


4 CNN之卷積計算層

4.1 什麼是卷積

    首先,咱們來了解下什麼是卷積操做。
    對圖像(不一樣的數據窗口數據)和濾波矩陣(一組固定的權重:由於每一個神經元的權重固定,因此又能夠看作一個恆定的濾波器filter)作 內積(逐個元素相乘再求和)的操做就是所謂的『卷積』操做,也是卷積神經網絡的名字來源。
    好比下圖中,圖中左邊部分是原始輸入數據,圖中中間部分是濾波器filter,圖中右邊是輸出的新的二維數據。
 
    分解下上圖
對應位置上是數字先乘後相加 =
    中間濾波器filter與數據窗口作內積,其具體計算過程則是:4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0 + 0*1 + -4*2 = -8
 

4.2 圖像上的卷積

    在計算過程當中,輸入是必定區域大小(width*height)的數據,和濾波器filter(一組固定的權重)作內積後等到新的二維數據。
    對於下圖中,左邊是圖像輸入,中間部分就是濾波器filter(一組固定的權重),不一樣的濾波器filter會獲得不一樣的輸出數據,好比輪廓、顏色深淺。至關於若是想提取圖像的不一樣特徵,則用不一樣的濾波器filter,提取想要的關於圖像的特定信息:輪廓或顏色深淺。

    以下圖所示

 

 

 

 
 

4.3 cs231d的動態卷積圖   

    cs231n課程中,給了一張動圖,網址是: http://cs231n.github.io/assets/conv-demo/index.html
    若是初看此圖,可能不必定能立馬理解啥意思,但結合上文的內容後,理解這個動圖已經不是很困難的事情。
    下述動圖中,左邊是輸入,中間部分是兩個不一樣的濾波器Filter w0、Filter w1,最右邊則是兩個不一樣的輸出。

    隨着左邊數據窗口的平移滑動,濾波器Filter w0對不一樣的局部數據進行卷積計算。

    值得一提的是:

  • 左邊數據在變化,每次濾波器都是針對某一局部的數據窗口進行卷積,這就是所謂的CNN中的局部感知機制。
  • 與此同時,數據窗口滑動,但中間濾波器Filter w0的權重(即每一個神經元鏈接數據窗口的的權重)是固定不變的,這個權重不變即所謂的CNN中的參數共享機制。

    我第一次看到上面這個動態圖的時候,只以爲很炫,另外就是聽說「相乘後想加」,但到底具體是個怎麼相乘後想加的過程 則沒法一眼看出,網上也沒有一目瞭然的計算過程。本文來細究下。

    首先,咱們來分解下上述動圖,以下圖

    接着,咱們細究下上圖的具體計算過程。即上圖中的輸出結果-1具體是怎麼計算獲得的呢?其實,相似wx + b,w對應濾波器Filter w0,x對應不一樣的數據窗口,b對應Bias b0,至關於濾波器Filter w0與一個個數據窗口相乘再求和後,最後加上Bias b0獲得輸出結果-1,以下過程所示:

-1* 0 + 0*0 + 1*0

+

0*0 + 1*0 + 0*1

+

0*0 + -1*2 + -1*0

 

+

0*0 + -1*0 + -1*0

+

-1*0 + 1*0 + -1*0

+

0*0 + -1*0 + 1*1

 

+

0*0 + -1*0 + 1*0

+

0*0 + 0*1 + -1*0

+

0*0 + 1*0 + -1*1

 

+

 

1

=

-1

    而後濾波器Filter w0固定不變,數據窗口向右移動2步,繼續作內積計算,獲得4的輸出結果

    最後,換作另一個不一樣的濾波器Filter w一、不一樣的偏置Bias b1,再跟圖中最左邊的數據窗口作卷積,可獲得另一個不一樣的輸出。

 

 

5 CNN之激勵層與池化層

5.1 ReLU激勵

    2.2節介紹了激活函數sigmoid,但實際梯度降低中,容易飽和和終止梯度傳遞,且沒有0中心化。咋辦呢,能夠嘗試另一個激活函數:ReLU,其圖形表示以下

    ReLU的優勢是收斂快,求梯度簡單。

5.2 池化pool層

    前頭說了,池化,簡言之,即取區域平均或最大,以下圖所示

    上圖所展現的是取區域最大,即上圖左邊部分中 左上角2x2的矩陣中6最大,右上角2x2的矩陣中8最大,左下角2x2的矩陣中3最大,右下角2x2的矩陣中4最大,因此獲得上圖右邊部分的結果:6 8 3 4。很簡單不是?

 

 

6 後記

    本文基本上邊看5月dl班寒講的CNN視頻邊作筆記,以前斷斷續續看過很多CNN相關的資料(包括cs231n),但今晚看過視頻以後,才系統瞭解CNN究竟是個什麼東西,做爲聽衆 寒講的真心贊、清晰。而後在寫CNN相關的東西時,發現一些前置知識(好比神經元、多層神經網絡等也須要介紹下),包括CNN的其它層次機構(好比激勵層),因此本文本只想簡要介紹下卷積操做的,但考慮到知識之間的先後關聯,因此越寫越長,便成本文了。

    此外,在寫做本文的過程當中,請教了咱們講師團隊裏的寒、馮兩位,感謝他們。

    July、二零一六年七月三日晚更新。


7 參考文獻

  1. 人工神經網絡wikipedia
  2. 斯坦福機器學習公開課
  3. http://neuralnetworksanddeeplearning.com/
  4. 雨石 卷積神經網絡:http://blog.csdn.net/stdcoutzyx/article/details/41596663
  5. cs231n 神經網絡結構與神經元激勵函數:http://cs231n.github.io/neural-networks-1/
  6. cs231n 卷積神經網絡:http://cs231n.github.io/convolutional-networks/#overview
  7. cs231n 動態卷積圖:http://cs231n.github.io/assets/conv-demo/index.html
  8. 七月在線寒老師講的5月dl班第4次課CNN與經常使用框架視頻,過兩天會剪切部分放七月在線官網:julyedu.com
  9. 七月在線5月深度學習班:https://www.julyedu.com/course/getDetail/37
  10. 深度學習與計算機視覺系列(6)_神經網絡結構與神經元激勵函數:http://blog.csdn.net/han_xiaoyang/article/details/50447834
  11. 深度學習與計算機視覺系列(10)_細說卷積神經網絡:http://blog.csdn.net/han_xiaoyang/article/details/50542880
  12. 圖像卷積與濾波的一些知識點:http://blog.csdn.net/zouxy09/article/details/49080029
相關文章
相關標籤/搜索