網上關於卷積神經網絡的相關知識以及數不勝數,因此本文在學習了前人的博客和知乎,在別人博客的基礎上整理的知識點,便於本身理解,之後複習也能夠常看看,可是若是侵犯到哪位大神的權利,請聯繫小編,謝謝。好了下面言歸正傳:php
在深度學習領域中,已經通過驗證的成熟算法,目前主要有深度卷積網絡(DNN)和遞歸網絡(RNN),在圖像識別,視頻識別,語音識別領域取得了巨大的成功,正是因爲這些成功,能促成了當前深度學習的大熱。與此相對應的,在深度學習研究領域,最熱門的是AutoEncoder、RBM、DBN等產生式網絡架構,可是這些研究領域,雖然論文比較多,可是重量級應用尚未出現,是否能取得成功還具備不肯定性。可是有一些比較初步的跡象代表,這些研究領域仍是很是值得期待的。好比AutoEncoder在圖像、視頻搜索領域的應用,RBM對非結構化數據的處理方面,DBN網絡在結合人工智能領域兩大流派鏈接主義和符號主義,都具備巨大的前景,有理由期待產生重量級成果。咱們在後續會對這些網絡逐一進行介紹和實現,除了給出重構後的Theano實現代碼外,還會逐步補充這些算法在實際應用的中的實例,咱們會主要將這些算法應用在創業公司數據中,從幾萬家創業公司及投融資數據中,但願能挖掘出哪些公司更可能得到投資,特定公司更有可能得到哪家投資機構的投資。css
卷積神經網絡(CNN),這是深度學習算法應用最成功的領域之一,卷積神經網絡包括一維卷積神經網絡,二維卷積神經網絡以及三維卷積神經網絡。一維卷積神經網絡主要用於序列類的數據處理,二維卷積神經網絡常應用於圖像類文本的識別,三維卷積神經網絡主要應用於醫學圖像以及視頻類數據識別。html
下面個人學習分爲四部分,首先利用一個形象的例子說明電腦是如何識別圖像的,而後在說明什麼是神經網絡,什麼是卷積神經網絡,最後介紹常見的幾種卷積神經網絡。大致的結構就是這樣的。vue
人類大腦是一很是強大的機器,每秒內能看(捕捉)多張圖,並在乎識不到的狀況下就完成了對這些圖的處理。但機器並不是如此。機器處理圖像的第一步是理解,理解如何表達一張圖像,進而讀取圖片。ios
簡單來講,每一個圖像都是一系列特定排序的圖點(像素)。若是你改變像素的順序或顏色,圖像也隨之改變。舉個例子,存儲並讀取一張上面寫着數字 4 的圖像。c++
基本上,機器會把圖像打碎成像素矩陣,存儲每一個表示位置像素的顏色碼。在下圖的表示中,數值 1 是白色,256 是最深的綠色(爲了簡化,咱們示例限制到了一種顏色)。git
一旦你以這種格式存儲完圖片信息,下一步就是讓神經網絡理解這種排序與模式。(表徵像素的數值是以特定的方式排序的)es6
那麼如何幫助神經網絡識別圖像?web
假設咱們嘗試使用全鏈接網絡識別圖像,應該如何作?算法
全鏈接網絡能夠經過平化它,把圖像看成一個數組,並把像素值看成預測圖像中數值的特徵。明確地說,讓網絡理解理解下面圖中發生了什麼,很是的艱難。
即便人類也很難理解上圖中表達的含義是數字 4。咱們徹底丟失了像素的空間排列。
咱們能作什麼呢?能夠嘗試從原圖中提取特徵,從而保留空間排序。
這裏咱們使用一個權重乘以初始像素值
如今裸眼識別出這是「4」就變得更簡單了。但把它交給全鏈接網絡以前,還須要平整化(flatten) 它,要讓咱們可以保留圖像的空間排列。
如今咱們能夠看到,把圖像平整化徹底破壞了它的排列。咱們須要想出一種方式在沒有平整化的狀況下把圖片饋送給網絡,而且還要保留空間排列特徵,也就是須要饋送像素值的 2D/3D 排列。
咱們能夠嘗試一次採用圖像的兩個像素值,而非一個。這能給網絡很好的洞見,觀察鄰近像素的特徵。既然一次採用兩個像素,那也就須要一次採用兩個權重值了。
但願你能注意到圖像從以前的 4 列數值變成了 3 列。由於咱們如今一次移用兩個像素(在每次移動中像素被共享),圖像變的更小了。雖然圖像變小了,咱們仍能在很大程度上理解這是「4」。並且,要意識到的一個重點是,咱們採用的是兩個連貫的水平像素,所以只會考慮水平的排列。
這是咱們從圖像中提取特徵的一種方式。咱們能夠看到左邊和中間部分,但右邊部分看起來不那麼清楚。主要是由於兩個問題:
1. 圖片角落左邊和右邊是權重相乘一次獲得的。
2. 左邊仍舊保留,由於權重值高;右邊由於略低的權重,有些丟失。
如今咱們有兩個問題,須要兩個解決方案。
遇到這樣的問題是圖像左右兩角只被權重經過一次,咱們須要作的是讓網絡像考慮其餘像素同樣考慮角落。咱們有一個簡單的方法解決這一問題:把零放在權重運動的兩邊。
你能夠看到經過添加零,來自角落的信息被再訓練。圖像也變得更大。這可被用於咱們不想要縮小圖像的狀況下。
這裏咱們試圖解決的問題是右側角落更小的權重值正在下降像素值,所以使其難以被咱們識別。咱們所能作的是採起多個權重值並將其結合起來。
(1,0.3) 的權重值給了咱們一個輸出表格
同時表格 (0.1,5) 的權重值也將給咱們一個輸出表格。
兩張圖像的結合版本將會給咱們一個清晰的圖片。所以,咱們所作的是簡單地使用多個權重而不是一個,從而再訓練圖像的更多信息。最終結果將是上述兩張圖像的一個結合版本。
咱們到如今經過使用權重,試圖把水平像素(horizontal pixel)結合起來。可是大多數狀況下咱們須要在水平和垂直方向上保持空間佈局。咱們採起 2D 矩陣權重,把像素在水平和垂直方向上結合起來。一樣,記住已經有了水平和垂直方向的權重運動,輸出會在水平和垂直方向上低一個像素。
上面咱們所作的事是試圖經過使用圖像的空間的安排從圖像中提取特徵。爲了理解圖像,理解像素如何安排對於一個網絡極其重要。上面咱們所作的也偏偏是一個卷積網絡所作的。咱們能夠採用輸入圖像,定義權重矩陣,而且輸入被卷積以從圖像中提取特殊特徵而無需損失其有關空間安排的信息。
這個方法的另外一個重大好處是它能夠減小圖像的參數數量。正如所見,卷積圖像相比於原始圖像有更少的像素。
這裏的神經網絡,也指人工神經網絡(Artificial Neural Networks,簡稱ANNs),是一種模仿生物神經網絡行爲特徵的算法數學模型,由神經元、節點與節點之間的鏈接(突觸)所構成,以下圖:
每一個神經網絡單元抽象出來的數學模型以下,也叫感知器,它接收多個輸入(x1,x2,x3...),產生一個輸出,這就比如是神經末梢感覺各類外部環境的變化(外部刺激),而後產生電信號,以便於轉導到神經細胞(又叫神經元)。
單個的感知器就構成了一個簡單的模型,但在現實世界中,實際的決策模型則要複雜得多,每每是由多個感知器組成的多層網絡,以下圖所示,這也是經典的神經網絡模型,由輸入層、隱含層、輸出層構成。
人工神經網絡能夠映射任意複雜的非線性關係,具備很強的魯棒性、記憶能力、自學習等能力,在分類、預測、模式識別等方面有着普遍的應用。
卷積神經網絡是近年發展起來的,並引發普遍重視的一種高效識別方法,20世紀60年代,Hubel和Wiesel在研究貓腦皮層中用於局部敏感和方向選擇的神經元時發現其獨特的網絡結構能夠有效地下降反饋神經網絡的複雜性,繼而提出了卷積神經網絡(Convolutional Neural Networks-簡稱CNN)。如今,CNN已經成爲衆多科學領域的研究熱點之一,特別是在模式分類領域,因爲該網絡避免了對圖像的複雜前期預處理,能夠直接輸入原始圖像,於是獲得了更爲普遍的應用。 K.Fukushima在1980年提出的新識別機是卷積神經網絡的第一個實現網絡。隨後,更多的科研工做者對該網絡進行了改進。其中,具備表明性的研究成果是Alexander和Taylor提出的「改進認知機」,該方法綜合了各類改進方法的優勢並避免了耗時的偏差反向傳播。
這聽起來像是一個奇怪的生物學和數學的結合,可是這些網絡已經成爲計算機視覺領域最具影響力的創新之一。2012年是神經網絡成長的第一年,Alex Krizhevsky用它們贏得了當年的ImageNet競賽(基本上是計算機視覺年度奧運會),把分類錯誤記錄從26%降到了15%,這個驚人的提升從那之後,許多公司一直在以服務爲核心進行深度學習。Facebook使用自動標記算法的神經網絡,谷歌的照片搜索,亞馬遜的產品推薦,Pinterest的家庭飼料個性化和Instagram的搜索基礎設施。
通常的,CNN的基本結構包括兩層,其一爲特徵提取層,每一個神經元的輸入與前一層的局部接受域相連,並提取該局部的特徵。一旦該局部特徵被提取後,它與其它特徵間的位置關係也隨之肯定下來;其二是特徵映射層,網絡的每一個計算層由多個特徵映射組成,每一個特徵映射是一個平面,平面上全部神經元的權值相等。特徵映射結構採用影響函數核小的sigmoid函數做爲卷積網絡的激活函數,使得特徵映射具備位移不變性。此外,因爲一個映射面上的神經元共享權值,於是減小了網絡自由參數的個數。卷積神經網絡中的每個卷積層都緊跟着一個用來求局部平均與二次提取的計算層,這種特有的兩次特徵提取結構減少了特徵分辨率。
CNN主要用來識別位移、縮放及其餘形式扭曲不變性的二維圖形,該部分功能主要由池化層實現。因爲CNN的特徵檢測層經過訓練數據進行學習,因此在使用CNN時,避免了顯式的特徵抽取,而隱式地從訓練數據中進行學習;再者因爲同一特徵映射面上的神經元權值相同,因此網絡能夠並行學習,這也是卷積網絡相對於神經元彼此相連網絡的一大優點。卷積神經網絡以其局部權值共享的特殊結構在語音識別和圖像處理方面有着獨特的優越性,其佈局更接近於實際的生物神經網絡,權值共享下降了網絡的複雜性,特別是多維輸入向量的圖像能夠直接輸入網絡這一特色避免了特徵提取和分類過程當中數據重建的複雜度。
說了這麼多,接下來將以圖像識別爲例子,來介紹卷積神經網絡的原理。
假設給定一張圖(多是字母X或者字母O),經過CNN便可識別出是X仍是O,以下圖所示,那怎麼作到的呢
若是採用經典的神經網絡模型,則須要讀取整幅圖像做爲神經網絡模型的輸入(即全鏈接的方式),當圖像的尺寸越大時,其鏈接的參數將變得不少,從而致使計算量很是大。
而咱們人類對外界的認知通常是從局部到全局,先對局部有感知的認識,再逐步對全體有認知,這是人類的認識模式。在圖像中的空間聯繫也是相似,局部範圍內的像素之間聯繫較爲緊密,而距離較遠的像素則相關性較弱。於是,每一個神經元其實沒有必要對全局圖像進行感知,只須要對局部進行感知,而後在更高層將局部的信息綜合起來就獲得了全局的信息。這種模式就是卷積神經網絡中下降參數數目的重要神器:局部感覺野。
若是字母X、字母O是固定不變的,那麼最簡單的方式就是圖像之間的像素一一比對就行,但在現實生活中,字體都有着各個形態上的變化(例如手寫文字識別),例如平移、縮放、旋轉、微變形等等,以下圖所示:
咱們的目標是對於各類形態變化的X和O,都能經過CNN準確地識別出來,這就涉及到應該如何有效地提取特徵,做爲識別的關鍵因子。
回想前面講到的「局部感覺野」模式,對於CNN來講,它是一小塊一小塊地來進行比對,在兩幅圖像中大體相同的位置找到一些粗糙的特徵(小塊圖像)進行匹配,相比起傳統的整幅圖逐一比對的方式,CNN的這種小塊匹配方式可以更好的比較兩幅圖像之間的類似性。以下圖:
以字母X爲例,能夠提取出三個重要特徵(兩個交叉線、一個對角線),以下圖所示:
假如以像素值"1"表明白色,像素值"-1"表明黑色,則字母X的三個重要特徵以下:
那麼這些特徵又是怎麼進行匹配計算呢?
這時就要請出今天的重要嘉賓:卷積。那什麼是卷積呢,不急,下面慢慢道來。
當給定一張新圖時,CNN並不能準確地知道這些特徵到底要匹配原圖的哪些部分,因此它會在原圖中把每個可能的位置都進行嘗試,至關於把這個feature(特徵)變成了一個過濾器。這個用來匹配的過程就被稱爲卷積操做,這也是卷積神經網絡名字的由來。
卷積的操做以下圖所示:
是否是很像把毛巾沿着對角捲起來,下圖形象地說明了爲何叫「卷」積
在本案例中,要計算一個feature(特徵)和其在原圖上對應的某一小塊的結果,只需將兩個小塊內對應位置的像素值進行乘法運算,而後將整個小塊內乘法運算的結果累加起來,最後再除以小塊內像素點總個數便可(注:也可不除以總個數的)。
若是兩個像素點都是白色(值均爲1),那麼1*1 = 1,若是均爲黑色,那麼(-1)*(-1) = 1,也就是說,每一對可以匹配上的像素,其相乘結果爲1。相似地,任何不匹配的像素相乘結果爲-1。具體過程以下(第一個、第二個……、最後一個像素的匹配結果):
根據卷積的計算方式,第一塊特徵匹配後的卷積計算以下,結果爲1
對於其它位置的匹配,也是相似(例如中間部分的匹配)
計算以後的卷積以下
以此類推,對三個特徵圖像不斷地重複着上述過程,經過每個feature(特徵)的卷積操做,會獲得一個新的二維數組,稱之爲feature map。其中的值,越接近1表示對應位置和feature的匹配越完整,越是接近-1,表示對應位置和feature的反面匹配越完整,而值接近0的表示對應位置沒有任何匹配或者說沒有什麼關聯。以下圖所示:
能夠看出,當圖像尺寸增大時,其內部的加法、乘法和除法操做的次數會增長得很快,每個filter的大小和filter的數目呈線性增加。因爲有這麼多因素的影響,很容易使得計算量變得至關龐大。
爲了有效地減小計算量,CNN使用的另外一個有效的工具被稱爲「池化(Pooling)」。池化就是將輸入圖像進行縮小,減小像素信息,只保留重要信息。
池化的操做也很簡單,一般狀況下,池化區域是2*2大小,而後按必定規則轉換成相應的值,例如取這個池化區域內的最大值(max-pooling)、平均值(mean-pooling)等,以這個值做爲結果的像素值。
下圖顯示了左上角2*2池化區域的max-pooling結果,取該區域的最大值max(0.77,-0.11,-0.11,1.00),做爲池化後的結果,以下圖:
池化區域往左,第二小塊取大值max(0.11,0.33,-0.11,0.33),做爲池化後的結果,以下圖:
其它區域也是相似,取區域內的最大值做爲池化後的結果,最後通過池化後,結果以下:
對全部的feature map執行一樣的操做,結果以下:
最大池化(max-pooling)保留了每一小塊內的最大值,也就是至關於保留了這一塊最佳的匹配結果(由於值越接近1表示匹配越好)。也就是說,它不會具體關注窗口內究竟是哪個地方匹配了,而只關注是否是有某個地方匹配上了。
經過加入池化層,圖像縮小了,能很大程度上減小計算量,下降機器負載。
經常使用的激活函數有sigmoid、tanh、relu等等,前二者sigmoid/tanh比較常見於全鏈接層,後者ReLU常見於卷積層。
回顧一下前面講的感知機,感知機在接收到各個輸入,而後進行求和,再通過激活函數後輸出。激活函數的做用是用來加入非線性因素,把卷積層輸出結果作非線性映射。
在卷積神經網絡中,激活函數通常使用ReLU(The Rectified Linear Unit,修正線性單元),它的特色是收斂快,求梯度簡單。計算公式也很簡單,max(0,T),即對於輸入的負值,輸出全爲0,對於正值,則原樣輸出。
下面看一下本案例的ReLU激活函數操做過程:
第一個值,取max(0,0.77),結果爲0.77,以下圖
第二個值,取max(0,-0.11),結果爲0,以下圖
以此類推,通過ReLU激活函數後,結果以下:
對全部的feature map執行ReLU激活函數操做,結果以下:
經過將上面所提到的卷積、激活函數、池化組合在一塊兒,就變成下圖:
經過加大網絡的深度,增長更多的層,就獲得了深度神經網絡,以下圖:
全鏈接層在整個卷積神經網絡中起到「分類器」的做用,即經過卷積、激活函數、池化等深度網絡後,再通過全鏈接層對結果進行識別分類。
首先將通過卷積、激活函數、池化的深度網絡後的結果串起來,以下圖所示:
因爲神經網絡是屬於監督學習,在模型訓練時,根據訓練樣本對模型進行訓練,從而獲得全鏈接層的權重(如預測字母X的全部鏈接的權重)
在利用該模型進行結果識別時,根據剛纔提到的模型訓練得出來的權重,以及通過前面的卷積、激活函數、池化等深度網絡計算出來的結果,進行加權求和,獲得各個結果的預測值,而後取值最大的做爲識別的結果(以下圖,最後計算出來字母X的識別值爲0.92,字母O的識別值爲0.51,則結果斷定爲X)
上述這個過程定義的操做爲」全鏈接層「(Fully connected layers),全鏈接層也能夠有多個,以下圖:
將以上全部結果串起來後,就造成了一個「卷積神經網絡」(CNN)結構,以下圖所示:
最後,再回顧總結一下,卷積神經網絡主要由兩部分組成,一部分是特徵提取(卷積、激活函數、池化),另外一部分是分類識別(全鏈接層),下圖即是著名的手寫文字識別卷積神經網絡結構圖:
卷積網絡在本質上是一種輸入到輸出的映射,它可以學習大量的輸入與輸出之間的映射關係,而不須要任何輸入和輸出之間的精確的數學表達式,只要用已知的模式對卷積網絡加以訓練,網絡就具備輸入輸出對之間的映射能力。
CNN一個很是重要的特色就是頭重腳輕(越往輸入權值越小,越往輸出權值越多),呈現出一個倒三角的形態,這就很好地避免了BP神經網絡中反向傳播的時候梯度損失得太快。
卷積神經網絡CNN主要用來識別位移、縮放及其餘形式扭曲不變性的二維圖形。因爲CNN的特徵檢測層經過訓練數據進行學習,因此在使用CNN時,避免了顯式的特徵抽取,而隱式地從訓練數據中進行學習;再者因爲同一特徵映射面上的神經元權值相同,因此網絡能夠並行學習,這也是卷積網絡相對於神經元彼此相連網絡的一大優點。卷積神經網絡以其局部權值共享的特殊結構在語音識別和圖像處理方面有着獨特的優越性,其佈局更接近於實際的生物神經網絡,權值共享下降了網絡的複雜性,特別是多維輸入向量的圖像能夠直接輸入網絡這一特色避免了特徵提取和分類過程當中數據重建的複雜度。
目前圖像分類中的ResNet, 目標檢測領域佔統治地位的Faster R-CNN,分割中最牛的Mask-RCNN, UNet和經典的FCN都是如下面幾種常見網絡爲基礎。
LeNet誕生於1994年,由深度學習三巨頭之一的Yan LeCun提出,他也被稱爲卷積神經網絡之父。LeNet主要用來進行手寫字符的識別與分類,準確率達到了98%,並在美國的銀行中投入了使用,被用於讀取北美約10%的支票。LeNet奠基了現代卷積神經網絡的基礎。
上圖爲LeNet結構圖,是一個6層網絡結構:三個卷積層,兩個下采樣層和一個全鏈接層(圖中C表明卷積層,S表明下采樣層,F表明全鏈接層)。其中,C5層也能夠當作是一個全鏈接層,由於C5層的卷積核大小和輸入圖像的大小一致,都是5*5(可參考LeNet詳細介紹)。