最近看到知乎發如今講解理論知識比有些博客容易理解不少,這裏記一篇卷積神經網絡理論知識python
原地址:https://zhuanlan.zhihu.com/p/50800849程序員
對於即將到來的人工智能時代,做爲一個有理想有追求的程序員,不懂深度學習(Deep Learning)這個超熱的領域,會不會感受立刻就out了?做爲機器學習的一個分支,深度學習一樣須要計算機得到強大的學習能力,那麼問題來了,咱們究竟要計算機學習什麼東西?答案固然是圖像特徵了。將一張圖像看作是一個個像素值組成的矩陣,那麼對圖像的分析就是對矩陣的數字進行分析,而圖像的特徵,就隱藏在這些數字規律中。
深度學習對外推薦本身的一個很重要的點——深度學習可以自動提取特徵。本文主要介紹卷積層提取特徵的原理過程,文章經過幾個簡單的例子,展現卷積層是如何工做的,以及概述了反向傳播的過程,將讓你對卷積神經網絡CNN提取圖像特徵有一個透徹的理解。那麼咱們首先從最基本的數學計算——卷積操做開始。
假設有一個5*5的圖像,使用一個3*3的卷積核(filter)進行卷積,獲得一個3*3的矩陣(實際上是Feature Map,後面會講),以下所示:算法
下面的動圖清楚地展現瞭如何進行卷積操做(其實就是簡單的點乘運算):網絡
一個圖像矩陣通過一個卷積核的卷積操做後,獲得了另外一個矩陣,這個矩陣叫作特徵映射(feature map)。每個卷積核均可以提取特定的特徵,不一樣的卷積核提取不一樣的特徵,舉個例子,如今咱們輸入一張人臉的圖像,使用某一卷積核提取到眼睛的特徵,用另外一個卷積核提取嘴巴的特徵等等。而特徵映射就是某張圖像通過卷積運算獲得的特徵值矩陣。
講到這裏,可能你們還不清楚卷積核和特徵映射究竟是個什麼東西,有什麼用?不要緊,畢竟理解了CNN 的卷積層如何運算,並不能自動給咱們關於 CNN 卷積層原理的洞見。爲了幫助指導你理解卷積神經網絡的特徵提取,咱們將採用一個很是簡化的例子。
在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:spa
觀察下面幾張圖,a能夠匹配到「X」的左上角和右下角,b能夠匹配到中間交叉部位,而c能夠匹配到「X」的右上角和左上角。3d
把上面三個小矩陣做爲卷積核,就如第一部分結尾介紹的,每個卷積核能夠提取特定的特徵,如今給一張新的包含「X」的圖像,CNN並不能準確地知道這些features到底要匹配原圖的哪些部分,因此它會在原圖中每個可能的位置進行嘗試,即便用該卷積核在圖像上進行滑動,每滑動一次就進行一次卷積操做,獲得一個特徵值。仔細想一想,是否有一點頭目呢?
(下圖中求平均是爲了讓全部特徵值迴歸到-1到1之間)orm
最後將整張圖卷積事後,獲得這樣的特徵矩陣:
使用所有卷積核卷積事後,獲得的結果是這樣的:
仔細觀察,能夠發現,其中的值,越接近爲1表示對應位置和卷積核表明的特徵越接近,越是接近-1,表示對應位置和卷積核表明的反向特徵越匹配,而值接近0的表示對應位置沒有任何匹配或者說沒有什麼關聯。
那麼最後獲得的特徵矩陣就叫作feature map特徵映射,經過特定的卷積核獲得其對應的feature map。在CNN中,咱們稱之爲卷積層(convolution layer),卷積核在圖像上不斷滑動運算,就是卷積層所要作的事情。同時,在內積結果上取每一局部塊的最大值就是最大池化層的操做。CNN 用卷積層和池化層實現了圖片特徵提取方法。
經過上面的學習,咱們知道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
本文主要講解基本CNN的原理過程,卷積層和池化層能夠提取圖像特徵,通過反向傳播最終肯定卷積核參數,獲得最終的特徵,這就是一個大體的CNN提取特徵的過程。考慮到反向傳播計算的複雜性,在本文中不作重點講解,先做爲了解思路,往後專門再講解反向傳播的方法原理。
咱們的學習過程也像神經網絡同樣,不斷地進行自學習和糾錯,提高自身實力。學無止境,但願本文可讓你有那麼一點點的收穫。