原來CNN是這樣提取影像特徵的。。。

計算機視覺life發表於2018-11-27

閱讀本文8分鐘就夠了吧?

對於即將到來的人工智慧時代,作為一個有理想有追求的程式設計師,不懂深度學習(Deep Learning)這個超熱的領域,會不會感覺馬上就out了?作為機器學習的一個分支,深度學習同樣需要計算機獲得強大的學習能力,那麼問題來了,我們究竟要計算機學習什麼東西?答案當然是影像特徵了。將一張影像看做是一個個畫素值組成的矩陣,那麼對影像的分析就是對矩陣的數字進行分析,而影像的特徵,就隱藏在這些數字規律中。
深度學習對外推薦自己的一個很重要的點——深度學習能夠自動提取特徵。本文主要介紹卷積層提取特徵的原理過程,文章通過幾個簡單的例子,展示卷積層是如何工作的,以及概述了反向傳播的過程,將讓你對卷積神經網路CNN提取影像特徵有一個透徹的理解。那麼我們首先從最基本的數學計算——卷積操作開始。


1.卷積操作

假設有一個5 *5 的影像,使用一個 3*3 的卷積核(filter)進行卷積,得到一個3*3的矩陣(其實是Feature Map,後面會講),如下所示:

原來CNN是這樣提取影像特徵的。。。

下面的動圖清楚地展示瞭如何進行卷積操作(其實就是簡單的點乘運算):

原來CNN是這樣提取影像特徵的。。。

原來CNN是這樣提取影像特徵的。。。

一個影像矩陣經過一個卷積核的卷積操作後,得到了另一個矩陣,這個矩陣叫做特徵對映(feature map)。每一個卷積核都可以提取特定的特徵,不同的卷積核提取不同的特徵,舉個例子,現在我們輸入一張人臉的影像,使用某一卷積核提取到眼睛的特徵,用另一個卷積核提取嘴巴的特徵等等。而特徵對映就是某張影像經過卷積運算得到的特徵值矩陣。
講到這裡,可能大家還不清楚卷積核和特徵對映到底是個什麼東西,有什麼用?沒關係,畢竟理解了CNN 的卷積層如何運算,並不能自動給我們關於 CNN 卷積層原理的洞見。為了幫助指導你理解卷積神經網路的特徵提取,我們將採用一個非常簡化的例子。

2.特徵提取—"X" or "O"?

在CNN中有這樣一個問題,就是每次給你一張圖,你需要判斷它是否含有"X"或者"O"。並且假設必須兩者選其一,不是"X"就是"O"。理想的情況就像下面這個樣子:

原來CNN是這樣提取影像特徵的。。。 那麼如果影像如果經過變形、旋轉等簡單操作後,如何識別呢?這就好比老師教你1+1等於2,讓你獨立計算1+2等於幾是一個道理,就像下面這些情況,我們同樣希望計算機依然能夠很快並且很準的識別出來:

原來CNN是這樣提取影像特徵的。。。

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

如下圖所示,畫素值"1"代表白色,畫素值"-1"代表黑色。對於CNN來說,它是一塊一塊地來進行比對。它拿來比對的這個“小塊”我們稱之為Features(特徵)。在兩幅圖中大致相同的位置找到一些粗糙的特徵進行匹配,CNN能夠更好的看到兩幅圖的相似性。
對於字母"X"的例子中,那些由對角線和交叉線組成的features基本上能夠識別出大多數"X"所具有的重要特徵。

原來CNN是這樣提取影像特徵的。。。

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

原來CNN是這樣提取影像特徵的。。。

觀察下面幾張圖,a可以匹配到“X”的左上角和右下角,b可以匹配到中間交叉部位,而c可以匹配到“X”的右上角和左上角。

原來CNN是這樣提取影像特徵的。。。

原來CNN是這樣提取影像特徵的。。。

把上面三個小矩陣作為卷積核,就如第一部分結尾介紹的,每一個卷積核可以提取特定的特徵,現在給一張新的包含“X”的影像,CNN並不能準確地知道這些features到底要匹配原圖的哪些部分,所以它會在原圖中每一個可能的位置進行嘗試,即使用該卷積核在影像上進行滑動,每滑動一次就進行一次卷積操作,得到一個特徵值。仔細想想,是否有一點頭目呢?
(下圖中求平均是為了讓所有特徵值迴歸到-1到1之間)

原來CNN是這樣提取影像特徵的。。。

原來CNN是這樣提取影像特徵的。。。

最後將整張圖卷積過後,得到這樣的特徵矩陣:

原來CNN是這樣提取影像特徵的。。。

使用全部卷積核卷積過後,得到的結果是這樣的:

原來CNN是這樣提取影像特徵的。。。

仔細觀察,可以發現,其中的值,越接近為1表示對應位置和卷積核代表的特徵越接近,越是接近-1,表示對應位置和卷積核代表的反向特徵越匹配,而值接近0的表示對應位置沒有任何匹配或者說沒有什麼關聯。
那麼最後得到的特徵矩陣就叫做feature map特徵對映,通過特定的卷積核得到其對應的feature map。在CNN中,我們稱之為卷積層(convolution layer),卷積核在影像上不斷滑動運算,就是卷積層所要做的事情。同時,在內積結果上取每一區域性塊的最大值就是最大池化層的操作。CNN 用卷積層和池化層實現了圖片特徵提取方法。

3.反向傳播演算法BP

通過上面的學習,我們知道CNN是如何利用卷積層和池化層提取圖片的特徵,其中的關鍵是卷積核表示圖片中的區域性特徵。
而在現實中,使用卷積神經網路進行多分類獲目標檢測的時候,影像構成要比上面的X和O要複雜得多,我們並不知道哪個區域性特徵是有效的,即使我們選定區域性特徵,也會因為太過具體而失去反泛化性。還以人臉為例,我們使用一個卷積核檢測眼睛位置,但是不同的人,眼睛大小、狀態是不同的,如果卷積核太過具體化,卷積核代表一個睜開的眼睛特徵,那如果一個影像中的眼睛是閉合的,就很大可能檢測不出來,那麼我們怎麼應對這中問題呢,即如何確定卷積核的值呢?
這就引出了反向傳播演算法。什麼是反向傳播,以猜數字為例,B手中有一張數字牌讓A猜,首先A將隨意給出一個數字,B反饋給A是大了還是小了,然後A經過修改,再次給出一個數字,B再反饋給A是否正確以及大小關係,經過數次猜測和反饋,最後得到正確答案(當然,在實際的CNN中不可能存在百分之百的正確,只能是最大可能正確)。
所以反向傳播,就是對比預測值和真實值,繼而返回去修改網路引數的過程,一開始我們隨機初始化卷積核的引數,然後以誤差為指導通過反向傳播演算法,自適應地調整卷積核的值,從而最小化模型預測值和真實值之間的誤差。
舉一個簡單例子。綠色箭頭代表前向傳播,紅色代表為反向傳播過程,x、y是權重引數,L為誤差,L對x、y的導數表示誤差L的變化對x、y的影響程度,得到偏導數delta(x)後,x* = x-η*delta(x),其中η為學習率,從而實現權重的更新。

原來CNN是這樣提取影像特徵的。。。

在此放一個簡單的反向傳播程式碼,python版本,結合程式碼理解BP思想。
連結: https://pan.baidu.com/s/1WNm-rKO1exYKu2IiGtfBKw 提取碼: hwsu

4.總結

本文主要講解基本CNN的原理過程,卷積層和池化層可以提取影像特徵,經過反向傳播最終確定卷積核引數,得到最終的特徵,這就是一個大致的CNN提取特徵的過程。考慮到反向傳播計算的複雜性,在本文中不做重點講解,先作為了解思路,日後專門再講解反向傳播的方法原理。

我們的學習過程也像神經網路一樣,不斷地進行自學習和糾錯,提升自身實力。學無止境,希望本文可以讓你有那麼一點點的收穫。

5.參考

[1] http://www.algorithmdog.com/cnn-extracts-feat?open_source=weibo_search&from=timeline
[2] https://mp.weixin.qq.com/s/G5hNwX7mnJK11Cyr7E5b_Q
[3] https://www.zybuluo.com/hanbingtao/note/485480

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31562045/viewspace-2221749/,如需轉載,請註明出處,否則將追究法律責任。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2222062/,如需轉載,請註明出處,否則將追究法律責任。

相關文章