CNN卷积神经网络深度解析
1. 概述
卷積神經(jīng)網(wǎng)絡(luò)是一種特殊的深層的神經(jīng)網(wǎng)絡(luò)模型,它的特殊性體現(xiàn)在兩個(gè)方面,一方面它的神經(jīng)元間的連接是非全連接的,另一方面同一層中某些神經(jīng)元之間的連接的權(quán)重是共享的(即相同的)。它的非全連接和權(quán)值共享的網(wǎng)絡(luò)結(jié)構(gòu)使之更類(lèi)似于生物神經(jīng)網(wǎng)絡(luò),降低了網(wǎng)絡(luò)模型的復(fù)雜度(對(duì)于很難學(xué)習(xí)的深層結(jié)構(gòu)來(lái)說(shuō),這是非常重要的),減少了權(quán)值的數(shù)量。
卷積網(wǎng)絡(luò)最初是受視覺(jué)神經(jīng)機(jī)制的啟發(fā)而設(shè)計(jì)的,是為識(shí)別二維形狀而設(shè)計(jì)的一個(gè)多層感知器,這種網(wǎng)絡(luò)結(jié)構(gòu)對(duì)平移、比例縮放、傾斜或者共他形式的變形具有高度不變性。1962年Hubel和Wiesel通過(guò)對(duì)貓視覺(jué)皮層細(xì)胞的研究,提出了感受野(receptive field)的概念,1984年日本學(xué)者Fukushima基于感受野概念提出的神經(jīng)認(rèn)知機(jī)(neocognitron)模型,它可以看作是卷積神經(jīng)網(wǎng)絡(luò)的第一個(gè)實(shí)現(xiàn)網(wǎng)絡(luò),也是感受野概念在人工神經(jīng)網(wǎng)絡(luò)領(lǐng)域的首次應(yīng)用。
神經(jīng)認(rèn)知機(jī)將一個(gè)視覺(jué)模式分解成許多子模式(特征),然后進(jìn)入分層遞階式相連的特征平面進(jìn)行處理,它試圖將視覺(jué)系統(tǒng)模型化,使其能夠在即使物體有位移或輕微變形的時(shí)候,也能完成識(shí)別。神經(jīng)認(rèn)知機(jī)能夠利用位移恒定能力從激勵(lì)模式中學(xué)習(xí),并且可識(shí)別這些模式的變化形。在其后的應(yīng)用研究中,Fukushima將神經(jīng)認(rèn)知機(jī)主要用于手寫(xiě)數(shù)字的識(shí)別。隨后,國(guó)內(nèi)外的研究人員提出多種卷積神經(jīng)網(wǎng)絡(luò)形式,在郵政編碼識(shí)別(Y. LeCun etc)、車(chē)牌識(shí)別和人臉識(shí)別等方面得到了廣泛的應(yīng)用。
2. CNN的結(jié)構(gòu)
卷積網(wǎng)絡(luò)是為識(shí)別二維形狀而特殊設(shè)計(jì)的一個(gè)多層感知器,這種網(wǎng)絡(luò)結(jié)構(gòu)對(duì)平移、比例縮放、傾斜或者共他形式的變形具有高度不變性。這些良好的性能是網(wǎng)絡(luò)在有監(jiān)督方式下學(xué)會(huì)的,網(wǎng)絡(luò)的結(jié)構(gòu)主要有稀疏連接和權(quán)值共享兩個(gè)特點(diǎn),包括如下形式的約束:
1 特征提取。每一個(gè)神經(jīng)元從上一層的局部接受域得到突觸輸人,因而迫使它提取局部特征。一旦一個(gè)特征被提取出來(lái),只要它相對(duì)于其他特征的位置被近似地保留下來(lái),它的精確位置就變得沒(méi)有那么重要了。
2 特征映射。網(wǎng)絡(luò)的每一個(gè)計(jì)算層都是由多個(gè)特征映射組成的,每個(gè)特征映射都是平面形式的。平面中單獨(dú)的神經(jīng)元在約束下共享相同的突觸權(quán)值集,這種結(jié)構(gòu)形式具有如下的有益效果:a.平移不變性。b.自由參數(shù)數(shù)量的縮減(通過(guò)權(quán)值共享實(shí)現(xiàn))。
3.子抽樣。每個(gè)卷積層跟著一個(gè)實(shí)現(xiàn)局部平均和子抽樣的計(jì)算層,由此特征映射的分辨率降低。這種操作具有使特征映射的輸出對(duì)平移和其他形式的變形的敏感度下降的作用。
2.1 稀疏連接(Sparse Connectivity)
卷積網(wǎng)絡(luò)通過(guò)在相鄰兩層之間強(qiáng)制使用局部連接模式來(lái)利用圖像的空間局部特性,在第m層的隱層單元只與第m-1層的輸入單元的局部區(qū)域有連接,第m-1層的這些局部區(qū)域被稱(chēng)為空間連續(xù)的接受域。我們可以將這種結(jié)構(gòu)描述如下:
設(shè)第m-1層為視網(wǎng)膜輸入層,第m層的接受域的寬度為3,也就是說(shuō)該層的每個(gè)單元與且僅與輸入層的3個(gè)相鄰的神經(jīng)元相連,第m層與第m+1層具有類(lèi)似的鏈接規(guī)則,如下圖所示。
2.2 權(quán)值共享(Shared Weights)
在卷積網(wǎng)絡(luò)中,每個(gè)稀疏過(guò)濾器hi
通過(guò)共享權(quán)值都會(huì)覆蓋整個(gè)可視域,這些共享權(quán)值的單元構(gòu)成一個(gè)特征映射,如下圖所示。
在圖中,有3個(gè)隱層單元,他們屬于同一個(gè)特征映射。同種顏色的鏈接的權(quán)值是相同的,我們?nèi)匀豢梢允褂锰荻认陆档姆椒▉?lái)學(xué)習(xí)這些權(quán)值,只需要對(duì)原始算法做一些小的改動(dòng),這里共享權(quán)值的梯度是所有共享參數(shù)的梯度的總和。我們不禁會(huì)問(wèn)為什么要權(quán)重共享呢?一方面,重復(fù)單元能夠?qū)μ卣鬟M(jìn)行識(shí)別,而不考慮它在可視域中的位置。另一方面,權(quán)值共享使得我們能更有效的進(jìn)行特征抽取,因?yàn)樗鼧O大的減少了需要學(xué)習(xí)的自由變量的個(gè)數(shù)。通過(guò)控制模型的規(guī)模,卷積網(wǎng)絡(luò)對(duì)視覺(jué)問(wèn)題可以具有很好的泛化能力。2.3 The Full Model
卷積神經(jīng)網(wǎng)絡(luò)是一個(gè)多層的神經(jīng)網(wǎng)絡(luò),每層由多個(gè)二維平面組成,而每個(gè)平面由多個(gè)獨(dú)立神經(jīng)元組成。網(wǎng)絡(luò)中包含一些簡(jiǎn)單元和復(fù)雜元,分別記為S-元和C-元。S-元聚合在一起組成S-面,S-面聚合在一起組成S-層,用Us表示。C-元、C-面和C-層(Us)之間存在類(lèi)似的關(guān)系。網(wǎng)絡(luò)的任一中間級(jí)由S-層與C-層串接而成,而輸入級(jí)只含一層,它直接接受二維視覺(jué)模式,樣本特征提取步驟已嵌入到卷積神經(jīng)網(wǎng)絡(luò)模型的互聯(lián)結(jié)構(gòu)中。
一般地,Us為特征提取層,每個(gè)神經(jīng)元的輸入與前一層的局部感受野相連,并提取該局部的特征,一旦該局部特征被提取后,它與其他特征間的位置關(guān)系也隨之確定下來(lái);Uc是特征映射層,網(wǎng)絡(luò)的每個(gè)計(jì)算層由多個(gè)特征映射組成,每個(gè)特征映射為一個(gè)平面,平面上所有神經(jīng)元的權(quán)值相等。特征映射結(jié)構(gòu)采用影響函數(shù)核小的sigmoid函數(shù)作為卷積網(wǎng)絡(luò)的激活函數(shù),使得特征映射具有位移不變性(這一句表示沒(méi)看懂,那位如果看懂了,請(qǐng)給我講解一下)。此外,由于一個(gè)映射面上的神經(jīng)元共享權(quán)值,因而減少了網(wǎng)絡(luò)自由參數(shù)的個(gè)數(shù),降低了網(wǎng)絡(luò)參數(shù)選擇的復(fù)雜度。卷積神經(jīng)網(wǎng)絡(luò)中的每一個(gè)特征提取層(S-層)都緊跟著一個(gè)用來(lái)求局部平均與二次提取的計(jì)算層(C-層),這種特有的兩次特征提取結(jié)構(gòu)使網(wǎng)絡(luò)在識(shí)別時(shí)對(duì)輸入樣本有較高的畸變?nèi)萑棠芰Α?/p>
下圖是一個(gè)卷積網(wǎng)絡(luò)的實(shí)例
圖中的卷積網(wǎng)絡(luò)工作流程如下,輸入層由32×32個(gè)感知節(jié)點(diǎn)組成,接收原始圖像。然后,計(jì)算流程在卷積和子抽樣之間交替進(jìn)行,如下所述:第一隱藏層進(jìn)行卷積,它由8個(gè)特征映射組成,每個(gè)特征映射由28×28個(gè)神經(jīng)元組成,每個(gè)神經(jīng)元指定一個(gè) 5×5 的接受域;第二隱藏層實(shí)現(xiàn)子抽樣和局部平均,它同樣由 8 個(gè)特征映射組成,但其每個(gè)特征映射由14×14 個(gè)神經(jīng)元組成。每個(gè)神經(jīng)元具有一個(gè) 2×2 的接受域,一個(gè)可訓(xùn)練系數(shù),一個(gè)可訓(xùn)練偏置和一個(gè) sigmoid 激活函數(shù)。可訓(xùn)練系數(shù)和偏置控制神經(jīng)元的操作點(diǎn)。第三隱藏層進(jìn)行第二次卷積,它由 20 個(gè)特征映射組成每個(gè)特征映射由 10×10 個(gè)神經(jīng)元組成。該隱藏層中的每個(gè)神經(jīng)元可能具有和下一個(gè)隱藏層幾個(gè)特征映射相連的突觸連接,它以與第一個(gè)卷積層相似的方式操作。第四個(gè)隱藏層進(jìn)行第二次子抽樣和局部平均汁算。它由 20 個(gè)特征映射組成,但每個(gè)特征映射由 5×5 個(gè)神經(jīng)元組成,它以與第一次抽樣相似的方式操作。第五個(gè)隱藏層實(shí)現(xiàn)卷積的最后階段,它由 120 個(gè)神經(jīng)元組成,每個(gè)神經(jīng)元指定一個(gè) 5×5 的接受域。最后是個(gè)全連接層,得到輸出向量。相繼的計(jì)算層在卷積和抽樣之間的連續(xù)交替,我們得到一個(gè)“雙尖塔”的效果,也就是在每個(gè)卷積或抽樣層,隨著空間分辨率下降,與相應(yīng)的前一層相比特征映射的數(shù)量增加。卷積之后進(jìn)行子抽樣的思想是受到動(dòng)物視覺(jué)系統(tǒng)中的“簡(jiǎn)單的”細(xì)胞后面跟著“復(fù)雜的”細(xì)胞的想法的啟發(fā)而產(chǎn)生的。圖中所示的多層感知器包含近似 100000 個(gè)突觸連接,但只有大約2600 個(gè)自由參數(shù)。自由參數(shù)在數(shù)量上顯著地減少是通過(guò)權(quán)值共享獲得的,學(xué)習(xí)機(jī)器的能力(以 VC 維的形式度量)因而下降,這又提高它的泛化能力。而且它對(duì)自由參數(shù)的調(diào)整通過(guò)反向傳播學(xué)習(xí)的隨機(jī)形式來(lái)實(shí)現(xiàn)。另一個(gè)顯著的特點(diǎn)是使用權(quán)值共享使得以并行形式實(shí)現(xiàn)卷積網(wǎng)絡(luò)變得可能。這是卷積網(wǎng)絡(luò)對(duì)全連接的多層感知器而言的另一個(gè)優(yōu)點(diǎn)。
3. CNN的學(xué)習(xí)
總體而言,前面提到的卷積網(wǎng)絡(luò)可以簡(jiǎn)化為下圖所示模型:
其中,input 到C1、S4到C5、C5到output是全連接,C1到S2、C3到S4是一一對(duì)應(yīng)的連接,S2到C3為了消除網(wǎng)絡(luò)對(duì)稱(chēng)性,去掉了一部分連接,可以讓特征映射更具多樣性。需要注意的是 C5 卷積核的尺寸要和 S4 的輸出相同,只有這樣才能保證輸出是一維向量。3.1 卷積層的學(xué)習(xí)
卷積層的典型結(jié)構(gòu)如下圖所示。
卷積層的前饋運(yùn)算是通過(guò)如下算法實(shí)現(xiàn)的:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ConvolutionLayer::fprop(input,output) { //取得卷積核的個(gè)數(shù) int n=kernel.GetDim(0); for (int i=0;i<n;i++) { //第i個(gè)卷積核對(duì)應(yīng)輸入層第a個(gè)特征映射,輸出層的第b個(gè)特征映射 //這個(gè)卷積核可以形象的看作是從輸入層第a個(gè)特征映射到輸出層的第b個(gè)特征映射的一個(gè)鏈接 int a=table[i][0], b=table[i][1]; //用第i個(gè)卷積核和輸入層第a個(gè)特征映射做卷積 convolution = Conv(input[a],kernel[i]); //把卷積結(jié)果求和 sum[b] +=convolution; } for (i=0;i<(int)bias.size();i++) { //加上偏移量 sum[i] += bias[i]; } //調(diào)用Sigmoid函數(shù) output = Sigmoid(sum); } |
卷積層的反饋運(yùn)算的核心代碼如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ConvolutionLayer::bprop(input,output,in_dx,out_dx) { //梯度通過(guò)DSigmoid反傳 sum_dx = DSigmoid(out_dx); //計(jì)算bias的梯度 for (i=0;i<bias.size();i++) { bias_dx[i] = sum_dx[i]; } //取得卷積核的個(gè)數(shù) int n=kernel.GetDim(0); for (int i=0;i<n;i++) { int a=table[i][0],b=table[i][1]; //用第i個(gè)卷積核和第b個(gè)輸出層反向卷積(即輸出層的一點(diǎn)乘卷積模板返回給輸入層),并把結(jié)果累加到第a個(gè)輸入層 input_dx[a] += DConv(sum_dx[b],kernel[i]); //用同樣的方法計(jì)算卷積模板的梯度 kernel_dx[i] += DConv(sum_dx[b],input[a]); } } |
3.2 子采樣層的學(xué)習(xí)
子采樣層的典型結(jié)構(gòu)如下圖所示。
類(lèi)似的字采樣層的輸出的計(jì)算式為:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 是可訓(xùn)練的權(quán)重,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); } |
子采樣層的反饋運(yùn)算的核心代碼如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SubSamplingLayer::bprop(input,output,in_dx,out_dx) { //梯度通過(guò)DSigmoid反傳 sum_dx = DSigmoid(out_dx); //計(jì)算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]; } } } |
3.3 全連接層的學(xué)習(xí)
全連接層的學(xué)習(xí)與傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)方法類(lèi)似,也是使用BP算法,這里就不詳述了。
關(guān)于CNN的完整代碼可以參考https://github.com/ibillxia/DeepLearnToolbox/tree/master/CNN中的Matlab代碼。
總結(jié)
以上是生活随笔為你收集整理的CNN卷积神经网络深度解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: scala中使用Option、Some、
- 下一篇: 标题:浅析图卷积神经网络