1. 程式人生 > >原來CNN是這樣提取圖像特征的。。。

原來CNN是這樣提取圖像特征的。。。

learning 初始化 原理過程 新世界 第一部分 了解 進行 數學 如何工作

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

1.卷積操作

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

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

技術分享圖片

技術分享圖片

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

2.特征提取—“X” or “O”?

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

技術分享圖片

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

技術分享圖片

技術分享圖片

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

技術分享圖片

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

技術分享圖片

仔細觀察,可以發現,其中的值,越接近為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),其中η為學習率,從而實現權重的更新。

技術分享圖片


在此放一個簡單的反向傳播代碼,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

歡迎關註公眾號:計算機視覺life,一起探索計算機視覺新世界~


---------------------
作者:electech6
來源:CSDN
原文:https://blog.csdn.net/electech6/article/details/84584791
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

原來CNN是這樣提取圖像特征的。。。