CNN卷積神經網絡(超詳解析)

1、神經網絡

首先了解神經網絡,大家移步這倆篇博客,一篇為純理論,一篇為實戰加理論。

  • 機器學習之神經網絡學習及其模型
  • 入門講解:使用numpy實現簡單的神經網絡(BP算法)

2、卷積神經網絡之層級結構

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

CNN卷積神經網絡(超詳解析)

上圖中CNN要做的事情是:給定一張圖片,是車還是馬未知,是什麼車也未知,現在需要模型判斷這張圖片裡具體是一個什麼東西,總之輸出一個結果:如果是車 那是什麼車 所以

  • 最左邊是數據輸入層,對數據做一些處理,比如去均值(把輸入數據各個維度都中心化為0,避免數據過多偏差,影響訓練效果)、歸一化(把所有的數據都歸一到同樣的範圍)、PCA/白化等等。CNN只對訓練集做“去均值”這一步。 中間是
  • CONV:卷積計算層,線性乘積 求和。
  • RELU:激勵層,上文2.2節中有提到:ReLU是激活函數的一種
  • POOL:池化層,簡言之,即取區域平均或最大 最右邊是
  • FC:全連接層

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

3CNN之卷積計算層

3.1 CNN怎麼進行識別 簡言之,當我們給定一個"X"的圖案,計算機怎麼識別這個圖案就是“X”呢?一個可能的辦法就是計算機存儲一張標準的“X”圖案,然後把需要識別的未知圖案跟標準"X"圖案進行比對,如果二者一致,則判定未知圖案即是一個"X"圖案。

而且即便未知圖案可能有一些平移或稍稍變形,依然能辨別出它是一個X圖案。如此,CNN是把未知圖案和標準X圖案一個局部一個局部的對比,如下圖所示

CNN卷積神經網絡(超詳解析)

而未知圖案的局部和標準X圖案的局部一個一個比對時的計算過程,便是卷積操作。卷積計算結果為1表示匹配,否則不匹配。

具體而言,為了確定一幅圖像是包含有"X"還是"O",相當於我們需要判斷它是否含有"X"或者"O",並且假設必須兩者選其一,不是"X"就是"O"。

CNN卷積神經網絡(超詳解析)

理想的情況就像下面這個樣子:

CNN卷積神經網絡(超詳解析)

標準的"X"和"O",字母位於圖像的正中央,並且比例合適,無變形

對於計算機來說,只要圖像稍稍有一點變化,不是標準的,那麼要解決這個問題還是不是那麼容易的:

CNN卷積神經網絡(超詳解析)

計算機要解決上面這個問題,一個比較天真的做法就是先保存一張"X"和"O"的標準圖像(就像前面給出的例子),然後將其他的新給出的圖像來和這兩張標準圖像進行對比,看看到底和哪一張圖更匹配,就判斷為哪個字母。

但是這麼做的話,其實是非常不可靠的,因為計算機還是比較死板的。在計算機的“視覺”中,一幅圖看起來就像是一個二維的像素數組(可以想象成一個棋盤),每一個位置對應一個數字。在我們這個例子當中,像素值"1"代表白色,像素值"-1"代表黑色。

CNN卷積神經網絡(超詳解析)

當比較兩幅圖的時候,如果有任何一個像素值不匹配,那麼這兩幅圖就不匹配,至少對於計算機來說是這樣的。

對於這個例子,計算機認為上述兩幅圖中的白色像素除了中間的3*3的小方格里面是相同的,其他四個角上都不同:

CNN卷積神經網絡(超詳解析)

因此,從表面上看,計算機判別右邊那幅圖不是"X",兩幅圖不同,得出結論:

CNN卷積神經網絡(超詳解析)

但是這麼做,顯得太不合理了。理想的情況下,我們希望,對於那些僅僅只是做了一些像平移,縮放,旋轉,微變形等簡單變換的圖像,計算機仍然能夠識別出圖中的"X"和"O"。就像下面這些情況,我們希望計算機依然能夠很快並且很準的識別出來:

CNN卷積神經網絡(超詳解析)

這也就是CNN出現所要解決的問題。

Features

CNN卷積神經網絡(超詳解析)

對於CNN來說,它是一塊一塊地來進行比對。它拿來比對的這個“小塊”我們稱之為Features(特徵)。在兩幅圖中大致相同的位置找到一些粗糙的特徵進行匹配,CNN能夠更好的看到兩幅圖的相似性,相比起傳統的整幅圖逐一比對的方法。

每一個feature就像是一個小圖(就是一個比較小的有值的二維數組)。不同的Feature匹配圖像中不同的特徵。在字母"X"的例子中,那些由對角線和交叉線組成的features基本上能夠識別出大多數"X"所具有的重要特徵。

CNN卷積神經網絡(超詳解析)

這些features很有可能就是匹配任何含有字母"X"的圖中字母X的四個角和它的中心。那麼具體到底是怎麼匹配的呢?如下:

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)

看到這裡是不是有了一點頭目呢。但其實這只是第一步,你知道了這些Features是怎麼在原圖上面進行匹配的。但是你還不知道在這裡面究竟進行的是怎樣的數學計算,比如這個下面3*3的小塊到底幹了什麼?

CNN卷積神經網絡(超詳解析)

這裡面的數學操作,就是我們常說的“卷積”操作。接下來,我們來了解下什麼是卷積操作。

3.2 什麼是卷積 對圖像(不同的數據窗口數據)和濾波矩陣(一組固定的權重:因為每個神經元的多個權重固定,所以又可以看做一個恆定的濾波器filter)做內積(逐個元素相乘再求和)的操作就是所謂的『卷積』操作,也是卷積神經網絡的名字來源。

非嚴格意義上來講,下圖中紅框框起來的部分便可以理解為一個濾波器,即帶著一組固定權重的神經元。多個濾波器疊加便成了卷積層。

CNN卷積神經網絡(超詳解析)

OK,舉個具體的例子。比如下圖中,圖中左邊部分是原始輸入數據,圖中中間部分是濾波器filter,圖中右邊是輸出的新的二維數據。

CNN卷積神經網絡(超詳解析)

中間濾波器filter與數據窗口做內積,其具體計算過程則是:40 + 00 + 00 + 00 + 01 + 01 + 00 + 01 + -4*2 = -8

3.3 圖像上的卷積

在下圖對應的計算過程中,輸入是一定區域大小(width*height)的數據,和濾波器filter(帶著一組固定權重的神經元)做內積後等到新的二維數據。

具體來說,左邊是圖像輸入,中間部分就是濾波器filter(帶著一組固定權重的神經元),不同的濾波器filter會得到不同的輸出數據,比如顏色深淺、輪廓。相當於如果想提取圖像的不同特徵,則用不同的濾波器filter,提取想要的關於圖像的特定信息:顏色深淺或輪廓。

如下圖所示

CNN卷積神經網絡(超詳解析)

3.4 GIF動態卷積圖 在CNN中,濾波器filter(帶著一組固定權重的神經元)對局部輸入數據進行卷積計算。每計算完一個數據窗口內的局部數據後,數據窗口不斷平移滑動,直到計算完所有數據。這個過程中,有這麼幾個參數:

  • a. 深度depth:神經元個數,決定輸出的depth厚度。同時代表濾波器個數。
  • b. 步長stride:決定滑動多少步可以到邊緣。
  • c.填充值zero-padding:在外圍邊緣補充若干圈0,方便從初始位置以步長為單位可以剛好滑倒末尾位置,通俗地講就是為了總長能被步長整除。
CNN卷積神經網絡(超詳解析)

cs231n課程中有一張卷積動圖,貌似是用d3js 和一個util 畫的,我根據cs231n的卷積動圖依次截取了18張圖,然後用一gif 製圖工具製作了一gif 動態卷積圖。如下gif 圖所示

CNN卷積神經網絡(超詳解析)

可以看到:

  • 兩個神經元,即depth=2,意味著有兩個濾波器。
  • 數據窗口每次移動兩個步長取3*3的局部數據,即stride=2。
  • zero-padding=1。 然後分別以兩個濾波器filter為軸滑動數組進行卷積計算,得到兩組不同的結果。 如果初看上圖,可能不一定能立馬理解啥意思,但結合上文的內容後,理解這個動圖已經不是很困難的事情:
  • 左邊是輸入(773中,7*7代表圖像的像素/長寬,3代表R、G、B 三個顏色通道)
  • 中間部分是兩個不同的濾波器Filter w0、Filter w1
  • 最右邊則是兩個不同的輸出 隨著左邊數據窗口的平移滑動,濾波器Filter w0 / Filter w1對不同的局部數據進行卷積計算。 值得一提的是:
  • 左邊數據在變化,每次濾波器都是針對某一局部的數據窗口進行卷積,這就是所謂的CNN中的局部感知機制。
  • 打個比方,濾波器就像一雙眼睛,人類視角有限,一眼望去,只能看到這世界的局部。如果一眼就看到全世界,你會累死,而且一下子接受全世界所有信息,你大腦接收不過來。當然,即便是看局部,針對局部裡的信息人類雙眼也是有偏重、偏好的。比如看美女,對臉、胸、腿是重點關注,所以這3個輸入的權重相對較大。

與此同時,數據窗口滑動,導致輸入在變化,但中間濾波器Filter w0的權重(即每個神經元連接數據窗口的權重)是固定不變的,這個權重不變即所謂的CNN中的參數(權重)共享機制。

  • 再打個比方,某人環遊全世界,所看到的信息在變,但採集信息的雙眼不變。btw,不同人的雙眼 看同一個局部信息 所感受到的不同,即一千個讀者有一千個哈姆雷特,所以不同的濾波器 就像不同的雙眼,不同的人有著不同的反饋結果。
  • 我第一次看到上面這個動態圖的時候,只覺得很炫,另外就是據說計算過程是“相乘後相加”,但到底具體是個怎麼相乘後相加的計算過程 則無法一眼看出,網上也沒有一目瞭然的計算過程。本文來細究下。 首先,我們來分解下上述動圖,如下圖 接著,我們細究下上圖的具體計算過程。即上圖中的輸出結果1具體是怎麼計算得到的呢?其實,類似wx + b,w對應濾波器Filter w0,x對應不同的數據窗口,b對應Bias b0,相當於濾波器Filter w0與一個個數據窗口相乘再求和後,最後加上Bias b0得到輸出結果1, 然後濾波器Filter w0固定不變,數據窗口向右移動2步,繼續做內積計算,得到0的輸出結果 最後,換做另外一個不同的濾波器Filter w1、不同的偏置Bias b1,再跟圖中最左邊的數據窗口做卷積,可得到另外一個不同的輸出。

4 CNN之激勵層,池化層,全連接層

4.1 ReLU激勵層 第一節倆篇博客介紹了激活函數sigmoid,但實際梯度下降中,sigmoid容易飽和、造成終止梯度傳遞,且沒有0中心化。咋辦呢,可以嘗試另外一個激活函數:ReLU,其圖形表示如下

CNN卷積神經網絡(超詳解析)

對於輸入的負值,輸出全為0,對於正值,原樣輸出。

下面我們看一下本文的離例子中relu激活函數具體操作:

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)

最後,我們將上面所提到的卷積,池化,激活放在一起,就是下面這個樣子:

CNN卷積神經網絡(超詳解析)

然後,我們加大網絡的深度,增加更多的層,就得到深度神經網絡了:

CNN卷積神經網絡(超詳解析)

4.2 池化pool層 前頭說了,池化,簡言之,即取區域平均或最大,如下圖所示(圖引自cs231n) CNN中使用的另一個有效的工具被稱為“池化(Pooling)”。池化可以將一幅大的圖像縮小,同時又保留其中的重要信息。池化背後的數學頂多也就是小學二年級水平。它就是將輸入圖像進行縮小,減少像素信息,只保留重要信息。通常情況下,池化都是22大小,比如對於max-pooling來說,就是取輸入圖像中22大小的塊中的最大值,作為結果的像素值,相當於將原始圖像縮小了4倍。(注:同理,對於average-pooling來說,就是取2*2大小塊的平均值作為結果的像素值。)

CNN卷積神經網絡(超詳解析)

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

4.3全連接層(Fully connected layers)

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)

根據結果判定為"X":

CNN卷積神經網絡(超詳解析)

在這個過程中,我們定義這一系列操作為”全連接層“(Fully connected layers):

CNN卷積神經網絡(超詳解析)

全連接層也能夠有很多個,如下:

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)

【綜合上述所有結構】

CNN卷積神經網絡(超詳解析)

5 綜合演練

參數 f:過濾器大小 s:步長

CNN卷積神經網絡(超詳解析)

CNN卷積神經網絡(超詳解析)


分享到:


相關文章: