深入學習卷積神經網路(CNN)的原理知識
網上關於卷積神經網路的相關知識以及數不勝數,所以本文在學習了前人的部落格和知乎,在別人部落格的基礎上整理的知識點,便於自己理解,以後複習也可以常看看,但是如果侵犯到哪位大神的權利,請聯絡小編,謝謝。好了下面言歸正傳:
在深度學習領域中,已經經過驗證的成熟演算法,目前主要有深度卷積網路(DNN)和遞迴網路(RNN),在影象識別,視訊識別,語音識別領域取得了巨大的成功,正是由於這些成功,能促成了當前深度學習的大熱。與此相對應的,在深度學習研究領域,最熱門的是AutoEncoder、RBM、DBN等產生式網路架構,但是這些研究領域,雖然論文比較多,但是重量級應用還沒有出現,是否能取得成功還具有不確定性。但是有一些比較初步的跡象表明,這些研究領域還是非常值得期待的。比如AutoEncoder在影象、視訊搜尋領域的應用,RBM對非結構化資料的處理方面,DBN網路在結合人工智慧領域兩大流派連線主義和符號主義,都具有巨大的前景,有理由期待產生重量級成果。我們在後續會對這些網路逐一進行介紹和實現,除了給出重構後的Theano實現程式碼外,還會逐步補充這些演算法在實際應用的中的例項,我們會主要將這些演算法應用在創業公司資料中,從幾萬家創業公司及投融資資料中,希望能挖掘出哪些公司更可能獲得投資,特定公司更有可能獲得哪家投資機構的投資。
卷積神經網路(CNN),這是深度學習演算法應用最成功的領域之一,卷積神經網路包括一維卷積神經網路,二維卷積神經網路以及三維卷積神經網路。一維卷積神經網路主要用於序列類的資料處理,二維卷積神經網路常應用於影象類文字的識別,三維卷積神經網路主要應用於醫學影象以及視訊類資料識別。
下面我的學習分為四部分,首先利用一個形象的例子說明電腦是如何識別影象的,然後在說明什麼是神經網路,什麼是卷積神經網路,最後介紹常見的幾種卷積神經網路。大體的結構就是這樣的。
一:如何幫助神經網路識別影象?
人類大腦是一非常強大的機器,每秒內能看(捕捉)多張圖,並在意識不到的情況下就完成了對這些圖的處理。但機器並非如此。機器處理影象的第一步是理解,理解如何表達一張影象,進而讀取圖片。
簡單來說,每個影象都是一系列特定排序的圖點(畫素)。如果你改變畫素的順序或顏色,影象也隨之改變。舉個例子,儲存並讀取一張上面寫著數字 4 的影象。
基本上,機器會把影象打碎成畫素矩陣,儲存每個表示位置畫素的顏色碼。在下圖的表示中,數值 1 是白色,256 是最深的綠色(為了簡化,我們示例限制到了一種顏色)。
一旦你以這種格式儲存完圖片資訊,下一步就是讓神經網路理解這種排序與模式。(表徵畫素的數值是以特定的方式排序的)
那麼如何幫助神經網路識別影象?
假設我們嘗試使用全連線網路識別影象,應該如何做?
全連線網路可以通過平化它,把影象當作一個數組,並把畫素值當作預測影象中數值的特徵。明確地說,讓網路理解理解下面圖中發生了什麼,非常的艱難。
即使人類也很難理解上圖中表達的含義是數字 4。我們完全丟失了畫素的空間排列。
我們能做什麼呢?可以嘗試從原圖中提取特徵,從而保留空間排序。
案例一
這裡我們使用一個權重乘以初始畫素值
現在裸眼識別出這是「4」就變得更簡單了。但把它交給全連線網路之前,還需要平整化(flatten) 它,要讓我們能夠保留影象的空間排列。
案例二
現在我們可以看到,把影象平整化完全破壞了它的排列。我們需要想出一種方式在沒有平整化的情況下把圖片饋送給網路,並且還要保留空間排列特徵,也就是需要饋送畫素值的 2D/3D 排列。
我們可以嘗試一次採用影象的兩個畫素值,而非一個。這能給網路很好的洞見,觀察鄰近畫素的特徵。既然一次採用兩個畫素,那也就需要一次採用兩個權重值了。
希望你能注意到影象從之前的 4 列數值變成了 3 列。因為我們現在一次移用兩個畫素(在每次移動中畫素被共享),影象變的更小了。雖然影象變小了,我們仍能在很大程度上理解這是「4」。而且,要意識到的一個重點是,我們採用的是兩個連貫的水平畫素,因此只會考慮水平的排列。
這是我們從影象中提取特徵的一種方式。我們可以看到左邊和中間部分,但右邊部分看起來不那麼清楚。主要是因為兩個問題:
1. 圖片角落左邊和右邊是權重相乘一次得到的。
2. 左邊仍舊保留,因為權重值高;右邊因為略低的權重,有些丟失。
現在我們有兩個問題,需要兩個解決方案。
案例三
遇到這樣的問題是影象左右兩角只被權重通過一次,我們需要做的是讓網路像考慮其他畫素一樣考慮角落。我們有一個簡單的方法解決這一問題:把零放在權重運動的兩邊。
你可以看到通過新增零,來自角落的資訊被再訓練。影象也變得更大。這可被用於我們不想要縮小影象的情況下。
案例四
這裡我們試圖解決的問題是右側角落更小的權重值正在降低畫素值,因此使其難以被我們識別。我們所能做的是採取多個權重值並將其結合起來。
(1,0.3) 的權重值給了我們一個輸出表格
同時表格 (0.1,5) 的權重值也將給我們一個輸出表格。
兩張影象的結合版本將會給我們一個清晰的圖片。因此,我們所做的是簡單地使用多個權重而不是一個,從而再訓練影象的更多資訊。最終結果將是上述兩張影象的一個結合版本。
案例五
我們到現在通過使用權重,試圖把水平畫素(horizontal pixel)結合起來。但是大多數情況下我們需要在水平和垂直方向上保持空間佈局。我們採取 2D 矩陣權重,把畫素在水平和垂直方向上結合起來。同樣,記住已經有了水平和垂直方向的權重運動,輸出會在水平和垂直方向上低一個畫素。
所以我們做了什麼?
上面我們所做的事是試圖通過使用影象的空間的安排從影象中提取特徵。為了理解影象,理解畫素如何安排對於一個網路極其重要。上面我們所做的也恰恰是一個卷積網路所做的。我們可以採用輸入影象,定義權重矩陣,並且輸入被卷積以從影象中提取特殊特徵而無需損失其有關空間安排的資訊。
這個方法的另一個重大好處是它可以減少影象的引數數量。正如所見,卷積影象相比於原始影象有更少的畫素。
2 :什麼是神經網路?
這裡的神經網路,也指人工神經網路(Artificial Neural Networks,簡稱ANNs),是一種模仿生物神經網路行為特徵的演算法數學模型,由神經元、節點與節點之間的連線(突觸)所構成,如下圖:
每個神經網路單元抽象出來的數學模型如下,也叫感知器,它接收多個輸入(x1,x2,x3...),產生一個輸出,這就好比是神經末梢感受各種外部環境的變化(外部刺激),然後產生電訊號,以便於轉導到神經細胞(又叫神經元)。
單個的感知器就構成了一個簡單的模型,但在現實世界中,實際的決策模型則要複雜得多,往往是由多個感知器組成的多層網路,如下圖所示,這也是經典的神經網路模型,由輸入層、隱含層、輸出層構成。
人工神經網路可以對映任意複雜的非線性關係,具有很強的魯棒性、記憶能力、自學習等能力,在分類、預測、模式識別等方面有著廣泛的應用。
3 :什麼是卷積神經網路?
卷積神經網路是近年發展起來的,並引起廣泛重視的一種高效識別方法,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時,避免了顯式的特徵抽取,而隱式地從訓練資料中進行學習;再者由於同一特徵對映面上的神經元權值相同,所以網路可以並行學習,這也是卷積網路相對於神經元彼此相連網路的一大優勢。卷積神經網路以其區域性權值共享的特殊結構在語音識別和影象處理方面有著獨特的優越性,其佈局更接近於實際的生物神經網路,權值共享降低了網路的複雜性,特別是多維輸入向量的影象可以直接輸入網路這一特點避免了特徵提取和分類過程中資料重建的複雜度。
說了這麼多,接下來將以影象識別為例子,來介紹卷積神經網路的原理。
3.1 案例
假設給定一張圖(可能是字母X或者字母O),通過CNN即可識別出是X還是O,如下圖所示,那怎麼做到的呢
3.2 影象輸入
如果採用經典的神經網路模型,則需要讀取整幅影象作為神經網路模型的輸入(即全連線的方式),當影象的尺寸越大時,其連線的引數將變得很多,從而導致計算量非常大。
而我們人類對外界的認知一般是從區域性到全域性,先對區域性有感知的認識,再逐步對全體有認知,這是人類的認識模式。在影象中的空間聯絡也是類似,區域性範圍內的畫素之間聯絡較為緊密,而距離較遠的畫素則相關性較弱。因而,每個神經元其實沒有必要對全域性影象進行感知,只需要對區域性進行感知,然後在更高層將區域性的資訊綜合起來就得到了全域性的資訊。這種模式就是卷積神經網路中降低引數數目的重要神器:區域性感受野。
3.3 提取特徵
如果字母X、字母O是固定不變的,那麼最簡單的方式就是影象之間的畫素一一比對就行,但在現實生活中,字型都有著各個形態上的變化(例如手寫文字識別),例如平移、縮放、旋轉、微變形等等,如下圖所示:
我們的目標是對於各種形態變化的X和O,都能通過CNN準確地識別出來,這就涉及到應該如何有效地提取特徵,作為識別的關鍵因子。
回想前面講到的“區域性感受野”模式,對於CNN來說,它是一小塊一小塊地來進行比對,在兩幅影象中大致相同的位置找到一些粗糙的特徵(小塊影象)進行匹配,相比起傳統的整幅圖逐一比對的方式,CNN的這種小塊匹配方式能夠更好的比較兩幅影象之間的相似性。如下圖:
以字母X為例,可以提取出三個重要特徵(兩個交叉線、一個對角線),如下圖所示:
假如以畫素值"1"代表白色,畫素值"-1"代表黑色,則字母X的三個重要特徵如下:
那麼這些特徵又是怎麼進行匹配計算呢?
3.4 卷積(convolution)
這時就要請出今天的重要嘉賓:卷積。那什麼是卷積呢,不急,下面慢慢道來。
當給定一張新圖時,CNN並不能準確地知道這些特徵到底要匹配原圖的哪些部分,所以它會在原圖中把每一個可能的位置都進行嘗試,相當於把這個feature(特徵)變成了一個過濾器。這個用來匹配的過程就被稱為卷積操作,這也是卷積神經網路名字的由來。
卷積的操作如下圖所示:
是不是很像把毛巾沿著對角捲起來,下圖形象地說明了為什麼叫「卷」積
在本案例中,要計算一個feature(特徵)和其在原圖上對應的某一小塊的結果,只需將兩個小塊內對應位置的畫素值進行乘法運算,然後將整個小塊內乘法運算的結果累加起來,最後再除以小塊內畫素點總個數即可(注:也可不除以總個數的)。
如果兩個畫素點都是白色(值均為1),那麼1*1 = 1,如果均為黑色,那麼(-1)*(-1) = 1,也就是說,每一對能夠匹配上的畫素,其相乘結果為1。類似地,任何不匹配的畫素相乘結果為-1。具體過程如下(第一個、第二個……、最後一個畫素的匹配結果):
根據卷積的計算方式,第一塊特徵匹配後的卷積計算如下,結果為1

對於其它位置的匹配,也是類似(例如中間部分的匹配)
計算之後的卷積如下

以此類推,對三個特徵影象不斷地重複著上述過程,通過每一個feature(特徵)的卷積操作,會得到一個新的二維陣列,稱之為feature map。其中的值,越接近1表示對應位置和feature的匹配越完整,越是接近-1,表示對應位置和feature的反面匹配越完整,而值接近0的表示對應位置沒有任何匹配或者說沒有什麼關聯。如下圖所示:

可以看出,當影象尺寸增大時,其內部的加法、乘法和除法操作的次數會增加得很快,每一個filter的大小和filter的數目呈線性增長。由於有這麼多因素的影響,很容易使得計算量變得相當龐大。
3.5 池化(Pooling)
為了有效地減少計算量,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表示匹配越好)。也就是說,它不會具體關注視窗內到底是哪一個地方匹配了,而只關注是不是有某個地方匹配上了。
通過加入池化層,影象縮小了,能很大程度上減少計算量,降低機器負載。
3.6 啟用函式RelU (Rectified Linear Units)
常用的啟用函式有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啟用函式操作,結果如下:
3.7 深度神經網路
通過將上面所提到的卷積、啟用函式、池化組合在一起,就變成下圖:

通過加大網路的深度,增加更多的層,就得到了深度神經網路,如下圖:

3.8全連線層(Fully connected layers)
全連線層在整個卷積神經網路中起到“分類器”的作用,即通過卷積、啟用函式、池化等深度網路後,再經過全連線層對結果進行識別分類。
首先將經過卷積、啟用函式、池化的深度網路後的結果串起來,如下圖所示: 由於神經網路是屬於監督學習,在模型訓練時,根據訓練樣本對模型進行訓練,從而得到全連線層的權重(如預測字母X的所有連線的權重)
在利用該模型進行結果識別時,根據剛才提到的模型訓練得出來的權重,以及經過前面的卷積、啟用函式、池化等深度網路計算出來的結果,進行加權求和,得到各個結果的預測值,然後取值最大的作為識別的結果(如下圖,最後計算出來字母X的識別值為0.92,字母O的識別值為0.51,則結果判定為X)
上述這個過程定義的操作為”全連線層“(Fully connected layers),全連線層也可以有多個,如下圖:
3.9卷積神經網路(Convolutional Neural Networks)
將以上所有結果串起來後,就形成了一個“卷積神經網路”(CNN)結構,如下圖所示:
最後,再回顧總結一下,卷積神經網路主要由兩部分組成,一部分是特徵提取(卷積、啟用函式、池化),另一部分是分類識別(全連線層),下圖便是著名的手寫文字識別卷積神經網路結構圖:

四:常見的幾種卷積神經網路介紹
目前影象分類中的ResNet, 目標檢測領域佔統治地位的Faster R-CNN,分割中最牛的Mask-RCNN, UNet和經典的FCN都是以下面幾種常見網路為基礎。
一:LeNet
1.1 網路背景
LeNet誕生於1994年,由深度學習三巨頭之一的Yan LeCun提出,他也被稱為卷積神經網路之父。LeNet主要用來進行手寫字元的識別與分類,準確率達到了98%,並在美國的銀行中投入了使用,被用於讀取北美約10%的支票。LeNet奠定了現代卷積神經網路的基礎。
1.2 網路結構
上圖為LeNet結構圖,是一個6層網路結構:三個卷積層,兩個下采樣層和一個全連線層(圖中C代表卷積層,S代表下采樣層,F代表全連線層)。其中,C5層也可以看成是一個全連線層,因為C5層的卷積核大小和輸入影象的大小一致,都是5*5(可參考 ofollow,noindex" target="_blank">LeNet詳細介紹 )。
1.3 網路特點
- 每個卷積層包括三部分:卷積、池化和非線性啟用函式(sigmoid啟用函式)
- 使用卷積提取空間特徵
- 降取樣層採用平均池化
二:AlexNet
2.1 網路背景
AlexNet由Hinton的學生Alex Krizhevsky於2012年提出,並在當年取得了Imagenet比賽冠軍。AlexNet可以算是LeNet的一種更深更寬的版本,證明了卷積神經網路在複雜模型下的有效性,算是神經網路在低谷期的第一次發聲,確立了深度學習,或者說卷積神經網路在計算機視覺中的統治地位。
2.2 網路結構
AlexNet的結構及引數如上圖所示,是8層網路結構(忽略啟用,池化,LRN,和dropout層),有5個卷積層和3個全連線層,第一卷積層使用大的卷積核,大小為11*11,步長為4,第二卷積層使用5*5的卷積核大小,步長為1,剩餘卷積層都是3*3的大小,步長為1。啟用函式使用ReLu(雖然不是他發明,但是他將其發揚光大),池化層使用重疊的最大池化,大小為3*3,步長為2。在全連線層增加了dropout,第一次將其實用化。(參考: AlexNet詳細解釋 )
2.3 網路特點
- 使用兩塊GPU並行加速訓練,大大降低了訓練時間
- 成功使用ReLu作為啟用函式,解決了網路較深時的梯度彌散問題
- 使用資料增強、dropout和LRN層來防止網路過擬合,增強模型的泛化能力
三:VGGNet
3.1 網路背景
VGGNet是牛津大學計算機視覺組和Google DeepMind公司一起研發的深度卷積神經網路,並取得了2014年Imagenet比賽定位專案第一名和分類專案第二名。該網路主要是泛化效能很好,容易遷移到其他的影象識別專案上,可以下載VGGNet訓練好的引數進行很好的初始化權重操作,很多卷積神經網路都是以該網路為基礎,比如FCN,UNet,SegNet等。vgg版本很多,常用的是VGG16,VGG19網路。
3.2 網路結構
上圖為VGG16的網路結構,共16層(不包括池化和softmax層),所有的卷積核都使用3*3的大小,池化都使用大小為2*2,步長為2的最大池化,卷積層深度依次為64 -> 128 -> 256 -> 512 ->512。
3.3 網路特點
網路結構和AlexNet有點兒像,不同的地方在於:
- 主要的區別,一個字:深,兩個字:更深。把網路層數加到了16-19層(不包括池化和softmax層),而AlexNet是8層結構。
- 將卷積層提升到卷積塊的概念。卷積塊有2~3個卷積層構成,使網路有更大感受野的同時能降低網路引數,同時多次使用ReLu啟用函式有更多的線性變換,學習能力更強(詳細介紹參考:TensorFlow實戰P110頁)。
- 在訓練時和預測時使用Multi-Scale做資料增強。訓練時將同一張圖片縮放到不同的尺寸,在隨機剪裁到224*224的大小,能夠增加資料量。預測時將同一張圖片縮放到不同尺寸做預測,最後取平均值。
四:ResNet
4.1 網路背景
ResNet(殘差神經網路)由微軟研究院的何凱明等4名華人於2015年提出,成功訓練了152層超級深的卷積神經網路,效果非常突出,而且容易結合到其他網路結構中。在五個主要任務軌跡中都獲得了第一名的成績:
- ImageNet分類任務:錯誤率3.57%
- ImageNet檢測任務:超過第二名16%
- ImageNet定位任務:超過第二名27%
- COCO檢測任務:超過第二名11%
- COCO分割任務:超過第二名12%
作為大神級人物,何凱明憑藉Mask R-CNN論文獲得ICCV2017最佳論文,也是他第三次斬獲頂會最佳論文,另外,他參與的另一篇論文:Focal Loss for Dense Object Detection,也被大會評為最佳學生論文。
4.2 網路結構
上圖為殘差神經網路的基本模組(專業術語叫殘差學習單元),輸入為x,輸出為F(x)+x,F(x)代表網路中資料的一系列乘、加操作,假設神經網路最優的擬合結果輸出為H(x)=F(x)+x,那麼神經網路最優的F(x)即為H(x)與x的殘差,通過擬合殘差來提升網路效果。為什麼轉變為擬合殘差就比傳統卷積網路要好呢?因為訓練的時候至少可以保證殘差為0,保證增加殘差學習單元不會降低網路效能,假設一個淺層網路達到了飽和的準確率,後面再加上這個殘差學習單元,起碼誤差不會增加。(參考: ResNet詳細解釋 )
通過不斷堆疊這個基本模組,就可以得到最終的ResNet模型,理論上可以無限堆疊而不改變網路的效能。下圖為一個34層的ResNet網路。
4.3 網路特點
- 使得訓練超級深的神經網路成為可能,避免了不斷加深神經網路,準確率達到飽和的現象(後來將層數增加到1000層)
- 輸入可以直接連線到輸出,使得整個網路只需要學習殘差,簡化學習目標和難度。
- ResNet是一個推廣性非常好的網路結構,容易和其他網路結合
五:幾張常見的卷積神經網路論文地址:
1. LeNet論文
2. AlexNet論文
3. VGGNet論文
4. ResNet論文
參考文獻:https://www.sumaarts.com/share/620.html
https://blog.csdn.net/qq_34759239/article/details/79034849
https://my.oschina.net/u/876354/blog/1620906
https://baike.baidu.com/item/%E5%8D%B7%E7%A7%AF%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/17541100?fr=aladdin