CNN卷積神經(jīng)網(wǎng)絡(luò)入門超詳細(xì)解析
點擊下方卡片,關(guān)注“新機器視覺”公眾號
視覺/圖像重磅干貨,第一時間送達
來源:CSDN
作者:越前浩波
一、神經(jīng)網(wǎng)絡(luò)
首先了解什么是神經(jīng)網(wǎng)絡(luò),大家可以先看下以下兩篇博客,一篇為純理論講解,一篇為實戰(zhàn)加理論,在此就不過多詳細(xì)介紹。
機器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)及其模型(https://blog.csdn.net/weixin_44023658/article/details/105691321)
入門講解:使用numpy實現(xiàn)簡單的神經(jīng)網(wǎng)絡(luò)(BP算法)
(https://blog.csdn.net/weixin_44023658/article/details/105694079)
二、卷積神經(jīng)網(wǎng)絡(luò)之層級結(jié)構(gòu)
要了解卷積神經(jīng)網(wǎng)絡(luò)首先要了解它的各個層級結(jié)構(gòu),如下圖
上圖中CNN要做的事情是:給定一張圖片,是車還是馬未知,是什么車也未知,現(xiàn)在需要模型判斷這張圖片里具體是一個什么東西,總之輸出一個結(jié)果:如果是車 那是什么車
所以
上圖從左到右依次為→
數(shù)據(jù)輸入層:對數(shù)據(jù)做一些處理,比如去均值(把輸入數(shù)據(jù)各個維度都中心化為0,避免數(shù)據(jù)過多偏差,影響訓(xùn)練效果)、歸一化(把所有的數(shù)據(jù)都?xì)w一到同樣的范圍)、PCA/白化等等。CNN只對訓(xùn)練集做“去均值”這一步。
CONV:卷積計算層,線性乘積 求和。
RELU:激勵層,上文2.2節(jié)中有提到:ReLU是激活函數(shù)的一種
POOL:池化層,簡言之,即取區(qū)域平均或最大
FC:全連接層
這幾個部分中,卷積計算層是CNN的核心,下文將重點闡述此部分。
三、CNN之卷積計算層
1、 CNN如何進行識別
簡言之,當(dāng)我們給定一個"X"的圖案,計算機如何識別這個圖案就是“X”呢?一個可能的辦法就是計算機存儲一張標(biāo)準(zhǔn)的“X”圖案,然后把需要識別的未知圖案跟標(biāo)準(zhǔn)"X"圖案進行比對,如果二者一致,則判定未知圖案即是一個"X"圖案。
這樣即便未知圖案可能有一些平移或稍稍變形,依然能辨別出它是一個X圖案。所以,CNN是把未知圖案和標(biāo)準(zhǔn)X圖案一個局部一個局部的對比,如下圖所示
而未知圖案的局部和標(biāo)準(zhǔn)X圖案的局部一個一個比對時的計算過程,便是卷積操作。卷積計算結(jié)果為1表示匹配,否則不匹配。
具體來說,為了確定一幅圖像是包含有"X"還是"O",我們需要判斷它是否含有"X"或者"O",并且假設(shè)必須兩者選其一,不是"X"就是"O"。
理想的情況如下圖所示:
標(biāo)準(zhǔn)的"X"和"O",字母位于圖像的正中央,并且比例合適,無變形
對于計算機來說,只要圖像稍稍有一點變化,不是標(biāo)準(zhǔn)的,那在識別過程中就會遇到困難:
計算機要解決上面這個問題,一個比較直接的做法就是先保存一張"X"和"O"的標(biāo)準(zhǔn)圖像(就像前面給出的例子),然后將其他的新給出的圖像來和這兩張標(biāo)準(zhǔn)圖像進行對比,看看到底和哪一張圖更匹配,就判斷為哪個字母。
但是這么做的話,精準(zhǔn)度較低,因為在在計算機的“視覺”中,一幅圖看起來就像是一個二維的像素數(shù)組(可以想象成一個棋盤),每一個位置對應(yīng)一個數(shù)字。在我們這個例子當(dāng)中,像素值"1"代表白色,像素值"-1"代表黑色。
當(dāng)比較兩幅圖的時候,如果有任何一個像素值不匹配,那么這兩幅圖就不匹配,至少對于計算機來說是這樣的。
所以,上述事例中,計算機認(rèn)為兩幅圖中的白色像素除了中間的3*3的小方格里面是相同的,其他四個角上都不同:
從表面上看,計算機會判別右邊那幅圖不是"X",兩幅圖不同,則得出結(jié)論:
但是這么做,顯得太不合理,理想的狀況下,我們希望對于那些僅僅只是做了一些像平移,縮放,旋轉(zhuǎn),微變形等簡單變換的圖像,計算機仍然能夠識別出圖中的"X"和"O"。
如下圖所示,我們希望計算機依然能夠很快并且很準(zhǔn)的識別出圖像:
于是就有了CNN。
2、特征提取
不同于計算機,對于CNN來說,是通過一塊一塊地來進行比對,比對的這個“小塊”我們稱之為Features(特征)。在兩幅圖中大致相同的位置找到一些粗糙的特征進行匹配,相比傳統(tǒng)的整幅圖逐一比對的方法,CNN能夠更好的看到兩幅圖的相似性。
每一個feature就像是一個小圖(就是一個比較小的有值的二維數(shù)組)。不同的Feature匹配圖像中不同的特征。在字母"X"的例子中,那些由對角線和交叉線組成的features基本上能夠識別出大多數(shù)"X"所具有的重要特征。
這些features很有可能就是匹配任何含有字母"X"的圖中字母X的四個角和它的中心。那么具體到底是怎么匹配的呢?如下所示:





看到這里是不是已經(jīng)有了一些頭緒,但其實目前只是第一步,現(xiàn)在知道了這些Features是怎么在原圖上面進行匹配的,但是還不知道如何通過Features進行數(shù)學(xué)計算,比如這個下面3*3的小塊到底如何計算的。
這里面的數(shù)學(xué)操作,就是我們常說的“卷積”操作。
下面會介紹卷積操作的詳細(xì)步驟。
2、什么是卷積
對圖像(不同的數(shù)據(jù)窗口數(shù)據(jù))和濾波矩陣(一組固定的權(quán)重:因為每個神經(jīng)元的多個權(quán)重固定,所以又可以看做一個恒定的濾波器filter)做內(nèi)積(逐個元素相乘再求和)的操作就是所謂的『卷積』操作,也是卷積神經(jīng)網(wǎng)絡(luò)的名字來源。
非嚴(yán)格意義上來講,下圖中紅框框起來的部分便可以理解為一個濾波器,即帶著一組固定權(quán)重的神經(jīng)元。多個濾波器疊加成了卷積層。

舉個具體的例子,比如下圖中,圖中左邊部分是原始輸入數(shù)據(jù),圖中中間部分是濾波器filter,圖中右邊是輸出的新的二維數(shù)據(jù)。
中間濾波器filter與數(shù)據(jù)窗口做內(nèi)積,其具體計算過程則是:40 + 00 + 00 + 00 + 01 + 01 + 00 + 01 + -4*2 = -8
3、 圖像上的卷積
在下圖對應(yīng)的計算過程中,輸入是一定區(qū)域大小(width*height)的數(shù)據(jù),和濾波器filter(帶著一組固定權(quán)重的神經(jīng)元)做內(nèi)積后等到新的二維數(shù)據(jù)。
左邊是圖像輸入,中間部分就是濾波器filter(帶著一組固定權(quán)重的神經(jīng)元),不同的濾波器filter會得到不同的輸出數(shù)據(jù),比如顏色深淺、輪廓。相當(dāng)于如果想提取圖像的不同特征,則用不同的濾波器filter,提取想要的關(guān)于圖像的特定信息:顏色深淺或輪廓。
如下圖所示:
4、 動態(tài)卷積圖演示
在CNN中,濾波器filter(帶著一組固定權(quán)重的神經(jīng)元)對局部輸入數(shù)據(jù)進行卷積計算。每計算完一個數(shù)據(jù)窗口內(nèi)的局部數(shù)據(jù)后,數(shù)據(jù)窗口不斷平移滑動,直到計算完所有數(shù)據(jù)。這個過程中,有這么幾個參數(shù):
a. 深度depth:神經(jīng)元個數(shù),決定輸出的depth厚度。同時代表濾波器個數(shù)。
b. 步長stride:決定滑動多少步可以到邊緣。
c.填充值zero-padding:在外圍邊緣補充若干圈0,方便從初始位置以步長為單位可以剛好滑倒末尾位置,通俗地講就是為了總長能被步長整除。

cs231n課程中有一張卷積動圖,如下圖所示:
通過上圖我們可以看到:
兩個神經(jīng)元,即depth=2,意味著有兩個濾波器。數(shù)據(jù)窗口每次移動兩個步長取3*3的局部數(shù)據(jù),即stride=2;zero-padding=1,然后分別以兩個濾波器filter為軸滑動數(shù)組進行卷積計算,得到兩組不同的結(jié)果。
如果初看上圖,可能不一定能馬上理解,但結(jié)合上文的內(nèi)容后,便可以更清晰的理解其含義。
左邊是輸入(773中,7*7代表圖像的像素/長寬,3代表R、G、B 三個顏色通道),中間部分是兩個不同的濾波器Filter w0、Filter w1,最右邊則是兩個不同的輸出。
隨著左邊數(shù)據(jù)窗口的平移滑動,濾波器Filter w0 / Filter w1對不同的局部數(shù)據(jù)進行卷積計算。值得一提的是,左邊數(shù)據(jù)在變化,每次濾波器都是針對某一局部的數(shù)據(jù)窗口進行卷積,這就是所謂的CNN中的局部感知機制。
舉個例子,濾波器就像一雙眼睛,人類視角有限,一眼望去,只能看到這世界的局部。如果一下子接受全世界所有信息,大腦會接收不過來。當(dāng)然,即便是看局部,針對局部里的信息人類雙眼也是有偏重、偏好的,會根據(jù)自己的興趣愛好進行輸入的權(quán)重的分配。
與此同時,數(shù)據(jù)窗口滑動,導(dǎo)致輸入在變化,但中間濾波器Filter w0的權(quán)重(即每個神經(jīng)元連接數(shù)據(jù)窗口的權(quán)重)是固定不變的,這個權(quán)重不變即所謂的CNN中的參數(shù)(權(quán)重)共享機制。
再舉個例子,某人環(huán)游全世界,所看到的信息在變,但采集信息的雙眼不變,另外不同人的雙眼 看同一個局部信息
所感受到的不同,即一千個讀者有一千個哈姆雷特,所以不同的濾波器 就像不同的雙眼,不同的人有著不同的反饋結(jié)果。
我第一次看到上面這個動態(tài)圖的時候,只覺得很炫,另外就是只初步了解計算過程是“相乘后相加”,但到底具體是個怎么相乘后相加的計算過程變不得而知,后續(xù)通過學(xué)習(xí)后才有了更深入的了解。
下面我們就來詳細(xì)說明下其計算步驟。
首先,我們將上述動圖進行分解,如下圖

其次,我們細(xì)究下上圖的具體計算過程。即上圖中的輸出結(jié)果1具體是怎么計算得到,其原理類似wx + b,w對應(yīng)濾波器Filter w0,x對應(yīng)不同的數(shù)據(jù)窗口,b對應(yīng)Bias b0,相當(dāng)于濾波器Filter w0與一個個數(shù)據(jù)窗口相乘再求和后,最后加上Bias b0得到輸出結(jié)果1,具體過程如下過程所示:









然后濾波器Filter w0固定不變,數(shù)據(jù)窗口向右移動2步,繼續(xù)做內(nèi)積計算,得到0的輸出結(jié)果

最后,換做另外一個不同的濾波器Filter w1、不同的偏置Bias b1,再跟圖中最左邊的數(shù)據(jù)窗口做卷積,可得到另外一個不同的輸出。

以上就是CNN在圖像上進行的卷積的整個計算過程。
四、 CNN之激勵層,池化層,全連接層
1、 ReLU激勵層
第一節(jié)倆篇博客介紹了激活函數(shù)sigmoid,但實際梯度下降中,sigmoid容易飽和、造成終止梯度傳遞,且沒有0中心化。咋辦呢,可以嘗試另外一個激活函數(shù):ReLU,其圖形表示如下圖所示:

對于輸入的負(fù)值,輸出全為0,對于正值,原樣輸出。
下圖演示了本文的例子中relu激活函數(shù)具體操作:



我們將上面所提到的卷積,池化,激活放在一起,于是形成下面這個樣子:
然后,我們加大網(wǎng)絡(luò)的深度,增加更多的層,就可以得到深度神經(jīng)網(wǎng)絡(luò)了:
2、 池化pool層
前面提到,池化,簡言之,即取區(qū)域平均或最大,如下圖所示,CNN中使用的另一個有效的工具被稱為“池化(Pooling)”。池化可以將一幅大的圖像縮小,同時又保留其中的重要信息。池化就是將輸入圖像進行縮小,減少像素信息,只保留重要信息。通常情況下,池化都是22大小,比如對于max-pooling來說,就是取輸入圖像中22大小的塊中的最大值,作為結(jié)果的像素值,相當(dāng)于將原始圖像縮小了4倍。(注:同理,對于average-pooling來說,就是取2*2大小塊的平均值作為結(jié)果的像素值。)
上圖所展示的是取區(qū)域最大,即上圖左邊部分中 左上角2x2的矩陣中6最大,右上角2x2的矩陣中8最大,左下角2x2的矩陣中3最大,右下角2x2的矩陣中4最大,所以得到上圖右邊部分的結(jié)果:6 8 3 4。
3、全連接層(Fully connected layers)
全連接層(fully connected layers,F(xiàn)C)在整個卷積神經(jīng)網(wǎng)絡(luò)中起到“分類器”的作用。如果說卷積層、池化層和激活函數(shù)層等操作是將原始數(shù)據(jù)映射到隱層特征空間的話,全連接層則起到將學(xué)到的分布式特征映射到樣本標(biāo)記空間的作用。
全連接層計算過程中,首先需要在前層的卷積層中采樣下來,并把分布式特征進行分類
然后在這些特征中找到與x和o強相關(guān)的特征進行分類,
通過卷積計算分別得出x、o對應(yīng)的結(jié)果:
從下圖中可以看出,根據(jù)以上計算可了解到最終判定為"X",所以最終結(jié)果為X:
在這個過程中,我們定義這一系列操作為”全連接層“(Fully connected layers):全連接層可以通過增加寬度和長度影響模型的參數(shù),如下圖所示:
所有的層級以及計算得出結(jié)果的過程便是卷積神經(jīng)網(wǎng)絡(luò)的基本原理。
—版權(quán)聲明—
僅用于學(xué)術(shù)分享,版權(quán)屬于原作者。
若有侵權(quán),請聯(lián)系微信號:yiyang-sy 刪除或修改!
