[透析] 卷積神經(jīng)網(wǎng)絡(luò)CNN究竟是怎樣一步一步工作的?


當你聽到說深度學(xué)習(xí)打破了某項新技術(shù)障礙,那么十有八九就會涉及到卷積神經(jīng)網(wǎng)絡(luò)。它們也被稱作CNNs或著ConvNets,是深層神經(jīng)網(wǎng)絡(luò)領(lǐng)域的主力。它們已經(jīng)學(xué)會對圖像進行分類,在某些情況下甚至超過了人類。如果有一個方法證明了這種假設(shè),那就是CNN。特別酷的一點就是,當你將它們分解為基本模塊時,它們很容易被理解。這里有一個視頻,很詳細地討論了關(guān)于這些圖像問題。

LeNet-5
Classfication

先驗工作


A toy ConvNet:X’s and O’s

識別一幅圖片是包含有字母"X"還是字母"O"?

為了幫助指導(dǎo)你理解卷積神經(jīng)網(wǎng)絡(luò),我們講采用一個非常簡化的例子:確定一幅圖像是包含有"X"還是"O"?

這個例子足夠說明CNN背后的原理,同時它足夠簡單,能夠避免陷入不必要的細節(jié)。在CNN中有這樣一個問題,就是每次給你一張圖,你需要判斷它是否含有"X"或者"O"。并且假設(shè)必須兩者選其一,不是"X"就是"O"。理想的情況就像下面這個樣子:

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

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

計算機要解決上面這個問題,一個比較天真的做法就是先保存一張"X"和"O"的標準圖像(就像前面給出的例子),然后將其他的新給出的圖像來和這兩張標準圖像進行對比,看看到底和哪一張圖更匹配,就判斷為哪個字母。但是這么做的話,其實是非常不可靠的,因為計算機還是比較死板的。在計算機的“視覺”中,一幅圖看起來就像是一個二維的像素數(shù)組(可以想象成一個棋盤),每一個位置對應(yīng)一個數(shù)字。在我們這個例子當中,像素值"1"代表白色,像素值"-1"代表黑色。

當比較兩幅圖的時候,如果有任何一個像素值不匹配,那么這兩幅圖就不匹配,至少對于計算機來說是這樣的。
對于這個例子,計算機認為上述兩幅圖中的白色像素除了中間的3*3的小方格里面是相同的,其他四個角上都不同:

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

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

這也就是CNN出現(xiàn)所要解決的問題。

Features

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

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

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

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

接下來就跟進介紹里面的數(shù)學(xué)操作,也就是我們常說的“卷積”操作。

卷積(Convolution)

Convolution

當給你一張新的圖時,CNN并不能準確地知道這些features到底要匹配原圖的哪些部分,所以它會在原圖中每一個可能的位置進行嘗試。這樣在原始整幅圖上每一個位置進行匹配計算,我們相當于把這個feature變成了一個過濾器。這個我們用來匹配的過程就被稱為卷積操作,這也就是卷積神經(jīng)網(wǎng)絡(luò)名字的由來。

這個卷積操作背后的數(shù)學(xué)知識其實非常的簡單。要計算一個feature和其在原圖上對應(yīng)的某一小塊的結(jié)果,只需要簡單地將兩個小塊內(nèi)對應(yīng)位置的像素值進行乘法運算,然后將整個小塊內(nèi)乘法運算的結(jié)果累加起來,最后再除以小塊內(nèi)像素點總個數(shù)即可。如果兩個像素點都是白色(也就是值均為1),那么1*1 = 1,如果均為黑色,那么(-1)*(-1) = 1。不管哪種情況,每一對能夠匹配上的像素,其相乘結(jié)果為1。類似地,任何不匹配的像素相乘結(jié)果為-1。如果一個feature(比如n*n)內(nèi)部所有的像素都和原圖中對應(yīng)一小塊(n*n)匹配上了,那么它們對應(yīng)像素值相乘再累加就等于n2,然后除以像素點總個數(shù)n2,結(jié)果就是1。同理,如果每一個像素都不匹配,那么結(jié)果就是-1。具體過程如下:

對于中間部分,也是一樣的操作:

最后整張圖算完,大概就像下面這個樣子:

然后換用其他feature進行同樣的操作,最后得到的結(jié)果就是這樣了:

為了完成我們的卷積,我們不斷地重復(fù)著上述過程,將feature和圖中每一塊進行卷積操作。最后通過每一個feature的卷積操作,我們會得到一個新的二維數(shù)組。這也可以理解為對原始圖像進行過濾的結(jié)果,我們稱之為feature map,它是每一個feature從原始圖像中提取出來的“特征”。其中的值,越接近為1表示對應(yīng)位置和feature的匹配越完整,越是接近-1,表示對應(yīng)位置和feature的反面匹配越完整,而值接近0的表示對應(yīng)位置沒有任何匹配或者說沒有什么關(guān)聯(lián)。

這樣我們的原始圖,經(jīng)過不同feature的卷積操作就變成了一系列的feature map。我們可以很方便,直觀地將這整個操作視為一個單獨的處理過程。在CNN中,我們稱之為卷積層(convolution layer),這樣你可能很快就會想到后面肯定還有其他的layer。沒錯,后面會提到。我們可以將卷積層看成下面這個樣子:

因此可想而知,CNN其實做的操作也沒什么復(fù)雜的。但是盡管我們能夠以這一點篇幅就描述了CNN的工作,其內(nèi)部的加法,乘法和除法操作的次數(shù)其實會增加地很快。從數(shù)學(xué)的角度來說,它們會隨著圖像的大小,每一個filter的大小和filter的數(shù)目呈線性增長。由于有這么多因素的影響,很容易使得這個問題的計算量變得相當?shù)凝嫶?,這也難怪很多微處理器制造商現(xiàn)在都在生產(chǎn)制造專業(yè)的芯片來跟上CNN計算的需求。

池化(Pooling)

Pooling

CNN中使用的另一個有效的工具被稱為“池化(Pooling)”。池化可以將一幅大的圖像縮小,同時又保留其中的重要信息。池化背后的數(shù)學(xué)頂多也就是小學(xué)二年級水平。它就是將輸入圖像進行縮小,減少像素信息,只保留重要信息。通常情況下,池化都是2*2大小,比如對于max-pooling來說,就是取輸入圖像中2*2大小的塊中的最大值,作為結(jié)果的像素值,相當于將原始圖像縮小了4倍。(注:同理,對于average-pooling來說,就是取2*2大小塊的平均值作為結(jié)果的像素值。)

對于本文的這個例子,池化操作具體如下:

不足的外面補"0":

經(jīng)過最大池化操作(比如2*2大?。┲?,一幅圖就縮小為原來的四分之一了:

然后對所有的feature map執(zhí)行同樣的操作,得到如下結(jié)果:

因為最大池化(max-pooling)保留了每一個小塊內(nèi)的最大值,所以它相當于保留了這一塊最佳的匹配結(jié)果(因為值越接近1表示匹配越好)。這也就意味著它不會具體關(guān)注窗口內(nèi)到底是哪一個地方匹配了,而只關(guān)注是不是有某個地方匹配上了。這也就能夠看出,CNN能夠發(fā)現(xiàn)圖像中是否具有某種特征,而不用在意到底在哪里具有這種特征。這也就能夠幫助解決之前提到的計算機逐一像素匹配的死板做法。

當對所有的feature map執(zhí)行池化操作之后,相當于一系列輸入的大圖變成了一系列小圖。同樣地,我們可以將這整個操作看作是一個操作,這也就是CNN中的池化層(pooling layer),如下:

通過加入池化層,可以很大程度上減少計算量,降低機器負載。

Normalization

激活函數(shù)Relu (Rectified Linear Units)

這是一個很小但是很重要的操作,叫做Relu(Rectified Linear Units),或者修正線性單元。它的數(shù)學(xué)公式也很簡單:
![][01]
[01]:http://latex.codecogs.com/png.latex?f(x)%20=%20max(0,%20x)

對于輸入的負值,輸出全為0,對于正值,原樣輸出。關(guān)于其功能,更多詳見 這里。

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


最后,對整幅圖操作之后,結(jié)果如下:

同樣地,在CNN中,我們這一系列操作視為一個操作,那么就得到Relu Layer,如下:

Deep Learning

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

然后,我們加大網(wǎng)絡(luò)的深度,增加更多的層,就得到深度神經(jīng)網(wǎng)絡(luò)了:

然后在不同的層,我們進行可視化,就可以看到本文開頭提到的先驗知識里面的結(jié)果了:

全連接層(Fully connected layers)

根據(jù)結(jié)果判定為"X":


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

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

【綜合上述所有結(jié)構(gòu)】

這一整個過程,從前到后,被稱作”前向傳播“,得到一組輸出,然后通過反向傳播來不斷糾正錯誤,進行學(xué)習(xí)。

反向傳播 (Backpropagation)

此處數(shù)學(xué)原理可以參見:深度學(xué)習(xí) —— 反向傳播理論推導(dǎo).

Gradient Descent Optimizer

Hyperparameters

Application

Images
Soung
Text

Learn more

If you'd like to dig deeper into deep learning, check out my Demystifying Deep Learning post. I also recommend the notes from the Stanford CS 231 course by Justin Johnson and Andrej Karpathy that provided inspiration for this post, as well as the writings of Christopher Olah, an exceptionally clear writer on the subject of neural networks.

If you are one who loves to learn by doing, there are a number of popular deep learning tools available. Try them all! And then tell us what you think.
Caffe
CNTK
Deeplearning4j
TensorFlow
Theano
Torch
Many others

I hope you've enjoyed our walk through the neighborhood of Convolutional Neural Networks. Feel free to start up a conversation.

Brandon Rohrer

本文重點在前面的具體操作部分,所以后面的部分沒有細說,只是帶過了,如有必要,后期會逐漸完善,謝謝!

Reference:


(注:感謝您的閱讀,希望本文對您有所幫助。如果覺得不錯歡迎分享轉(zhuǎn)載,但請先點擊 這里 獲取授權(quán)。本文由 版權(quán)印 提供保護,禁止任何形式的未授權(quán)違規(guī)轉(zhuǎn)載,謝謝!)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,165評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,595評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,435評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,943評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,175評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,713評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,599評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,788評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,034評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,408評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,747評論 2 370

推薦閱讀更多精彩內(nèi)容