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


當(dāng)你聽到說深度學(xué)習(xí)打破了某項新技術(shù)障礙绒窑,那么十有八九就會涉及到卷積神經(jīng)網(wǎng)絡(luò)末誓。它們也被稱作CNNs或著ConvNets颗味,是深層神經(jīng)網(wǎng)絡(luò)領(lǐng)域的主力超陆。它們已經(jīng)學(xué)會對圖像進(jìn)行分類,在某些情況下甚至超過了人類浦马。如果有一個方法證明了這種假設(shè)时呀,那就是CNN。特別酷的一點就是晶默,當(dāng)你將它們分解為基本模塊時谨娜,它們很容易被理解。這里有一個視頻磺陡,很詳細(xì)地討論了關(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背后的原理憔狞,同時它足夠簡單,能夠避免陷入不必要的細(xì)節(jié)彰阴。在CNN中有這樣一個問題瘾敢,就是每次給你一張圖,你需要判斷它是否含有"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)圖像進(jìn)行對比郑临,看看到底和哪一張圖更匹配栖博,就判斷為哪個字母。但是這么做的話厢洞,其實是非常不可靠的仇让,因為計算機還是比較死板的。在計算機的“視覺”中躺翻,一幅圖看起來就像是一個二維的像素數(shù)組(可以想象成一個棋盤)丧叽,每一個位置對應(yīng)一個數(shù)字。在我們這個例子當(dāng)中公你,像素值"1"代表白色踊淳,像素值"-1"代表黑色。

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

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

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

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

Features

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

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

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

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

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

卷積(Convolution)

Convolution

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

這個卷積操作背后的數(shù)學(xué)知識其實非常的簡單哥蔚。要計算一個feature和其在原圖上對應(yīng)的某一小塊的結(jié)果倒谷,只需要簡單地將兩個小塊內(nèi)對應(yīng)位置的像素值進(jìn)行乘法運算,然后將整個小塊內(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進(jìn)行同樣的操作,最后得到的結(jié)果就是這樣了:

為了完成我們的卷積顾孽,我們不斷地重復(fù)著上述過程奕扣,將feature和圖中每一塊進(jìn)行卷積操作罪塔。最后通過每一個feature的卷積操作,我們會得到一個新的二維數(shù)組迫靖。這也可以理解為對原始圖像進(jìn)行過濾的結(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ù)目呈線性增長。由于有這么多因素的影響凡泣,很容易使得這個問題的計算量變得相當(dāng)?shù)凝嫶笸魈郏@也難怪很多微處理器制造商現(xiàn)在都在生產(chǎn)制造專業(yè)的芯片來跟上CNN計算的需求。

池化(Pooling)

Pooling

CNN中使用的另一個有效的工具被稱為“池化(Pooling)”鞋拟。池化可以將一幅大的圖像縮小骂维,同時又保留其中的重要信息。池化背后的數(shù)學(xué)頂多也就是小學(xué)二年級水平贺纲。它就是將輸入圖像進(jìn)行縮小航闺,減少像素信息,只保留重要信息猴誊。通常情況下潦刃,池化都是2*2大小,比如對于max-pooling來說懈叹,就是取輸入圖像中2*2大小的塊中的最大值乖杠,作為結(jié)果的像素值,相當(dāng)于將原始圖像縮小了4倍澄成。(注:同理胧洒,對于average-pooling來說,就是取2*2大小塊的平均值作為結(jié)果的像素值墨状。)

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

不足的外面補"0":

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

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

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

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

通過加入池化層,可以很大程度上減少計算量即硼,降低機器負(fù)載逃片。

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)

對于輸入的負(fù)值,輸出全為0裂允,對于正值损离,原樣輸出。關(guān)于其功能绝编,更多詳見 這里僻澎。

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


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

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

Deep Learning

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

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

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

全連接層(Fully connected layers)

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


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

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

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

這一整個過程级解,從前到后,被稱作”前向傳播“田绑,得到一組輸出勤哗,然后通過反向傳播來不斷糾正錯誤,進(jìn)行學(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

本文重點在前面的具體操作部分芒划,所以后面的部分沒有細(xì)說,只是帶過了欧穴,如有必要民逼,后期會逐漸完善,謝謝涮帘!

Reference:


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市湾蔓,隨后出現(xiàn)的幾起案子瘫析,更是在濱河造成了極大的恐慌,老刑警劉巖默责,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贬循,死亡現(xiàn)場離奇詭異,居然都是意外死亡桃序,警方通過查閱死者的電腦和手機杖虾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媒熊,“玉大人奇适,你說我怎么就攤上這事÷ⅲ” “怎么了嚷往?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柠衅。 經(jīng)常有香客問我皮仁,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任贷祈,我火速辦了婚禮趋急,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘势誊。我一直安慰自己呜达,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布粟耻。 她就那樣靜靜地躺著闻丑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勋颖。 梳的紋絲不亂的頭發(fā)上嗦嗡,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音饭玲,去河邊找鬼侥祭。 笑死,一個胖子當(dāng)著我的面吹牛茄厘,可吹牛的內(nèi)容都是我干的矮冬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼次哈,長吁一口氣:“原來是場噩夢啊……” “哼胎署!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窑滞,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤琼牧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哀卫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巨坊,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年此改,在試婚紗的時候發(fā)現(xiàn)自己被綠了趾撵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡共啃,死狀恐怖占调,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情移剪,我是刑警寧澤究珊,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站挂滓,受9級特大地震影響苦银,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赶站,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一幔虏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贝椿,春花似錦想括、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渣窜,卻和暖如春铺根,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乔宿。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工位迂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人详瑞。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓掂林,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坝橡。 傳聞我的和親對象是個殘疾皇子泻帮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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