本文整理了網上幾位大牛的博客,詳細地講解了CNN的基礎結構與核心思想,歡迎交流。php
[2]Deep Learning訓練過程github
[3]Deep Learning模型之:CNN卷積神經網絡推導和實現算法
[4]Deep Learning模型之:CNN的反向求導及練習網絡
[5]Deep Learning模型之:CNN卷積神經網絡(一)深度解析CNN機器學習
[6]Deep Learning模型之:CNN卷積神經網絡(二)文字識別系統LeNet-5函數
[7]Deep Learning模型之:CNN卷積神經網絡(三)CNN常見問題總結佈局
1. 概述性能
卷積神經網絡是一種特殊的深層的神經網絡模型,它的特殊性體如今兩個方面,一方面它的神經元間的鏈接是非全鏈接的, 另外一方面同一層中某些神經元之間的鏈接的權重是共享的(即相同的)。它的非全鏈接和權值共享的網絡結構使之更相似於生物 神經網絡,下降了網絡模型的複雜度(對於很難學習的深層結構來講,這是很是重要的),減小了權值的數量。學習
回想一下BP神經網絡。BP網絡每一層節點是一個線性的一維排列狀態,層與層的網絡節點之間是全鏈接的。這樣設想一下,若是BP網絡中層與層之間的節點鏈接再也不是全鏈接,而是局部鏈接的。這樣,就是一種最簡單的一維卷積網絡。若是咱們把上述這個思路擴展到二維,這就是咱們在大多數參考資料上看到的卷積神經網絡。具體參看下圖:
上圖左:全鏈接網絡。若是咱們有1000x1000像素的圖像,有1百萬個隱層神經元,每一個隱層神經元都鏈接圖像的每個像素點,就有1000x1000x1000000=10^12個鏈接,也就是10^12個權值參數。
上圖右:局部鏈接網絡,每個節點與上層節點同位置附件10x10的窗口相鏈接,則1百萬個隱層神經元就只有100w乘以100,即10^8個參數。其權值鏈接個數比原來減小了四個數量級。
根據BP網絡信號前向傳遞過程,咱們能夠很容易計算網絡節點的輸出。例如,對於上圖中被標註爲紅色節點的淨輸入,就等於全部與紅線相鏈接的上一層神經元節點值與紅色線表示的權值之積的累加。這樣的計算過程,不少書上稱其爲卷積。
事實上,對於數字濾波而言,其濾波器的係數一般是對稱的。不然,卷積的計算須要先反向對摺,而後進行乘累加的計算。上述神經網絡權值知足對稱嗎?我想答案是否認的!因此,上述稱其爲卷積運算,顯然是有失偏頗的。但這並不重要,僅僅是一個名詞稱謂而已。只是,搞信號處理的人,在初次接觸卷積神經網絡的時候,帶來了一些理解上的誤區。
卷積神經網絡另一個特性是權值共享。例如,就上面右邊那幅圖來講,權值共享,也就是說全部的紅色線標註的鏈接權值相同。這一點,初學者容易產生誤解。
上面描述的只是單層網絡結構,前A&T Shannon Lab 的 Yann LeCun等人據此提出了基於卷積神經網絡的一個文字識別系統 LeNet-5。該系統90年代就被用於銀行手寫數字的識別。
二、 CNN的結構
卷積網絡是爲識別二維形狀而特殊設計的一個多層感知器,這種網絡結構對平移、比例縮放、傾斜或者共他形式的變形具備高度不變性。 這些良好的性能是網絡在有監督方式下學會的,網絡的結構主要有稀疏鏈接和權值共享兩個特色,包括以下形式的約束:
一、 特徵提取。每個神經元從上一層的局部接受域獲得突觸輸人,於是迫使它提取局部特徵。一旦一個特徵被提取出來, 只要它相對於其餘特徵的位置被近似地保留下來,它的精確位置就變得沒有那麼重要了。
2 、特徵映射。網絡的每個計算層都是由多個特徵映射組成的,每一個特徵映射都是平面形式的。平面中單獨的神經元在約束下共享 相同的突觸權值集,這種結構形式具備以下的有益效果:a.平移不變性。b.自由參數數量的縮減(經過權值共享實現)。
三、子抽樣。每一個卷積層後面跟着一個實現局部平均和子抽樣的計算層,由此特徵映射的分辨率下降。這種操做具備使特徵映射的輸出對平移和其餘 形式的變形的敏感度降低的做用。
卷積神經網絡是一個多層的神經網絡,每層由多個二維平面組成,而每一個平面由多個獨立神經元組成。
圖:卷積神經網絡的概念示範:輸入圖像經過和三個可訓練的濾波器和可加偏置進行卷積,卷積後在C1層產生三個特徵映射圖,而後特徵映射圖中每組的四個像素再進行求和,加權值,加偏置,經過一個Sigmoid函數獲得三個S2層的特徵映射圖。這些映射圖再進過濾波獲得C3層。這個層級結構再和S2同樣產生S4。最終,這些像素值被光柵化,並鏈接成一個向量輸入到傳統的神經網絡,獲得輸出。
通常地,C層爲特徵提取層,每一個神經元的輸入與前一層的局部感覺野相連,並提取該局部的特徵,一旦該局部特徵被提取後,它與其餘特徵間的位置關係也隨之肯定下來;S層是特徵映射層,網絡的每一個計算層由多個特徵映射組成,每一個特徵映射爲一個平面,平面上全部神經元的權值相等。特徵映射結構採用影響函數核小的sigmoid函數做爲卷積網絡的激活函數,使得特徵映射具備位移不變性。
此外,因爲一個映射面上的神經元共享權值,於是減小了網絡自由參數的個數,下降了網絡參數選擇的複雜度。卷積神經網絡中的每個特徵提取層(C-層)都緊跟着一個用來求局部平均與二次提取的計算層(S-層),這種特有的兩次特徵提取結構使網絡在識別時對輸入樣本有較高的畸變容忍能力。
2.1 稀疏鏈接(Sparse Connectivity)
卷積網絡經過在相鄰兩層之間強制使用局部鏈接模式來利用圖像的空間局部特性,在第m層的隱層單元只與第m-1層的輸入單元的局部區域有鏈接,第m-1層的這些局部 區域被稱爲空間連續的接受域。咱們能夠將這種結構描述以下:
設第m-1層爲視網膜輸入層,第m層的接受域的寬度爲3,也就是說該層的每一個單元與且僅與輸入層的3個相鄰的神經元相連,第m層與第m+1層具備相似的連接規則,以下圖所示。
能夠看到m+1層的神經元相對於第m層的接受域的寬度也爲3,但相對於輸入層的接受域爲5,這種結構將學習到的過濾器(對應於輸入信號中被最大激活的單元)限制在局部空間 模式(由於每一個單元對它接受域外的variation不作反應)。從上圖也能夠看出,多個這樣的層堆疊起來後,會使得過濾器(再也不是線性的)逐漸成爲全局的(也就是覆蓋到了更 大的視覺區域)。例如上圖中第m+1層的神經元能夠對寬度爲5的輸入進行一個非線性的特徵編碼。
2.2 權值共享(Shared Weights)
在卷積網絡中,每一個稀疏過濾器hi經過共享權值都會覆蓋整個可視域,這些共享權值的單元構成一個特徵映射,以下圖所示。
在圖中,有3個隱層單元,他們屬於同一個特徵映射。同種顏色的連接的權值是相同的,咱們仍然可使用梯度降低的方法來學習這些權值,只須要對原始算法作一些小的改動, 這裏共享權值的梯度是全部共享參數的梯度的總和。咱們不由會問爲何要權重共享呢?一方面,重複單元可以對特徵進行識別,而不考慮它在可視域中的位置。另外一方面,權值 共享使得咱們能更有效的進行特徵抽取,由於它極大的減小了須要學習的自由變量的個數。經過控制模型的規模,卷積網絡對視覺問題能夠具備很好的泛化能力。
舉例講解:
上面聊到,好像CNN一個牛逼的地方就在於經過感覺野和權值共享減小了神經網絡須要訓練的參數的個數。那到底是啥的呢?
下圖左:若是咱們有1000x1000像素的圖像,有1百萬個隱層神經元,那麼他們全鏈接的話(每一個隱層神經元都鏈接圖像的每個像素點),就有1000x1000x1000000=10^12個鏈接,也就是10^12個權值參數。然而圖像的空間聯繫是局部的,就像人是經過一個局部的感覺野去感覺外界圖像同樣,每個神經元都不須要對全局圖像作感覺,每一個神經元只感覺局部的圖像區域,而後在更高層,將這些感覺不一樣局部的神經元綜合起來就能夠獲得全局的信息了。這樣,咱們就能夠減小鏈接的數目,也就是減小神經網絡須要訓練的權值參數的個數了。以下圖右:假如局部感覺野是10x10,隱層每一個感覺野只須要和這10x10的局部圖像相鏈接,因此1百萬個隱層神經元就只有一億個鏈接,即10^8個參數。比原來減小了四個0(數量級),這樣訓練起來就沒那麼費力了,但仍是感受不少的啊,那還有啥辦法沒?
咱們知道,隱含層的每個神經元都鏈接10x10個圖像區域,也就是說每個神經元存在10x10=100個鏈接權值參數。那若是咱們每一個神經元這100個參數是相同的呢?也就是說每一個神經元用的是同一個卷積核去卷積圖像。這樣咱們就只有多少個參數??只有100個參數啊!!!親!無論你隱層的神經元個數有多少,兩層間的鏈接我只有100個參數啊!親!這就是權值共享啊!親!這就是卷積神經網絡的主打賣點啊!親!(有點煩了,呵呵)也許你會問,這樣作靠譜嗎?爲何可行呢?這個……共同窗習。
好了,你就會想,這樣提取特徵也忒不靠譜吧,這樣你只提取了一種特徵啊?對了,真聰明,咱們須要提取多種特徵對不?假如一種濾波器,也就是一種卷積核就是提出圖像的一種特徵,例如某個方向的邊緣。那麼咱們須要提取不一樣的特徵,怎麼辦,加多幾種濾波器不就好了嗎?對了。因此假設咱們加到100種濾波器,每種濾波器的參數不同,表示它提出輸入圖像的不一樣特徵,例如不一樣的邊緣。這樣每種濾波器去卷積圖像就獲得對圖像的不一樣特徵的放映,咱們稱之爲Feature Map。因此100種卷積核就有100個Feature Map。這100個Feature Map就組成了一層神經元。到這個時候明瞭了吧。咱們這一層有多少個參數了?100種卷積核x每種卷積核共享100個參數=100x100=10K,也就是1萬個參數。才1萬個參數啊!親!(又來了,受不了了!)見下圖右:不一樣的顏色表達不一樣的濾波器。
嘿喲,遺漏一個問題了。剛纔說隱層的參數個數和隱層的神經元個數無關,只和濾波器的大小和濾波器種類的多少有關。那麼隱層的神經元個數怎麼肯定呢?它和原圖像,也就是輸入的大小(神經元個數)、濾波器的大小和濾波器在圖像中的滑動步長都有關!例如,個人圖像是1000x1000像素,而濾波器大小是10x10,假設濾波器沒有重疊,也就是步長爲10,這樣隱層的神經元個數就是(1000x1000 )/ (10x10)=100x100個神經元了,假設步長是8,也就是卷積核會重疊兩個像素,那麼……我就不算了,思想懂了就好。注意了,這只是一種濾波器,也就是一個Feature Map的神經元個數哦,若是100個Feature Map就是100倍了。因而可知,圖像越大,神經元個數和須要訓練的權值參數個數的貧富差距就越大。
須要注意的一點是,上面的討論都沒有考慮每一個神經元的偏置部分。因此權值個數須要加1 。這個也是同一種濾波器共享的。
總之,卷積網絡的核心思想是將:局部感覺野、權值共享(或者權值複製)以及時間或空間亞採樣這三種結構思想結合起來得到了某種程度的位移、尺度、形變不變性。
2.3 The Full Model
卷積神經網絡是一個多層的神經網絡,每層由多個二維平面組成,而每一個平面由多個獨立神經元組成。網絡中包含一些簡單元和複雜元,分別記爲S-元 和C-元。S-元聚合在一塊兒組成S-面,S-面聚合在一塊兒組成S-層,用Us表示。C-元、C-面和C-層(Us)之間存在相似的關係。網絡的任一中間級由S-層與C-層 串接而成,而輸入級只含一層,它直接接受二維視覺模式,樣本特徵提取步驟已嵌入到卷積神經網絡模型的互聯結構中。
通常地,Us爲特徵提取層(子採樣層),每一個神經元的輸入與前一層的局部感覺野相連,並提取該局部的特徵,一旦該局部特徵被提取後,它與其餘特徵間的位置關係 也隨之肯定下來;
Uc是特徵映射層(卷積層),網絡的每一個計算層由多個特徵映射組成,每一個特徵映射爲一個平面,平面上全部神經元的權值相等。特徵映射結構採用 影響函數核小的sigmoid函數做爲卷積網絡的激活函數,使得特徵映射具備位移不變性。此外,因爲 一個映射面上的神經元共享權值,於是減小了網絡自由參數的個數,下降了網絡參數選擇的複雜度。卷積神經網絡中的每個特徵提取層(S-層)都緊跟着一個 用來求局部平均與二次提取的計算層(C-層),這種特有的兩次特徵提取結構使網絡在識別時對輸入樣本有較高的畸變容忍能力。
下圖是一個卷積網絡的實例,在博文」Deep Learning模型之:CNN卷積神經網絡(二) 文字識別系統LeNet-5 「中有詳細講解:
圖中的卷積網絡工做流程以下,輸入層由32×32個感知節點組成,接收原始圖像。而後,計算流程在卷積和子抽樣之間交替進行,以下所述:
第一隱藏層進行卷積,它由8個特徵映射組成,每一個特徵映射由28×28個神經元組成,每一個神經元指定一個 5×5 的接受域;
第二隱藏層實現子 抽樣和局部平均,它一樣由 8 個特徵映射組成,但其每一個特徵映射由14×14 個神經元組成。每一個神經元具備一個 2×2 的接受域,一個可訓練 係數,一個可訓練偏置和一個 sigmoid 激活函數。可訓練係數和偏置控制神經元的操做點。
第三隱藏層進行第二次卷積,它由 20 個特徵映射組 成,每一個特徵映射由 10×10 個神經元組成。該隱藏層中的每一個神經元可能具備和下一個隱藏層幾個特徵映射相連的突觸鏈接,它以與第一個卷積 層類似的方式操做。
第四個隱藏層進行第二次子抽樣和局部平均汁算。它由 20 個特徵映射組成,但每一個特徵映射由 5×5 個神經元組成,它以 與第一次抽樣類似的方式操做。
第五個隱藏層實現卷積的最後階段,它由 120 個神經元組成,每一個神經元指定一個 5×5 的接受域。
最後是個全 鏈接層,獲得輸出向量。
相繼的計算層在卷積和抽樣之間的連續交替,咱們獲得一個「雙尖塔」的效果,也就是在每一個卷積或抽樣層,隨着空 間分辨率降低,與相應的前一層相比特徵映射的數量增長。卷積以後進行子抽樣的思想是受到動物視覺系統中的「簡單的」細胞後面跟着「複雜的」細胞的想法的啓發而產生的。
圖中所示的多層感知器包含近似 100000 個突觸鏈接,但只有大約2600 個自由參數(每一個特徵映射爲一個平面,平面上全部神經元的權值相等)。自由參數在數量上顯著地減小是經過權值共享得到 的,學習機器的能力(以 VC 維的形式度量)於是降低,這又提升它的泛化能力。並且它對自由參數的調整經過反向傳播學習的隨機形式來實 現。另外一個顯著的特色是使用權值共享使得以並行形式實現卷積網絡變得可能。這是卷積網絡對全鏈接的多層感知器而言的另外一個優勢。
三、 CNN的訓練
神經網絡用於模式識別的主流是有指導學習網絡,無指導學習網絡更多的是用於聚類分析。對於有指導的模式識別,因爲任同樣本的類別是已知的,樣本在空間的分佈再也不是依據其天然分佈傾向來劃分,而是要根據同類樣本在空間的分佈及不一樣類樣本之間的分離程度找一種適當的空間劃分方法,或者找到一個分類邊界,使得不一樣類樣本分別位於不一樣的區域內。這就須要一個長時間且複雜的學習過程,不斷調整用以劃分樣本空間的分類邊界的位置,使盡量少的樣本被劃分到非同類區域中。
卷積網絡在本質上是一種輸入到輸出的映射,它可以學習大量的輸入與輸出之間的映射關係,而不須要任何輸入和輸出之間的精確的數學表達式,只要用已知的模式對卷積網絡加以訓練,網絡就具備輸入輸出對之間的映射能力。卷積網絡執行的是有導師訓練,因此其樣本集是由形如:(輸入向量,理想輸出向量)的向量對構成的。全部這些向量對,都應該是來源於網絡即將模擬的系統的實際「運行」結果。它們能夠是從實際運行系統中採集來的。在開始訓練前,全部的權都應該用一些不一樣的小隨機數進行初始化。「小隨機數」用來保證網絡不會因權值過大而進入飽和狀態,從而致使訓練失敗;「不一樣」用來保證網絡能夠正常地學習。實際上,若是用相同的數去初始化權矩陣,則網絡無能力學習。
訓練算法與傳統的BP算法差很少。主要包括4步,這4步被分爲兩個階段:
第一階段,向前傳播階段:
a)從樣本集中取一個樣本(X,Yp),將X輸入網絡;
b)計算相應的實際輸出Op。
在此階段,信息從輸入層通過逐級的變換,傳送到輸出層。這個過程也是網絡在完成訓練後正常運行時執行的過程。在此過程當中,網絡執行的是計算(實際上就是輸入與每層的權值矩陣相點乘,獲得最後的輸出結果):
Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n))
第二階段,向後傳播階段
a)算實際輸出Op與相應的理想輸出Yp的差;
b)按極小化偏差的方法反向傳播調整權矩陣。
整體而言,卷積網絡能夠簡化爲下圖所示模型:
其中,input 到C一、S4到C五、C5到output是全鏈接,C1到S二、C3到S4是一一對應的鏈接,S2到C3爲了消除網絡對稱性,去掉了一部分鏈接, 可讓特徵映射更具多樣性。須要注意的是 C5 卷積核的尺寸要和 S4 的輸出相同,只有這樣才能保證輸出是一維向量。
4.1 卷積層的學習
卷積層的典型結構以下圖所示:
卷積層的前饋運算是經過以下算法實現的:
卷積層的輸出= Sigmoid( Sum(卷積) +偏移量)
其中卷積核和偏移量都是可訓練的。下面是其核心代碼:
ConvolutionLayer::fprop(input,output) { //取得卷積核的個數 int n=kernel.GetDim(0); for (int i=0;i<n;i++) { //第i個卷積覈對應輸入層第a個特徵映射,輸出層的第b個特徵映射 //這個卷積核能夠形象的看做是從輸入層第a個特徵映射到輸出層的第b個特徵映射的一個連接 int a=table[i][0], b=table[i][1]; //用第i個卷積核和輸入層第a個特徵映射作卷積 convolution = Conv(input[a],kernel[i]); //把卷積結果求和 sum[b] +=convolution; } for (i=0;i<(int)bias.size();i++) { //加上偏移量 sum[i] += bias[i]; } //調用Sigmoid函數 output = Sigmoid(sum); }
其中,input是 n1×n2×n3 的矩陣,n1是輸入層特徵映射的個數,n2是輸入層特徵映射的寬度,n3是輸入層特徵映射的高度。output, sum, convolution, bias是n1×(n2-kw+1)×(n3-kh+1)的矩陣,kw,kh是卷積核的寬度高度(圖中是5×5)。kernel是卷積核矩陣。table是鏈接表,即若是第a輸入和第b個輸出之間 有鏈接,table裏就會有[a,b]這一項,並且每一個鏈接都對應一個卷積核。
卷積層的反饋運算的核心代碼以下:
ConvolutionLayer::bprop(input,output,in_dx,out_dx) { //梯度經過DSigmoid反傳 sum_dx = DSigmoid(out_dx); //計算bias的梯度 for (i=0;i<bias.size();i++) { bias_dx[i] = sum_dx[i]; } //取得卷積核的個數 int n=kernel.GetDim(0); for (int i=0;i<n;i++) { int a=table[i][0],b=table[i][1]; //用第i個卷積核和第b個輸出層反向卷積(即輸出層的一點乘卷積模板返回給輸入層),並把結果累加到第a個輸入層 input_dx[a] += DConv(sum_dx[b],kernel[i]); //用一樣的方法計算卷積模板的梯度 kernel_dx[i] += DConv(sum_dx[b],input[a]); } }
其中in_dx,out_dx 的結構和 input,output 相同,表明的是相應點的梯度。
4.2 子採樣層的學習
子採樣層的典型結構以下圖所示:
相似的子採樣層的輸出的計算式爲:
輸出= Sigmoid( 採樣*權重 +偏移量)
其核心代碼以下:
SubSamplingLayer::fprop(input,output) { int n1= input.GetDim(0); int n2= input.GetDim(1); int n3= input.GetDim(2); for (int i=0;i<n1;i++) { for (int j=0;j<n2;j++) { for (int k=0;k<n3;k++) { //coeff 是可訓練的權重,sw 、sh 是採樣窗口的尺寸。 sub[i][j/sw][k/sh] += input[i][j][k]*coeff[i]; } } } for (i=0;i<n1;i++) { //加上偏移量 sum[i] = sub[i] + bias[i]; } output = Sigmoid(sum); }
子採樣層的反饋運算的核心代碼以下:
SubSamplingLayer::bprop(input,output,in_dx,out_dx) { //梯度經過DSigmoid反傳 sum_dx = DSigmoid(out_dx); //計算bias和coeff的梯度 for (i=0;i<n1;i++) { coeff_dx[i] = 0; bias_dx[i] = 0; for (j=0;j<n2/sw;j++) for (k=0;k<n3/sh;k++) { coeff_dx[i] += sub[j][k]*sum_dx[i][j][k]; bias_dx[i] += sum_dx[i][j][k]); } } for (i=0;i<n1;i++) { for (j=0;j<n2;j++) for (k=0;k<n3;k++) { in_dx[i][j][k] = coeff[i]*sum_dx[i][j/sw][k/sh]; } } }
五、CNN的優勢
卷積神經網絡CNN主要用來識別位移、縮放及其餘形式扭曲不變性的二維圖形。因爲CNN的特徵檢測層經過訓練數據進行學習,因此在使用CNN時,避免了顯式的特徵抽取,而隱式地從訓練數據中進行學習;再者因爲同一特徵映射面上的神經元權值相同,因此網絡能夠並行學習,這也是卷積網絡相對於神經元彼此相連網絡的一大優點。卷積神經網絡以其局部權值共享的特殊結構在語音識別和圖像處理方面有着獨特的優越性,其佈局更接近於實際的生物神經網絡,權值共享下降了網絡的複雜性,特別是多維輸入向量的圖像能夠直接輸入網絡這一特色避免了特徵提取和分類過程當中數據重建的複雜度。
流的分類方式幾乎都是基於統計特徵的,這就意味着在進行分辨前必須提取某些特徵。然而,顯式的特徵提取並不容易,在一些應用問題中也並不是老是可靠的。卷積神經網絡,它避免了顯式的特徵取樣,隱式地從訓練數據中進行學習。這使得卷積神經網絡明顯有別於其餘基於神經網絡的分類器,經過結構重組和減小權值將特徵提取功能融合進多層感知器。它能夠直接處理灰度圖片,可以直接用於處理基於圖像的分類。
卷積網絡較通常神經網絡在圖像處理方面有以下優勢: a)輸入圖像和網絡的拓撲結構能很好的吻合;b)特徵提取和模式分類同時進行,並同時在訓練中產生;c)權重共享能夠減小網絡的訓練參數,使神經網絡結構變得更簡單,適應性更強。
六、CNN的實現問題
CNNs中這種層間聯繫和空域信息的緊密關係,使其適於圖像處理和理解。並且,其在自動提取圖像的顯著特徵方面還表現出了比較優的性能。在一些例子當中,Gabor濾波器已經被使用在一個初始化預處理的步驟中,以達到模擬人類視覺系統對視覺刺激的響應。在目前大部分的工做中,研究者將CNNs應用到了多種機器學習問題中,包括人臉識別,文檔分析和語言檢測等。爲了達到尋找視頻中幀與幀之間的相干性的目的,目前CNNs經過一個時間相干性去訓練,但這個不是CNNs特有的。
References:
http://blog.csdn.net/nan355655600/article/details/17690029
http://blog.csdn.net/zouxy09/article/details/8782018