卷積神經(jīng)網(wǎng)絡(luò)CNN從入門到精通精編版_第1頁
卷積神經(jīng)網(wǎng)絡(luò)CNN從入門到精通精編版_第2頁
卷積神經(jīng)網(wǎng)絡(luò)CNN從入門到精通精編版_第3頁
卷積神經(jīng)網(wǎng)絡(luò)CNN從入門到精通精編版_第4頁
卷積神經(jīng)網(wǎng)絡(luò)CNN從入門到精通精編版_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

#〃調(diào)用Sigmoid函數(shù)output=Sigmoid(sum);19}其中,input是nixn2xn3的矩陣,n1是輸入層特征映射的個(gè)數(shù),n2是輸入層特征映射的寬度小3是輸入層特征映射的高度。output,sum,convolution,bias是n1x(n2-kw+1)x(n3-kh+1)的矩陣,kw,kh是卷積核的寬度高度(圖中是5x5)。kernel是卷積核矩陣。table是連接表,即如果第a輸入和第b個(gè)輸出之間有連接,table里就會(huì)有[a,b]這一項(xiàng),而且每個(gè)連接都對(duì)應(yīng)一個(gè)卷積核。卷積層的反饋運(yùn)算的核心代碼如下:234567891023456789101112131415161718〃計(jì)算bias的梯度for(i=O;i<bias.size();i++){bias_dx[i]=sum_dx[i];}〃取得卷積核的個(gè)數(shù)intn=kernel.GetDim(O);for(inti=0;i<n;i++){inta=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]);其中in_dx,out_dx的結(jié)構(gòu)和input,output相同,代表的是相應(yīng)點(diǎn)的梯度3.2子采樣層的學(xué)習(xí)子采樣層的典型結(jié)構(gòu)如下圖所示。

類似的字采樣層的輸出的計(jì)算式為:輸出二Sigmoid(采樣*權(quán)重+偏移量)其核心代碼如下:12SubSamplingLayer::fprop(input,output){3intn1=input.GetDim(O);4intn2=input.GetDim(1);5intn3=input.GetDim(2);6for(inti=0;i<n1;i++){7for(intj=0;j<n2;j++){8for(intk=0;k<n3;k++){9//coeff是可訓(xùn)練的權(quán)重,sw、sh是采樣窗口的尺寸。10sub[i][j/sw][k/sh]+=input[i][j][k]*coeff[i];11}12}13}14for(i=0;i<n1;i++){15〃加上偏移量16sum[i]=sub[i]+bias[i];17}18output=Sigmoid(sum);}子采樣層的反饋運(yùn)算的核心代碼如下:SubSamplingLayer::bprop(input,output,in_dx,out_dx){〃梯度通過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++){12}}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];}19}20}3.3全連接層的學(xué)習(xí)全連接層的學(xué)習(xí)與傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)方法類似,也是使用BP算法,這里就不詳述了。關(guān)于CNN的完整代碼可以參考/ibillxia/DeepLearnToolbox/tree/master/CNN中的Matlab代碼。ReferencesLearnDeepArchitecturesforAI,Chapter4.5.DeepLearningTutorial,Release0.1,Chapter6.ConvolutionalNetworksforImagesSpeechandTime-Series.基于卷積網(wǎng)絡(luò)的三維模型特征提取.王添翼.卷積神經(jīng)網(wǎng)絡(luò)的研究及其在車牌識(shí)別系統(tǒng)中的應(yīng)用.陸璐.OriginalLink:http://ibillxia.github.io/blog/2013/04/06/Convolutional-Neural-Networks/Attribution-NON-Commercial-ShareAlike-Copyright?BillXiaPostedbyBillXiaApr6th,2013PostedinPRMLTaggedwithCNN,LeNet,NeuralNetworks轉(zhuǎn)載自:http://ibillxia.github.io/blog/2013/04/06/Convolutional-Neural-Networks/DeepLearning(深度學(xué)習(xí))學(xué)習(xí)筆記整理系列之(七)DeepLearning(深度學(xué)習(xí))學(xué)習(xí)筆記整理系列zouxy09@/zouxy09作者:Zouxyversion1.02013-04-08聲明:1)該DeepLearning的學(xué)習(xí)系列是整理自網(wǎng)上很大牛和機(jī)器學(xué)習(xí)專家所無私奉獻(xiàn)的資料的。具體引用的資料請(qǐng)看參考文獻(xiàn)。具體的版本聲明也參考原文獻(xiàn)。2)本文僅供學(xué)術(shù)交流,非商用。所以每一部分具體的參考資料并沒有詳細(xì)對(duì)應(yīng)。如果某部分不小心侵犯了大家的利益,還望海涵,并聯(lián)系博主刪除。3)本人才疏學(xué)淺,整理總結(jié)的時(shí)候難免出錯(cuò),還望各位前輩不吝指正,謝謝。4)閱讀本文需要機(jī)器學(xué)習(xí)、計(jì)算機(jī)視覺、神經(jīng)網(wǎng)絡(luò)等等基礎(chǔ)(如果沒有也沒關(guān)系了,沒有就看看,能不能看懂,呵呵)。5)此屬于第一版本,若有錯(cuò)誤,還需繼續(xù)修正與增刪。還望大家多多指點(diǎn)。大家都共享一點(diǎn)點(diǎn),一起為祖國科研的推進(jìn)添磚加瓦(呵呵,好高尚的目標(biāo)啊)。請(qǐng)聯(lián)系:zouxy09@目錄:一、概述二、背景三、人腦視覺機(jī)理四、關(guān)于特征4.1、特征表示的粒度4.2、初級(jí)(淺層)特征表示4.3、結(jié)構(gòu)性特征表示4.4、需要有多少個(gè)特征?五、DeepLearning的基本思想六、淺層學(xué)習(xí)(ShallowLearning)和深度學(xué)習(xí)(DeepLearning)七、Deeplearning與NeuralNetwork八、Deeplearning訓(xùn)練過程8.1、傳統(tǒng)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練方法8.2、deeplearning訓(xùn)練過程九、DeepLearning的常用模型或者方法9.1、AutoEncoder自動(dòng)編碼器9.2、SparseCoding稀疏編碼9.3、RestrictedBoltzmannMachine(RBM)限制波爾茲曼機(jī)9.4、DeepBeliefNetworks深信度網(wǎng)絡(luò)9.5、ConvolutionalNeuralNetworks卷積神經(jīng)網(wǎng)絡(luò)十、總結(jié)與展望十一、參考文獻(xiàn)和DeepLearning學(xué)習(xí)資源接上9.5、ConvolutionalNeuralNetworks卷積神經(jīng)網(wǎng)絡(luò)卷積神經(jīng)網(wǎng)絡(luò)是人工神經(jīng)網(wǎng)絡(luò)的一種,已成為當(dāng)前語音分析和圖像識(shí)別領(lǐng)域的研究熱點(diǎn)。它的權(quán)值共享網(wǎng)絡(luò)結(jié)構(gòu)使之更類似于生物神經(jīng)網(wǎng)絡(luò),降低了網(wǎng)絡(luò)模型的復(fù)雜度,減少了權(quán)值的數(shù)量。該優(yōu)點(diǎn)在網(wǎng)絡(luò)的輸入是多維圖像時(shí)表現(xiàn)的更為明顯,使圖像可以直接作為網(wǎng)絡(luò)的輸入,避免了傳統(tǒng)識(shí)別算法中復(fù)雜的特征提取和數(shù)據(jù)重建過程。卷積網(wǎng)絡(luò)是為識(shí)別二維形狀而特殊設(shè)計(jì)的一個(gè)多層感知器,這種網(wǎng)絡(luò)結(jié)構(gòu)對(duì)平移、比例縮放、傾斜或者共他形式的變形具有高度不變性。CNNs是受早期的延時(shí)神經(jīng)網(wǎng)絡(luò)(TDNN)的影響。延時(shí)神經(jīng)網(wǎng)絡(luò)通過在時(shí)間維度上共享權(quán)值降低學(xué)習(xí)復(fù)雜度,適用于語音和時(shí)間序列信號(hào)的處理。CNNs是第一個(gè)真正成功訓(xùn)練多層網(wǎng)絡(luò)結(jié)構(gòu)的學(xué)習(xí)算法。它利用空間關(guān)系減少需要學(xué)習(xí)的參數(shù)數(shù)目以提高一般前向BP算法的訓(xùn)練性能。CNNs作為一個(gè)深度學(xué)習(xí)架構(gòu)提出是為了最小化數(shù)據(jù)的預(yù)處理要求。在CNN中,圖像的一小部分(局部感受區(qū)域)作為層級(jí)結(jié)構(gòu)的最低層的輸入,信息再依次傳輸?shù)讲煌膶?,每層通過一個(gè)數(shù)字濾波器去獲得觀測(cè)數(shù)據(jù)的最顯著的特征。這個(gè)方法能夠獲取對(duì)平移、縮放和旋轉(zhuǎn)不變的觀測(cè)數(shù)據(jù)的顯著特征,因?yàn)閳D像的局部感受區(qū)域允許神經(jīng)元或者處理單元可以訪問到最基礎(chǔ)的特征,例如定向邊緣或者角點(diǎn)。卷積神經(jīng)網(wǎng)絡(luò)的歷史1962年Hubei和Wiesel通過對(duì)貓視覺皮層細(xì)胞的研究,提出了感受野(receptivefield)的概念,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è)視覺模式分解成許多子模式(特征),然后進(jìn)入分層遞階式相連的特征平面進(jìn)行處理,它試圖將視覺系統(tǒng)模型化,使其能夠在即使物體有位移或輕微變形的時(shí)候,也能完成識(shí)別。通常神經(jīng)認(rèn)知機(jī)包含兩類神經(jīng)元,即承擔(dān)特征抽取的S-元和抗變形的C-元。S-元中涉及兩個(gè)重要參數(shù),即感受野與閾值參數(shù),前者確定輸入連接的數(shù)目,后者則控制對(duì)特征子模式的反應(yīng)程度。許多學(xué)者一直致力于提高神經(jīng)認(rèn)知機(jī)的性能的研究:在傳統(tǒng)的神經(jīng)認(rèn)知機(jī)中,每個(gè)S-元的感光區(qū)中由C-元帶來的視覺模糊量呈正態(tài)分布。如果感光區(qū)的邊緣所產(chǎn)生的模糊效果要比中央來得大,S-元將會(huì)接受這種非正態(tài)模糊所導(dǎo)致的更大的變形容忍性。我們希望得到的是,訓(xùn)練模式與變形刺激模式在感受野的邊緣與其中心所產(chǎn)生的效果之間的差異變得越來越大。為了有效地形成這種非正態(tài)模糊,F(xiàn)ukushima提出了帶雙C-元層的改進(jìn)型神經(jīng)認(rèn)知機(jī)。VanOoyen和Niehuis為提高神經(jīng)認(rèn)知機(jī)的區(qū)別能力引入了一個(gè)新的參數(shù)。事實(shí)上,該參數(shù)作為一種抑制信號(hào),抑制了神經(jīng)元對(duì)重復(fù)激勵(lì)特征的激勵(lì)。多數(shù)神經(jīng)網(wǎng)絡(luò)在權(quán)值中記憶訓(xùn)練信息。根據(jù)Hebb學(xué)習(xí)規(guī)則,某種特征訓(xùn)練的次數(shù)越多,在以后的識(shí)別過程中就越容易被檢測(cè)。也有學(xué)者將進(jìn)化計(jì)算理論與神經(jīng)認(rèn)知機(jī)結(jié)合,通過減弱對(duì)重復(fù)性激勵(lì)特征的訓(xùn)練學(xué)習(xí),而使得網(wǎng)絡(luò)注意那些不同的特征以助于提高區(qū)分能力。上述都是神經(jīng)認(rèn)知機(jī)的發(fā)展過程,而卷積神經(jīng)網(wǎng)絡(luò)可看作是神經(jīng)認(rèn)知機(jī)的推廣形式,神經(jīng)認(rèn)知機(jī)是卷積神經(jīng)網(wǎng)絡(luò)的一種特例。2)卷積神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)結(jié)構(gòu)卷積神經(jīng)網(wǎng)絡(luò)是一個(gè)多層的神經(jīng)網(wǎng)絡(luò),每層由多個(gè)二維平面組成,而每個(gè)平面由多個(gè)獨(dú)立神經(jīng)元組成。NNInputS20NNNInputS20N圖:卷積神經(jīng)網(wǎng)絡(luò)的概念示范:輸入圖像通過和三個(gè)可訓(xùn)練的濾波器和可加偏置進(jìn)行卷積,濾波過程如圖一,卷積后在C1層產(chǎn)生三個(gè)特征映射圖,然后特征映射圖中每組的四個(gè)像素再進(jìn)行求和,加權(quán)值,加偏置,通過一個(gè)Sigmoid函數(shù)得到三個(gè)S2層的特征映射圖。這些映射圖再進(jìn)過濾波得到C3層。這個(gè)層級(jí)結(jié)構(gòu)再和S2一樣產(chǎn)生S4。最終,這些像素值被光柵化,并連接成一個(gè)向量輸入到傳統(tǒng)的神經(jīng)網(wǎng)絡(luò),得到輸出。一般地,C層為特征提取層,每個(gè)神經(jīng)元的輸入與前一層的局部感受野相連,并提取該局部的特征,一旦該局部特征被提取后,它與其他特征間的位置關(guān)系也隨之確定下來;S層是特征映射層,網(wǎng)絡(luò)的每個(gè)計(jì)算層由多個(gè)特征映射組成,每個(gè)特征映射為一個(gè)平面,平面上所有神經(jīng)元的權(quán)值相等。特征映射結(jié)構(gòu)采用影響函數(shù)核小的sigmoid函數(shù)作為卷積網(wǎng)絡(luò)的激活函數(shù),使得特征映射具有位移不變性。此外,由于一個(gè)映射面上的神經(jīng)元共享權(quán)值,因而減少了網(wǎng)絡(luò)自由參數(shù)的個(gè)數(shù),降低了網(wǎng)絡(luò)參數(shù)選擇的復(fù)雜度。卷積神經(jīng)網(wǎng)絡(luò)中的每一個(gè)特征提取層(C-層)都緊跟著一個(gè)用來求局部平均與二次提取的計(jì)算層(S-層),這種特有的兩次特征提取結(jié)構(gòu)使網(wǎng)絡(luò)在識(shí)別時(shí)對(duì)輸入樣本有較高的畸變?nèi)萑棠芰Α?)關(guān)于參數(shù)減少與權(quán)值共享上面聊到,好像CNN一個(gè)牛逼的地方就在于通過感受野和權(quán)值共享減少了神經(jīng)網(wǎng)絡(luò)需要訓(xùn)練的參數(shù)的個(gè)數(shù)。那究竟是啥的呢?下圖左:如果我們有1000x1000像素的圖像,有1百萬個(gè)隱層神經(jīng)元,那么他們?nèi)B接的話(每個(gè)隱層神經(jīng)元都連接圖像的每一個(gè)像素點(diǎn)),就有1000x1000x1000000=10^2個(gè)連接,也就是10A12個(gè)權(quán)值參數(shù)。然而圖像的空間聯(lián)系是局部的,就像人是通過一個(gè)局部的感受野去感受外界圖像一樣,每一個(gè)神經(jīng)元都不需要對(duì)全局圖像做感受,每個(gè)神經(jīng)元只感受局部的圖像區(qū)域,然后在更高層,將這些感受不同局部的神經(jīng)元綜合起來就可以得到全局的信息了。這樣,我們就可以減少連接的數(shù)目,也就是減少神經(jīng)網(wǎng)絡(luò)需要訓(xùn)練的權(quán)值參數(shù)的個(gè)數(shù)了。如下圖

右:假如局部感受野是10x10,隱層每個(gè)感受野只需要和這10x10的局部圖像相連接,所以1百萬個(gè)隱層神經(jīng)元就只有一億個(gè)連接,即10"8個(gè)參數(shù)。比原來減少了四個(gè)0(數(shù)量級(jí)),這樣訓(xùn)練起來就沒那么費(fèi)力了,但還是感覺很多的啊,那還有啥辦法沒?Example:1000x1000IMhidcfenuh汁Example:1000x1000IMhidcfenuh汁w10*12porarMterstPFULLYCONNECTEDNEURALN6TSpatiaJcorrelationislocalBettertopurtrescurccselsewhere1E舛口叩怯;10051000rmajfiIMhiddenFiltersize:10x10SiOAZM100MparanwtergSiOAZM我們知道,隱含層的每一個(gè)神經(jīng)元都連接10x10個(gè)圖像區(qū)域,也就是說每一個(gè)神經(jīng)元存在10x10=100個(gè)連接權(quán)值參數(shù)。那如果我們每個(gè)神經(jīng)元這100個(gè)參數(shù)是相同的呢?也就是說每個(gè)神經(jīng)元用的是同一個(gè)卷積核去卷積圖像。這樣我們就只有多少個(gè)參數(shù)??只有100個(gè)參數(shù)?。。。∮H!不管你隱層的神經(jīng)元個(gè)數(shù)有多少,兩層間的連接我只有100個(gè)參數(shù)?。∮H!這就是權(quán)值共享?。∮H!這就是卷積神經(jīng)網(wǎng)絡(luò)的主打賣點(diǎn)??!親?。ㄓ悬c(diǎn)煩了,呵呵)也許你會(huì)問,這樣做靠譜嗎?為什么可行呢?這個(gè)……共同學(xué)習(xí)。好了,你就會(huì)想,這樣提取特征也忒不靠譜吧,這樣你只提取了一種特征???對(duì)了,真聰明,我們需要提取多種特征對(duì)不?假如一種濾波器,也就是一種卷積核就是提出圖像的一種特征,例如某個(gè)方向的邊緣。那么我們需要提取不同的特征,怎么辦,加多幾種濾波器不就行了嗎?

對(duì)了。所以假設(shè)我們加到100種濾波器,每種濾波器的參數(shù)不一樣,表示它提出輸入圖像的不同特征,例如不同的邊緣。這樣每種濾波器去卷積圖像就得到對(duì)圖像的不同特征的放映,我們稱之為FeatureMap。所以100種卷積核就有100個(gè)FeatureMap。這100個(gè)FeatureMap就組成了一層神經(jīng)元。到這個(gè)時(shí)候明了了吧。我們這一層有多少個(gè)參數(shù)了?100種卷積核x每種卷積核共享100個(gè)參數(shù)=100x100=10K,也就是1萬個(gè)參數(shù)。才1萬個(gè)參數(shù)??!親!(又來了,受不了了!)見下圖右:不同的顏色表達(dá)不同的濾波器。STXHONAfcrr;?Statistics'$imi:ar{(tdifferenttacotiqnsExample:iQQQx?QQQimogs1Mhiddenunit$Fiber$ije;STXHONAfcrr;?Statistics'$imi:ar{(tdifferenttacotiqnsExample:iQQQx?QQQimogs1Mhiddenunit$Fiber$ije;IOmLO1QQMparametersCONVOLUTIONALNETLearnmultiplefiltersE.g;IOOOxlQOOimagtJOOFiltersFiltersize:IDxlO]OKporamer&ri嘿喲,遺漏一個(gè)問題了。剛才說隱層的參數(shù)個(gè)數(shù)和隱層的神經(jīng)元個(gè)數(shù)無關(guān),只和濾波器的大小和濾波器種類的多少有關(guān)。那么隱層的神經(jīng)元個(gè)數(shù)怎么確定呢?它和原圖像,也就是輸入的大小(神經(jīng)元個(gè)數(shù))、濾波器的大小和濾波器在圖像中的滑動(dòng)步長(zhǎng)都有關(guān)!例如,我的圖像是1000x1000像素,而濾波器大小是10x10,假設(shè)濾波器沒有重疊,也就是步長(zhǎng)為10,這樣隱層的神經(jīng)元個(gè)數(shù)就是(1000x1000)/(10x10)=100x100個(gè)神經(jīng)元了,假設(shè)步長(zhǎng)是8,也就是卷積核會(huì)重疊兩個(gè)像素,那么……我就不算了,思想懂了就好。注意了,這只是一種濾

波器,也就是一個(gè)FeatureMap的神經(jīng)元個(gè)數(shù)哦,如果100個(gè)FeatureMap就是100倍了。由此可見,圖像越大,神經(jīng)元個(gè)數(shù)和需要訓(xùn)練的權(quán)值參數(shù)個(gè)數(shù)的貧富差距就越大。By?p£3oli巧尸(e.grHmaxcraveroge)fFlferatdifferentloeat>iom:w/e今cNnrobustrwL?T0rheexactsputiialJ^cotiqnoffeatures.CONVNETS:EXTENSIONS□verTHBy?p£3oli巧尸(e.grHmaxcraveroge)fFlferatdifferentloeat>iom:w/e今cNnrobustrwL?T0rheexactsputiialJ^cotiqnoffeatures.CONVNETS:EXTENSIONS□verTH芒y^ears1,E&m*廿左"m&duPaEhavepravetn+aheeffec+iwwhenpluggedintoMriv-wts:-12P&olmgJinyrJftnrj"i4PLacaEContrastNormaliz<iTion*1XdiYfJfiTig+ll需要注意的一點(diǎn)是,上面的討論都沒有考慮每個(gè)神經(jīng)元的偏置部分。所以權(quán)值個(gè)數(shù)需要加1。這個(gè)也是同一種濾波器共享的??傊?,卷積網(wǎng)絡(luò)的核心思想是將:局部感受野、權(quán)值共享(或者權(quán)值復(fù)制)以及時(shí)間或空間亞采樣這三種結(jié)構(gòu)思想結(jié)合起來獲得了某種程度的位移、尺度、形變不變性。4)一個(gè)典型的例子說明一種典型的用來識(shí)別數(shù)字的卷積網(wǎng)絡(luò)是LeNet-5(效果和paper等見這)。當(dāng)年美國大多數(shù)銀行就是用它來識(shí)別支票上面的手寫數(shù)字的。能夠達(dá)到這種商用的地步,它的準(zhǔn)確性可想而知。畢竟目前學(xué)術(shù)界和工業(yè)界的結(jié)合是最受爭(zhēng)議的。j^Layer-5Layer-3f*JJj^Layer-5Layer-3f*JJ/.ayer-7那下面咱們也用這個(gè)例子來說明下。那下面咱們也用這個(gè)例子來說明下。LeNet-5共有7層,不包含輸入,每層都包含可訓(xùn)練參數(shù)(連接權(quán)重)。輸入圖像為32*32大小。這要比Mnist數(shù)據(jù)庫(一個(gè)公認(rèn)的手寫數(shù)據(jù)庫)中最大的字母還大。這樣做的原因是希望潛在的明顯特征如筆畫斷電或角點(diǎn)能夠出現(xiàn)在最高層特征監(jiān)測(cè)子感受野的中心。我們先要明確一點(diǎn):每個(gè)層有多個(gè)FeatureMap,每個(gè)FeatureMap通過一種卷積濾波器提取輸入的一種特征,然后每個(gè)FeatureMap有多個(gè)神經(jīng)元。C1層是一個(gè)卷積層(為什么是卷積?卷積運(yùn)算一個(gè)重要的特點(diǎn)就是,通過卷積運(yùn)算,可以使原信號(hào)特征增強(qiáng),并且降低噪音),由6個(gè)特征圖FeatureMap構(gòu)成。特征圖中每個(gè)神經(jīng)元與輸入中5*5的鄰域相連。特征圖的大小為28*28,這樣能防止輸入的連接掉到邊界之外(是為了BP反饋時(shí)的計(jì)算,不致梯度損失,個(gè)人見解)。C1有156個(gè)可訓(xùn)練參數(shù)(每個(gè)濾波器5*5=25個(gè)unit參數(shù)和一個(gè)bias參數(shù),一共6個(gè)濾波器,共(5*5+1)*6=156個(gè)參數(shù)),共156*(28*28)=122,304個(gè)連接。S2層是一個(gè)下采樣層(為什么是下采樣?利用圖像局部相關(guān)性的原理,對(duì)圖像進(jìn)行子抽樣,可以減少數(shù)據(jù)處理量同時(shí)保留有用信息),有6個(gè)14*14的特征圖。特征圖中的每個(gè)單元與C1中相對(duì)應(yīng)特征圖的2*2鄰域相連接。S2層每個(gè)單元的4個(gè)輸入相加,乘以一個(gè)可訓(xùn)練參數(shù),再加上一個(gè)可訓(xùn)練偏置。結(jié)果通過sigmoid函數(shù)計(jì)算。可訓(xùn)練系數(shù)和偏置控制著sigmoid函數(shù)的非線性程度。如果系數(shù)比較小,那么運(yùn)算近似于線性運(yùn)算,亞采樣相當(dāng)于模糊圖像。如果系數(shù)比較大,根據(jù)偏置的大小亞采樣可以被看成是有噪聲的“或”運(yùn)算或者有噪聲的“與”運(yùn)算。每個(gè)單元的2*2感受野并不重疊,因此S2中每個(gè)特征圖的大小是C1中特征圖大小的1/4(行和列各1/2)oS2層有12個(gè)可訓(xùn)練參數(shù)和5880個(gè)連接。InputfXII2InputfXII2圖:卷積和子采樣過程:卷積過程包括:用一個(gè)可訓(xùn)練的濾波器f去卷X積一個(gè)輸入的圖像(第一階段是輸入的圖像,后面的階段就是卷積特征map了),然后加一個(gè)偏置b,得到卷積層C。子采樣過程包括:每XX鄰域四個(gè)像素求和變?yōu)橐粋€(gè)像素,然后通過標(biāo)量Wx+1加權(quán),再增加偏x+1置bx+1,然后通過一個(gè)sigmoid激活函數(shù),產(chǎn)生一個(gè)大概縮小四倍的特征映射圖Sx+1。x+1所以從一個(gè)平面到下一個(gè)平面的映射可以看作是作卷積運(yùn)算,S-層可看作是模糊濾波器,起到二次特征提取的作用。隱層與隱層之間空間分辨率遞減,而每層所含的平面數(shù)遞增,這樣可用于檢測(cè)更多的特征信息。C3層也是一個(gè)卷積層,它同樣通過5x5的卷積核去卷積層S2,然后得到的特征map就只有10x10個(gè)神經(jīng)元,但是它有16種不同的卷積核,所以就存在16個(gè)特征map了。這里需要注意的一點(diǎn)是:C3中的每個(gè)特征map是連接到S2中的所有6個(gè)或者幾個(gè)特征map的,表示本層的特征map是上一層提取到的特征map的不同組合(這個(gè)做法也并不是唯一的)。(看到?jīng)]有,這里是組合,就像之前聊到的人的視覺系統(tǒng)一樣,底層的結(jié)構(gòu)構(gòu)成上層更抽象的結(jié)構(gòu),例如邊緣構(gòu)成形狀或者目標(biāo)的部分)。剛才說C3中每個(gè)特征圖由S2中所有6個(gè)或者幾個(gè)特征map組合而成。為什么不把S2中的每個(gè)特征圖連接到每個(gè)C3的特征圖呢?原因有2點(diǎn)。第一,不完全的連接機(jī)制將連接的數(shù)量保持在合理的范圍內(nèi)。第二,也是最重要的,其破壞了網(wǎng)絡(luò)的對(duì)稱性。由于不同的特征圖有不同的輸入,所以迫使他們抽取不同的特征(希望是互補(bǔ)的)。例如,存在的一個(gè)方式是:C3的前6個(gè)特征圖以S2中3個(gè)相鄰的特征圖子集為輸入。接下來6個(gè)特征圖以S2中4個(gè)相鄰特征圖子集為輸入。然后的3個(gè)以不相鄰的4個(gè)特征圖子集為輸入。最后一個(gè)將S2中所有特征圖為輸入。這樣C3層有1516個(gè)可訓(xùn)練參數(shù)和151600個(gè)連接。S4層是一個(gè)下采樣層,由16個(gè)5*5大小的特征圖構(gòu)成。特征圖中的每個(gè)單元與C3中相應(yīng)特征圖的2*2鄰域相連接,跟C1和S2之間的連接一樣。S4層有32個(gè)可訓(xùn)練參數(shù)(每個(gè)特征圖1個(gè)因子和一個(gè)偏置)和2000個(gè)連接。C5層是一個(gè)卷積層,有120個(gè)特征圖。每個(gè)單元與S4層的全部16個(gè)單元的5*5鄰域相連。由于S4層特征圖的大小也為5*5(同濾波器一樣),故C5特征圖的大小為1*1:這構(gòu)成了S4和C5之間的全連接。之所以仍將C5標(biāo)示為卷積層而非全相聯(lián)層,是因?yàn)槿绻鸏eNet-5的輸入變大,而其他的保持不變,那么此時(shí)特征圖的維數(shù)就會(huì)比1*1大。C5層有48120個(gè)可訓(xùn)練連接。F6層有84個(gè)單元(之所以選這個(gè)數(shù)字的原因來自于輸出層的設(shè)計(jì)),與C5層全相連。有10164個(gè)可訓(xùn)練參數(shù)。如同經(jīng)典神經(jīng)網(wǎng)絡(luò),F(xiàn)6層計(jì)算輸入向量和權(quán)重向量之間的點(diǎn)積,再加上一個(gè)偏置。然后將其傳遞給sigmoid函數(shù)產(chǎn)生單元i的一個(gè)狀態(tài)。最后,輸出層由歐式徑向基函數(shù)(EuclideanRadialBasisFunction)單元組成,每類一個(gè)單元,每個(gè)有84個(gè)輸入。換句話說,每個(gè)輸出RBF單元計(jì)算輸入向量和參數(shù)向量之間的歐式距離。輸入離參數(shù)向量越遠(yuǎn),RBF輸出的越大。一個(gè)RBF輸出可以被理解為衡量輸入模式和與RBF相關(guān)聯(lián)類的一個(gè)模型的匹配程度的懲罰項(xiàng)。用概率術(shù)語來說,RBF輸出可以被理解為F6層配置空間的高斯分布的負(fù)log-likelihood。給定一個(gè)輸入模式,損失函數(shù)應(yīng)能使得F6的配置與RBF參數(shù)向量(即模式的期望分類)足夠接近。這些單元的參數(shù)是人工選取并保持固定的(至少初始時(shí)候如此)。這些參數(shù)向量的成分被設(shè)為-1或1。雖然這些參數(shù)可以以-1和1等概率的方式任選,或者構(gòu)成一個(gè)糾錯(cuò)碼,但是被設(shè)計(jì)成一個(gè)相應(yīng)字符類的7*12大?。?4)的格式化圖片。這種表示對(duì)識(shí)別單獨(dú)的數(shù)字不是很有用,但是對(duì)識(shí)別可打印ASCII集中的字符串很有用。使用這種分布編碼而非更常用的“1ofN”編碼用于產(chǎn)生輸出的另一個(gè)原因是,當(dāng)類別比較大的時(shí)候,非分布編碼的效果比較差。原因是大多數(shù)時(shí)間非分布編碼的輸出必須為0。這使得用sigmoid單元很難實(shí)現(xiàn)。另一個(gè)原因是分類器不僅用于識(shí)別字母,也用于拒絕非字母。使用分布編碼的RBF更適合該目標(biāo)。因?yàn)榕csigmoid不同,他們?cè)谳斎肟臻g的較好限制的區(qū)域內(nèi)興奮,而非典型模式更容易落到外邊。RBF參數(shù)向量起著F6層目標(biāo)向量的角色。需要指出這些向量的成分是+1或-1,這正好在F6sigmoid的范圍內(nèi),因此可以防止sigmoid函數(shù)飽和。實(shí)際上,+1和-1是sigmoid函數(shù)的最大彎曲的點(diǎn)處。這使得F6單元運(yùn)行在最大非線性范圍內(nèi)。必須避免sigmoid函數(shù)的飽和,因?yàn)檫@將會(huì)導(dǎo)致?lián)p失函數(shù)較慢的收斂和病態(tài)問題。5)訓(xùn)練過程神經(jīng)網(wǎng)絡(luò)用于模式識(shí)別的主流是有指導(dǎo)學(xué)習(xí)網(wǎng)絡(luò),無指導(dǎo)學(xué)習(xí)網(wǎng)絡(luò)更多的是用于聚類分析。對(duì)于有指導(dǎo)的模式識(shí)別,由于任一樣本的類別是已知的,樣本在空間的分布不再是依據(jù)其自然分布傾向來劃分,而是要根據(jù)同類樣本在空間的分布及不同類樣本之間的分離程度找一種適當(dāng)?shù)目臻g劃分方法,或者找到一個(gè)分類邊界,使得不同類樣本分別位于不同的區(qū)域內(nèi)。這就需要一個(gè)長(zhǎng)時(shí)間且復(fù)雜的學(xué)習(xí)過程,不斷調(diào)整用以劃分樣本空間的分類邊界的位置,使盡可能少的樣本被劃分到非同類區(qū)域中。卷積網(wǎng)絡(luò)在本質(zhì)上是一種輸入到輸出的映射,它能夠?qū)W習(xí)大量的輸入與輸出之間的映射關(guān)系,而不需要任何輸入和輸出之間的精確的數(shù)學(xué)表達(dá)式,只要用已知的模式對(duì)卷積網(wǎng)絡(luò)加以訓(xùn)練,網(wǎng)絡(luò)就具有輸入輸出對(duì)之間的映射能力。卷積網(wǎng)絡(luò)執(zhí)行的是有導(dǎo)師訓(xùn)練,所以其樣本集是由形如:(輸入向量,理想輸出向量)的向量對(duì)構(gòu)成的。所有這些向量對(duì),都應(yīng)該是來源于網(wǎng)絡(luò)即將模擬的系統(tǒng)的實(shí)際“運(yùn)行”結(jié)果。它們可以是從實(shí)際運(yùn)行系統(tǒng)中采集來的。在開始訓(xùn)練前,所有的權(quán)都應(yīng)該用一些不同的小隨機(jī)數(shù)進(jìn)行初始化?!靶‰S機(jī)數(shù)”用來保證網(wǎng)絡(luò)不會(huì)因權(quán)值過大而進(jìn)入飽和狀態(tài),從而導(dǎo)致訓(xùn)練失??;“不同”用來保證網(wǎng)絡(luò)可以正常地學(xué)習(xí)。實(shí)際上,如果用相同的數(shù)去初始化權(quán)矩陣,則網(wǎng)絡(luò)無能力學(xué)習(xí)。訓(xùn)練算法與傳統(tǒng)的BP算法差不多。主要包括4步,這4步被分為兩個(gè)階段:第一階段,向前傳播階段:a)從樣本集中取一個(gè)樣本(X,Yp),將X輸入網(wǎng)絡(luò);b)計(jì)算相應(yīng)的實(shí)際輸出Op。在此階段,信息從輸入層經(jīng)過逐級(jí)的變換,傳送到輸出層。這個(gè)過程也是網(wǎng)絡(luò)在完成訓(xùn)練后正常運(yùn)行時(shí)執(zhí)行的過程。在此過程中,網(wǎng)絡(luò)執(zhí)行的是計(jì)算(實(shí)際上就是輸入與每層的權(quán)值矩陣相點(diǎn)乘,得到最后的輸出結(jié)果):O=F(…(F(F(XW(1))W(2))…)W(n))pn21p第二階段,向后傳播階段a)算實(shí)際輸出Op與相應(yīng)的理想輸出Yp的差;b)按極小化誤差的方法反向傳播調(diào)整權(quán)矩陣。6)卷積神經(jīng)網(wǎng)絡(luò)的優(yōu)點(diǎn)卷積神經(jīng)網(wǎng)絡(luò)CNN主要用來識(shí)別位移、縮放及其他形式扭曲不變性的二維圖形。由于CNN的特征檢測(cè)層通過訓(xùn)練數(shù)據(jù)進(jìn)行學(xué)習(xí),所以在使用CNN時(shí),避免了顯式的特征抽取,而隱式地從訓(xùn)練數(shù)據(jù)中進(jìn)行學(xué)習(xí);再者由于同一特征映射面上的神經(jīng)元權(quán)值相同,所以網(wǎng)絡(luò)可以并行學(xué)習(xí),這也是卷積網(wǎng)絡(luò)相對(duì)于神經(jīng)元彼此相連網(wǎng)絡(luò)的一大優(yōu)勢(shì)。卷積神經(jīng)網(wǎng)絡(luò)以其局部權(quán)值共享的特殊結(jié)構(gòu)在語音識(shí)別和圖像處理方面有著獨(dú)特的優(yōu)越性,其布局更接近于實(shí)際的生物神經(jīng)網(wǎng)絡(luò),權(quán)值共享降低了網(wǎng)絡(luò)的復(fù)雜性,特別是多維輸入向量的圖像可以直接輸入網(wǎng)絡(luò)這一特點(diǎn)避免了特征提取和分類過程中數(shù)據(jù)重建的復(fù)雜度。流的分類方式幾乎都是基于統(tǒng)計(jì)特征的,這就意味著在進(jìn)行分辨前必須提取某些特征。然而,顯式的特征提取并不容易,在一些應(yīng)用問題中也并非總是可靠的。卷積神經(jīng)網(wǎng)絡(luò),它避免了顯式的特征取樣,隱式地從訓(xùn)練數(shù)據(jù)中進(jìn)行學(xué)習(xí)。這使得卷積神經(jīng)網(wǎng)絡(luò)明顯有別于其他基于神經(jīng)網(wǎng)絡(luò)的分類器,通過結(jié)構(gòu)重組和減少權(quán)值將特征提取功能融合進(jìn)多層感知器。它可以直接處理灰度圖片,能夠直接用于處理基于圖像的分類。卷積網(wǎng)絡(luò)較一般神經(jīng)網(wǎng)絡(luò)在圖像處理方面有如下優(yōu)點(diǎn):a)輸入圖像和網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)能很好的吻合;b)特征提取和模式分類同時(shí)進(jìn)行,并同時(shí)在訓(xùn)練中產(chǎn)生;c)權(quán)重共享可以減少網(wǎng)絡(luò)的訓(xùn)練參數(shù),使神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)變得更簡(jiǎn)單,適應(yīng)性更強(qiáng)。7)小結(jié)CNNs中這種層間聯(lián)系和空域信息的緊密關(guān)系,使其適于圖像處理和理解。而且,其在自動(dòng)提取圖像的顯著特征方面還表現(xiàn)出了比較優(yōu)的性能。在一些例子當(dāng)中,Gabor濾波器已經(jīng)被使用在一個(gè)初始化預(yù)處理的步驟中,以達(dá)到模擬人類視覺系統(tǒng)對(duì)視覺刺激的響應(yīng)。在目前大部分的工作中,研究者將CNNs應(yīng)用到了多種機(jī)器學(xué)習(xí)問題中,包括人臉識(shí)別,文檔分析和語言檢測(cè)等。為了達(dá)到尋找視頻中幀與幀之間的相干性的目的,目前CNNs通過一個(gè)時(shí)間相干性去訓(xùn)練,但這個(gè)不是CNNs特有的。呵呵,這部分講得太啰嗦了,又沒講到點(diǎn)上。沒辦法了,先這樣的,這樣這個(gè)過程我還沒有走過,所以自己水平有限啊,望各位明察。需要后面再改了,呵呵。轉(zhuǎn)自:/zouxy09/article/details/8781543DeepLearning論文筆記之(四)CNN卷積神經(jīng)網(wǎng)絡(luò)推導(dǎo)和實(shí)現(xiàn)DeepLearning論文筆記之(四)CNN卷積神經(jīng)網(wǎng)絡(luò)推導(dǎo)和實(shí)現(xiàn)zouxy09@/zouxy09自己平時(shí)看了一些論文,但老感覺看完過后就會(huì)慢慢的淡忘,某一天重新拾起來的時(shí)候又好像沒有看過一樣。所以想習(xí)慣地把一些感覺有用的論文中的知識(shí)點(diǎn)總結(jié)整理一下,一方面在整理過程中,自己的理解也會(huì)更深,另一方面也方便未來自己的勘察。更好的還可以放到博客上面與大家交流。因?yàn)榛A(chǔ)有限,所以對(duì)論文的一些理解可能不太正確,還望大家不吝指正交流,謝謝。本文的論文來自:NotesonConvolutionalNeuralNetworks,JakeBouvrie。這個(gè)主要是CNN的推導(dǎo)和實(shí)現(xiàn)的一些筆記,再看懂這個(gè)筆記之前,最好具有CNN的一些基礎(chǔ)。這里也先列出一個(gè)資料供參考:DeepLearning(深度學(xué)習(xí))學(xué)習(xí)筆記整理系列之(七)LeNet-5,convolutionalneuralnetworks卷積神經(jīng)網(wǎng)絡(luò)NeuralNetworkforRecognitionofHandwrittenDigitsDeeplearning:三十八(StackedCNN簡(jiǎn)單介紹)Gradient-basedlearningappliedtodocumentrecognition.Imagenetclassificationwithdeepconvolutionalneuralnetworks.⑻UFLDL中的“卷積特征提取”和“池化”。另外,這里有個(gè)matlab的DeepLearning的toolbox,里面包含了CNN的代碼,在下一個(gè)博文中,我將會(huì)詳細(xì)注釋這個(gè)代碼。這個(gè)筆記對(duì)這個(gè)代碼的理解非常重要。下面是自己對(duì)其中的一些知識(shí)點(diǎn)的理解:《NotesonConvolutionalNeuralNetw》orks一、介紹這個(gè)文檔討論的是CNNs的推導(dǎo)和實(shí)現(xiàn)。CNN架構(gòu)的連接比權(quán)值要多很多,這實(shí)際上就隱含著實(shí)現(xiàn)了某種形式的規(guī)則化。這種特別的網(wǎng)絡(luò)假定了我們希望通過數(shù)據(jù)驅(qū)動(dòng)的方式學(xué)習(xí)到一些濾波器,作為提取輸入的特征的一種方法。本文中,我們先對(duì)訓(xùn)練全連接網(wǎng)絡(luò)的經(jīng)典BP算法做一個(gè)描述,然后推導(dǎo)2DCNN網(wǎng)絡(luò)的卷積層和子采樣層的BP權(quán)值更新方法。在推導(dǎo)過程中,我們更強(qiáng)調(diào)實(shí)現(xiàn)的效率,所以會(huì)給出一些Matlab代碼。最后,我們轉(zhuǎn)向討論如何自動(dòng)地學(xué)習(xí)組合前一層的特征maps,特別地,我們還學(xué)習(xí)特征maps的稀疏組合。二、全連接的反向傳播算法典型的CNN中,開始幾層都是卷積和下采樣的交替,然后在最后一些層(靠近輸出層的),都是全連接的一維網(wǎng)絡(luò)。這時(shí)候我們已經(jīng)將所有兩維2D的特征maps轉(zhuǎn)化為全連接的一維網(wǎng)絡(luò)的輸入。這樣,當(dāng)你準(zhǔn)備好將最終的2D特征maps輸入到1D網(wǎng)絡(luò)中時(shí),一個(gè)非常方便的方法就是把所有輸出的特征maps連接成一個(gè)長(zhǎng)的輸入向量。然后我們回到BP算法的討論。(更詳細(xì)的基礎(chǔ)推導(dǎo)可以參考UFLDL中“反向傳導(dǎo)算法”)。2.1、FeedforwardPass前向傳播在下面的推導(dǎo)中,我們采用平方誤差代價(jià)函數(shù)。我們討論的是多類問題,共c類,共N個(gè)訓(xùn)練樣本。NcEJ二工工陵一玻尺Tl=lk=l這里.表示第n個(gè)樣本對(duì)應(yīng)的標(biāo)簽的第k維。負(fù):|表示第n個(gè)樣本對(duì)應(yīng)的網(wǎng)絡(luò)輸出的第k個(gè)輸出。對(duì)于多類問題,輸出一般組織為“one-of-c”的形式,也就是只有該輸入對(duì)應(yīng)的類的輸出節(jié)點(diǎn)輸出為正,其他類的位或者節(jié)點(diǎn)為0或者負(fù)數(shù),這個(gè)取決于你輸出層的激活函數(shù)。sigmoid就是0,tanh就是-1.因?yàn)樵谌坑?xùn)練集上的誤差只是每個(gè)訓(xùn)練樣本的誤差的總和,所以這里我們先考慮對(duì)于一個(gè)樣本的BP。對(duì)于第n個(gè)樣本的誤差,表示為:傳統(tǒng)的全連接神經(jīng)網(wǎng)絡(luò)中,我們需要根據(jù)BP規(guī)則計(jì)算代價(jià)函數(shù)E關(guān)于網(wǎng)絡(luò)每一個(gè)權(quán)值的偏導(dǎo)數(shù)。我們用l來表示當(dāng)前層,那么當(dāng)前層的輸出可以表示為:=f(dhwithi?==Wrx>_1十b"輸出激活函數(shù)f(.)可以有很多種,一般是sigmoid函數(shù)或者雙曲線正切函數(shù)。sigmoid將輸出壓縮到[0,1],所以最后的輸出平均值一般趨于0。所以如果將我們的訓(xùn)練數(shù)據(jù)歸一化為零均值和方差為1,可以在梯度下降的過程中增加收斂性。對(duì)于歸一化的數(shù)據(jù)集來說,雙曲線正切函數(shù)也是不錯(cuò)的選擇。2.2、BackpropagationPass反向傳播反向傳播回來的誤差可以看做是每個(gè)神經(jīng)元的基的靈敏度sensitivities(靈敏度的意思就是我們的基b變化多少,誤差會(huì)變化多少,也就是誤差對(duì)基的變化率,也就是導(dǎo)數(shù)了),定義如下:(第二個(gè)等號(hào)是根據(jù)求導(dǎo)的鏈?zhǔn)椒▌t得到的)dEdEdur==odbdudb因?yàn)閐u/db=1,所以dE/db二dE/du=6,也就是說bias基的靈敏度dE/db=6和誤差E對(duì)一個(gè)節(jié)點(diǎn)全部輸入u的導(dǎo)數(shù)dE/du是相等的。這個(gè)導(dǎo)數(shù)就是讓高層誤差反向傳播到底層的神來之筆。反向傳播就是用下面這條關(guān)系式:(下面這條式子表達(dá)的就是第l層的靈敏度,就是)-''「U公式(])這里的“”表示每個(gè)元素相乘。輸出層的神經(jīng)元的靈敏度是不一樣的:5L=//(uI)o(y--e).最后,對(duì)每個(gè)神經(jīng)元運(yùn)用delta(即6)規(guī)則進(jìn)行權(quán)值更新。具體來說就是,對(duì)一個(gè)給定的神經(jīng)元,得到它的輸入,然后用這個(gè)神經(jīng)元的delta(即6)來進(jìn)行縮放。用向量的形式表述就是,對(duì)于第I層,誤差對(duì)于該層每一個(gè)權(quán)值(組合為矩陣)的導(dǎo)數(shù)是該層的輸入(等于上一層的輸出)與該層的靈敏度(該層每個(gè)神經(jīng)元的6組合成一個(gè)向量的形式)的叉乘。然后得到的偏導(dǎo)數(shù)乘以一個(gè)負(fù)學(xué)習(xí)率就是該層的神經(jīng)元的權(quán)值的更新了:對(duì)于bias基的更新表達(dá)式差不多。實(shí)際上,對(duì)于每一個(gè)權(quán)值(Wh都有一個(gè)特定的學(xué)習(xí)率血。三、ConvolutionalNeuralNetworks卷積神經(jīng)網(wǎng)絡(luò)3?1、ConvolutionLayers卷積層我們現(xiàn)在關(guān)注網(wǎng)絡(luò)中卷積層的BP更新。在一個(gè)卷積層,上一層的特征maps被一個(gè)可學(xué)習(xí)的卷積核進(jìn)行卷積,然后通過一個(gè)激活函數(shù),就可以得到輸出特征map。每一個(gè)輸出map可能是組合卷積多個(gè)輸入maps的值:驗(yàn)=f(E疔】*峪+眄)XiEA/j/這里叫表示選擇的輸入maps的集合,那么到底選擇哪些輸入maps呢?有選擇一對(duì)的或者三個(gè)的。但下面我們會(huì)討論如何去自動(dòng)選擇需要組合的特征maps。每一個(gè)輸出map會(huì)給一個(gè)額外的偏置b,但是對(duì)于一個(gè)特定的輸出map,卷積每個(gè)輸入maps的卷積核是不一樣的。也就是說,如果輸出特征mapj和輸出特征mapk都是從輸入mapi中卷積求和得到,那么對(duì)應(yīng)的卷積核是不一樣的。3.1.1、ComputingtheGradients梯度計(jì)算我們假定每個(gè)卷積層l都會(huì)接一個(gè)下采樣層1+1。對(duì)于BP來說,根據(jù)上文我們知道,要想求得層l的每個(gè)神經(jīng)元對(duì)應(yīng)的權(quán)值的權(quán)值更新,就需要先求層I的每一個(gè)神經(jīng)節(jié)點(diǎn)的靈敏度6(也就是權(quán)值更新的公式(2))。為了求這個(gè)靈敏度我們就需要先對(duì)下一層的節(jié)點(diǎn)(連接到當(dāng)前層I的感興趣節(jié)點(diǎn)的第I+1層的節(jié)點(diǎn))的靈敏度求和(得到61+1),然后乘以這些連接對(duì)應(yīng)的權(quán)值(連接第I層感興趣節(jié)點(diǎn)和第I+1層節(jié)點(diǎn)的權(quán)值)W。再乘以當(dāng)前層I的該神經(jīng)元節(jié)點(diǎn)的輸入u的激活函數(shù)f的導(dǎo)數(shù)值(也就是那個(gè)靈敏度反向傳播的公式(1)的61的求解),這樣就可以得到當(dāng)前層I每個(gè)神經(jīng)節(jié)點(diǎn)對(duì)應(yīng)的靈敏度61了。然而,因?yàn)橄虏蓸拥拇嬖?,采樣層的一個(gè)像素(神經(jīng)元節(jié)點(diǎn))對(duì)應(yīng)的靈敏度6對(duì)應(yīng)于卷積層(上一層)的輸出map的一塊像素(采樣窗口大?。?。因此,層I中的一個(gè)map的每個(gè)節(jié)點(diǎn)只與1+1層中相應(yīng)map的一個(gè)節(jié)點(diǎn)連接。為了有效計(jì)算層I的靈敏度,我們需要上采樣upsampIe這個(gè)下采樣downsample層對(duì)應(yīng)的靈敏度map(特征map中每個(gè)像素對(duì)應(yīng)一個(gè)靈敏度,所以也組成一個(gè)map),這樣才使得這個(gè)靈敏度map大小與卷積層的map大小一致,然后再將層l的map的激活值的偏導(dǎo)數(shù)與從第l+1層的上采樣得到的靈敏度map逐元素相乘(也就是公式(1)。在下采樣層map的權(quán)值都取一個(gè)相同值B,而且是一個(gè)常數(shù)。所以我們只需要將上一個(gè)步驟得到的結(jié)果乘以一個(gè)P就可以完成第I層靈敏度6的計(jì)算。我們可以對(duì)卷積層中每一個(gè)特征mapj重復(fù)相同的計(jì)算過程。但很明顯需要匹配相應(yīng)的子采樣層的map(參考公式(1))up(.)表示一個(gè)上采樣操作。如果下采樣的采樣因子是n的話,它簡(jiǎn)單的將每個(gè)像素水平和垂直方向上拷貝n次。這樣就可以恢復(fù)原來的大小了。實(shí)際上,這個(gè)函數(shù)可以用Kronecker乘積來實(shí)現(xiàn):=X?lnXfl.好,到這里,對(duì)于一個(gè)給定的map,我們就可以計(jì)算得到其靈敏度map了。然后我們就可以通過簡(jiǎn)單的對(duì)層I中的靈敏度map中所有節(jié)點(diǎn)進(jìn)行求和快速的計(jì)算bias基的梯度了:最后,對(duì)卷積核的權(quán)值的梯度就可以用BP算法來計(jì)算了(公式(2)。另外,很多連接的權(quán)值是共享的,因此,對(duì)于一個(gè)給定的權(quán)值,我們需要對(duì)所有與該權(quán)值有聯(lián)系(權(quán)值共享的連接)的連接對(duì)該點(diǎn)求梯度,然后對(duì)這些梯度進(jìn)行求和,就像上面對(duì)bias基的梯度計(jì)算一樣:這里,’化"是心中的在卷積的時(shí)候與‘7逐元素相乘的patch,輸出卷積map的(u,v)位置的值是由上一層的(u,v)位置的patch與卷積核k_ij逐元素相乘的結(jié)果。咋一看,好像我們需要煞費(fèi)苦心地記住輸出map(和對(duì)應(yīng)的靈敏度map)每個(gè)像素對(duì)應(yīng)于輸入map的哪個(gè)patch。但實(shí)際上,在Matlab中,可以通過一個(gè)代碼就實(shí)現(xiàn)。對(duì)于上面的公式,可以用Matlab的卷積函數(shù)來實(shí)現(xiàn):耳廠—rotl80(conv2(x^_\roti80(gli刖)我們先對(duì)delta靈敏度map進(jìn)行旋轉(zhuǎn),這樣就可以進(jìn)行互相關(guān)計(jì)算,而不是卷積(在卷積的數(shù)學(xué)定義中,特征矩陣(卷積核)在傳遞給conv2時(shí)需要先翻轉(zhuǎn)(flipped)一下。也就是顛倒下特征矩陣的行和列)。然后把輸出反旋轉(zhuǎn)回來,這樣我們?cè)谇跋騻鞑ミM(jìn)行卷積的時(shí)候,卷積核才是我們想要的方向。3.2、Sub-samplingLayers子采樣層對(duì)于子采樣層來說,有N個(gè)輸入maps,就有N個(gè)輸出maps,只是每個(gè)輸出map都變小了。down(.)表示一個(gè)下采樣函數(shù)。典型的操作一般是對(duì)輸入圖像的不同nxn的塊的所有像素進(jìn)行求和。這樣輸出圖像在兩個(gè)維度上都縮小了n倍。每個(gè)輸出map都對(duì)應(yīng)一個(gè)屬于自己的乘性偏置P和一個(gè)加性偏置bo3.2.1、ComputingtheGradients梯度計(jì)算這里最困難的是計(jì)算靈敏度map。一旦我們得到這個(gè)了,那我們唯一需要更新的偏置參數(shù)P和b就可以輕而易舉了(公式(3))o如果下一個(gè)卷積層與這個(gè)子采樣層是全連接的,那么就可以通過BP來計(jì)算子采樣層的靈敏度mapso我們需要計(jì)算卷積核的梯度,所以我們必須找到輸入map中哪個(gè)patch對(duì)應(yīng)輸出map的哪個(gè)像素。這里,就是必須找到當(dāng)前層的靈敏度map中哪個(gè)patch對(duì)應(yīng)與下一層的靈敏度map的給定像素,這樣才可以利用公式(1)那樣的6遞推,也就是靈敏度反向傳播回來。另外,需要乘以輸入patch與輸出像素之間連接的權(quán)值,這個(gè)權(quán)值實(shí)際上就是卷積核的權(quán)值(已旋轉(zhuǎn)的)。d;=oconv2(tfj+1,rotl3O(kj+1),在這之前,我們需要先將核旋轉(zhuǎn)一下,讓卷積函數(shù)可以實(shí)施互相關(guān)計(jì)算。另外,我們需要對(duì)卷積邊界進(jìn)行處理,但在Matlab里面,就比較容易處理。Matlab中全卷積會(huì)對(duì)缺少的輸入像素補(bǔ)0。到這里,我們就可以對(duì)b和B計(jì)算梯度了。首先,加性基b的計(jì)算和上面卷積層的一樣,對(duì)靈敏度map中所有元素加起來就可以了:而對(duì)于乘性偏置B,因?yàn)樯婕暗搅嗽谇跋騻鞑ミ^程中下采樣map的計(jì)算,所以我們最好在前向的過程中保存好這些maps,這樣在反向的計(jì)算中就不用重新計(jì)算了。我們定義:d;—down(~1)、這樣,對(duì)p的梯度就可以用下面的方式計(jì)算:3?3、LearningCombinationsofFeatureMaps學(xué)習(xí)特征map的組合大部分時(shí)候,通過卷積多個(gè)輸入maps,然后再對(duì)這些卷積值求和得到一個(gè)輸出map,這樣的效果往往是比較好的。在一些文獻(xiàn)中,一般是人工選擇哪些輸入maps去組合得到一個(gè)輸出map。但我們這里嘗試去讓CNN在訓(xùn)練的過程中學(xué)習(xí)這些組合,也就是讓網(wǎng)絡(luò)自己學(xué)習(xí)挑選哪些輸入maps來計(jì)算得到輸出map才是最好的。我們用aij表示在得到第j個(gè)輸出map的其中第i個(gè)輸入map的權(quán)值或者貢獻(xiàn)。這樣,第j個(gè)輸出map可以表示為:

需要滿足約束:這些對(duì)變量aij的約束可以通過將變量aij表示為一個(gè)組無約束的隱含權(quán)值c..的softmax函數(shù)來加強(qiáng)。因?yàn)閟oftmax的因變量是自變量的指ij數(shù)函數(shù),他們的變化率會(huì)不同)。exp(Cij)因?yàn)閷?duì)于一個(gè)固定的j來說,每組權(quán)值c.j都是和其他組的權(quán)值獨(dú)立的,所以為了方面描述,我們把下標(biāo)j去掉,只考慮一個(gè)map的更新,其他map的更新是一樣的過程,只是map的索引j不同而已。Softmax函數(shù)的導(dǎo)數(shù)表示為:這里的6是Kroneckerdelta。對(duì)于誤差對(duì)于第l層變量ai的導(dǎo)數(shù)為:最后就可以通過鏈?zhǔn)揭?guī)則去求得代價(jià)函數(shù)關(guān)于權(quán)值c.的偏導(dǎo)數(shù)了:i

3.3.1、EnforcingSparseCombinations加強(qiáng)稀疏性組合為了限制a是稀疏的,也就是限制一個(gè)輸出map只與某些而不是全部的輸入maps相連。我們?cè)谡w代價(jià)函數(shù)里增加稀疏約束項(xiàng)Q(a)。對(duì)于單個(gè)樣本,重寫代價(jià)函數(shù)為:Q=+>工血然后尋找這個(gè)規(guī)則化約束項(xiàng)對(duì)權(quán)值ci求導(dǎo)的貢獻(xiàn)。規(guī)則化項(xiàng)Q(a)對(duì)ai求導(dǎo)是:然后,通過鏈?zhǔn)椒▌t,對(duì)ci的求導(dǎo)是:旳_廠dak所以,權(quán)值ci最后的梯度是:QEn_0EncJQdcidci+dci3.4、MakingitFastwithMATLABCNN的訓(xùn)練主要是在卷積層和子采樣層的交互上,其主要的計(jì)算瓶頸是:前向傳播過程:下采樣每個(gè)卷積層的maps;反向傳播過程:上采樣高層子采樣層的靈敏度map,以匹配底層的卷積層輸出maps的大小;sigmoid的運(yùn)用和求導(dǎo)。對(duì)于第一和第二個(gè)問題,我們考慮的是如何用Matlab內(nèi)置的圖像處理函數(shù)去實(shí)現(xiàn)上采樣和下采樣的操作。對(duì)于上采樣,imresize函數(shù)可以搞定,但需要很大的開銷。一個(gè)比較快速的版本是使用Kronecker乘積函數(shù)kron。通過一個(gè)全一矩陣ones來和我們需要上采樣的矩陣進(jìn)行Kronecker乘積,就可以實(shí)現(xiàn)上采樣的效果。對(duì)于前向傳播過程中的下采樣,imresize并沒有提供在縮小圖像的過程中還計(jì)算nxn塊內(nèi)像素的和的功能,所以沒法用。一個(gè)比較好和快速的方法是用一個(gè)全一的卷積核來卷積圖像,然后簡(jiǎn)單的通過標(biāo)準(zhǔn)的索引方法來采樣最后卷積結(jié)果。例如,如果下采樣的域是2x2的,那么我們可以用2x2的元素全是1的卷積核來卷積圖像。然后再卷積后的圖像中,我們每個(gè)2個(gè)點(diǎn)采集一次數(shù)據(jù),y=x(1:2:end,1:2:end),這樣就可以得到了兩倍下采樣,同時(shí)執(zhí)行求和的效果。對(duì)于第三個(gè)問題,實(shí)際上有些人以為Matlab中對(duì)sigmoid函數(shù)進(jìn)行inline的定義會(huì)更快,其實(shí)不然,Matlab與C/C++等等語言不一樣,Matlab的inline反而比普通的函數(shù)定義更非時(shí)間。所以,我們可以直接在代碼中使用計(jì)算sigmoid函數(shù)及其導(dǎo)數(shù)的真實(shí)代碼。轉(zhuǎn)自:/zouxy09/article/details/9993371神經(jīng)網(wǎng)絡(luò):卷積神經(jīng)網(wǎng)絡(luò)一、前言這篇卷積神經(jīng)網(wǎng)絡(luò)是前面介紹的多層神經(jīng)網(wǎng)絡(luò)的進(jìn)一步深入,它將深度學(xué)習(xí)的思想引入到了神經(jīng)網(wǎng)絡(luò)當(dāng)中,通過卷積運(yùn)算來由淺入深的提取圖像的不同層次的特征,而利用神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程讓整個(gè)網(wǎng)絡(luò)自動(dòng)調(diào)節(jié)卷積核的參數(shù),從而無監(jiān)督的產(chǎn)生了最適合的分類特征。這個(gè)概括可能有點(diǎn)抽象,我盡量在下面描述細(xì)致一些,但如果要更深入了解整個(gè)過程的原理,需要去了解DeepLearning。這篇文章會(huì)涉及到卷積的原理與圖像特征提取的一般概念,并詳細(xì)描述卷積神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)。但是由于精力有限,沒有對(duì)人類視覺的分層以及機(jī)器學(xué)習(xí)等原理有進(jìn)一步介紹,后面會(huì)在深度學(xué)習(xí)相關(guān)文章中展開描述。二、卷積卷積是分析數(shù)學(xué)中一種很重要的運(yùn)算,其實(shí)是一個(gè)很簡(jiǎn)單的概念,但是很多做圖像處理的人對(duì)這個(gè)概念都解釋不清,為了簡(jiǎn)單起見,這里面我們只介紹離散形式的卷積,那么在圖像上,對(duì)圖像用一個(gè)卷積核進(jìn)行卷積運(yùn)算,實(shí)際上是一個(gè)濾波的過程。我們先看一下卷積的基本數(shù)學(xué)表示:f(x,y)w(x,y)=》s=-aa》t=-bbW(s,t)f(x—S,y—t)其中I二f(x,y)是一個(gè)圖像,f(x,y)是圖像I上面x行y列上點(diǎn)的灰度值。而w(x,y)有太多名字叫了,濾波器、卷積核、響應(yīng)函數(shù)等等,而a和b定義了卷積核即w(x,y)的大小。從上面的式子中,可以很明顯的看到,卷積實(shí)際上是提供了一個(gè)權(quán)重模板,這個(gè)模板在圖像上滑動(dòng),并將中心依次與圖像中每一個(gè)像素對(duì)齊,然后對(duì)這個(gè)模板覆蓋的所有像素進(jìn)行加權(quán),并將結(jié)果作為這個(gè)卷積核在圖像上該點(diǎn)的響應(yīng)。所以從整個(gè)卷積運(yùn)算我們可以看到以下幾點(diǎn):卷積是一種線性運(yùn)算卷積核的大小,定義了圖像中任何一點(diǎn)參與運(yùn)算的鄰域的大小。卷積核上的權(quán)值大小說明了對(duì)應(yīng)的鄰域點(diǎn)對(duì)最后結(jié)果的貢獻(xiàn)能力,權(quán)重越大,貢獻(xiàn)能力越大。卷積核沿著圖像所有像素移動(dòng)并計(jì)算響應(yīng),會(huì)得到一個(gè)和原圖像等大圖像。在處理邊緣上點(diǎn)時(shí),卷積核會(huì)覆蓋到圖像外層沒有定義的點(diǎn),這時(shí)候有幾種方法設(shè)定這些沒有定義的點(diǎn),可以用內(nèi)層像素鏡像復(fù)制,也可以全設(shè)置為0。

195*+143+u'q+82++20+u'a+206+三、卷積特征層其實(shí)圖像特征提取在博客里的一些其他文章都有提過,這里我想說一下圖像特征提取與卷積的關(guān)系。其實(shí)大部分的圖像特征提取都依賴于卷積運(yùn)算,比如顯著的邊緣特征就是用各種梯度卷積算子對(duì)圖像進(jìn)行濾波的結(jié)果。一個(gè)圖像里目標(biāo)特征主要體現(xiàn)在像素與周圍像素之間形成的關(guān)系,這些鄰域像素關(guān)系形成了線條、角點(diǎn)、輪廓等。而卷積運(yùn)算正是這種用鄰域點(diǎn)按一定權(quán)重去重新定義該點(diǎn)值的運(yùn)算。水平梯度的卷積算子:豎直梯度的卷積算子:水平梯度的卷積算子:豎直梯度的卷積算子:根據(jù)深度學(xué)習(xí)關(guān)于人的視覺分層的理論,人的視覺對(duì)目標(biāo)的辨識(shí)是分層的,低層會(huì)提取一些邊緣特征,然后高一些層次進(jìn)行形狀或目標(biāo)的認(rèn)知,更高層的會(huì)分析一些運(yùn)動(dòng)和行為。也就是說高層的特征是低層特征的組合,從低層到高層的特征表示越來越抽象,越來越能表現(xiàn)語義或者意圖。而抽象層面越高,存在的可能猜測(cè)就越少,就越利于分類。而深度學(xué)習(xí)就是通過這種分層的自動(dòng)特征提取來達(dá)到目標(biāo)分類,先構(gòu)建一些基本的特征層,然后用這些基礎(chǔ)特征去構(gòu)建更高層的抽象,更精準(zhǔn)的分類特征。那整個(gè)卷積神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)也就很容易理解了,它在普通的多層神經(jīng)網(wǎng)絡(luò)的前面加了2層特征層,這兩層特征層是通過權(quán)重可調(diào)整的卷積運(yùn)算實(shí)現(xiàn)的。四、卷積神經(jīng)網(wǎng)絡(luò)在原來的多層神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)中,每一層的所有結(jié)點(diǎn)會(huì)按照連續(xù)線的權(quán)重向前計(jì)算,成為下一層結(jié)點(diǎn)的輸出。而每一條權(quán)重連結(jié)線都彼此不同,互不共享。每一個(gè)下一層結(jié)點(diǎn)的值與前一層所有結(jié)點(diǎn)都相關(guān)。與普通多層神經(jīng)網(wǎng)絡(luò)不同的是,卷積神經(jīng)網(wǎng)絡(luò)里,有特征抽取層與降維層,這些層的結(jié)點(diǎn)連結(jié)是部分連接且,一幅特征圖由一個(gè)卷積核生成,這一幅特征圖上的所有結(jié)點(diǎn)共享這一組卷積核的參數(shù)。這里我們?cè)O(shè)計(jì)一個(gè)5層的卷積神經(jīng)網(wǎng)絡(luò),一個(gè)輸入層,一個(gè)輸出層,2個(gè)特征提取層,一個(gè)全連接的隱藏層。下面詳細(xì)說明每一層的設(shè)計(jì)思路?!蹩诳诳贚ayer#250FeatureMaps□口口口Layer#250FeatureMapsEach5x5LayerFullyConnected100NeuronsLayer#4FullyConn&cted10NeuronsInputLayer29x29Layer#16Feat□reMapsEach13x13在一般的介紹卷積神經(jīng)網(wǎng)絡(luò)的文章中你可能會(huì)看到在特征層之間還有2層降維層,在這里我們將卷積與降維同步進(jìn)行,只用在卷積運(yùn)算時(shí),遍歷圖像中像素時(shí)按步長(zhǎng)間隔遍歷即可輸入層:普通的多層神經(jīng)網(wǎng)絡(luò),第一層就是特征向量。一般圖像經(jīng)過人為的特征挑選,通過特征函數(shù)計(jì)算得到特征向量,并作為神經(jīng)網(wǎng)絡(luò)的輸入。而卷積神經(jīng)網(wǎng)絡(luò)的輸出層則為整個(gè)圖像,如上圖示例29*29,那么我們可以將圖像按列展開,形成841個(gè)結(jié)點(diǎn)。而第一層的結(jié)點(diǎn)向前沒有任何的連結(jié)線。第1層:第1層是特征層,它是由6個(gè)卷積模板與第一層的圖像做卷積形成的6幅13*13的圖像。也就是說這一層中我們算上一個(gè)偏置權(quán)重,一共有只有(5*5+1)*6=156權(quán)重參數(shù),但是,第二層的結(jié)點(diǎn)是將6張圖像按列展開,即有6*13*13=1014個(gè)結(jié)點(diǎn)。而第2層構(gòu)建的真正難點(diǎn)在于,連結(jié)線的設(shè)定,當(dāng)前層的結(jié)點(diǎn)并不是與前一層的所有結(jié)點(diǎn)相連,而是只與25鄰域點(diǎn)連接,所以第二層一定有(25+1)*13*13*6=26364條連線,但是這些連結(jié)線共享了156個(gè)權(quán)值。按前面多層網(wǎng)絡(luò)C++的設(shè)計(jì)中,每個(gè)連線對(duì)象有2個(gè)成員,一個(gè)是權(quán)重的索引,一個(gè)是上一層結(jié)點(diǎn)的索引,所以這里面要正確的設(shè)置好每個(gè)連線的索引值,這也是卷積神經(jīng)網(wǎng)絡(luò)與一般全連結(jié)層的區(qū)別。第2層:第2層也是特征層,它是由50個(gè)特征圖像組成,每個(gè)特征圖像是5*5的大小,這個(gè)特征圖像上的每一點(diǎn)都是由前一層6張?zhí)卣鲌D像中每個(gè)圖像取25個(gè)鄰域點(diǎn)最后在一起加權(quán)而成,所以每個(gè)點(diǎn)也就是一個(gè)結(jié)點(diǎn)有(5*5+1)*6=156個(gè)連結(jié)線,那么當(dāng)前層一共有5*5*50=1250個(gè)結(jié)點(diǎn),所以一共有195000個(gè)權(quán)重連結(jié)線,但是只有(5*5+1)*6*50=7800個(gè)權(quán)重參數(shù),每個(gè)權(quán)重連結(jié)線的值都可以在7800個(gè)權(quán)重參數(shù)數(shù)組中找到索引。所以第3層的關(guān)鍵也是,如何建立好每根連結(jié)線的權(quán)重索引與與前一層連結(jié)的結(jié)點(diǎn)的索引。第3層:和普通多神經(jīng)網(wǎng)絡(luò)沒有區(qū)別了,是一個(gè)隱藏層,有100個(gè)結(jié)點(diǎn)構(gòu)成,每個(gè)結(jié)點(diǎn)與上一層中1250個(gè)結(jié)點(diǎn)相聯(lián),共有125100個(gè)權(quán)重與125100個(gè)連結(jié)線。第4層:輸出層,它個(gè)結(jié)點(diǎn)個(gè)數(shù)與分類數(shù)目有關(guān),假設(shè)這里我們?cè)O(shè)置為10類,則輸出層為10個(gè)結(jié)點(diǎn),相應(yīng)的期望值的設(shè)置在多層神經(jīng)網(wǎng)絡(luò)里已經(jīng)介紹過了,每個(gè)輸出結(jié)點(diǎn)與上面隱藏層的100個(gè)結(jié)點(diǎn)相連,共有(100+1)*10=1010條連結(jié)線,1010個(gè)權(quán)重。從上面可以看出,卷積神經(jīng)網(wǎng)絡(luò)的核心在于卷積層的創(chuàng)建,所以在設(shè)計(jì)CNNLayer類的時(shí)候,需要兩種創(chuàng)建網(wǎng)絡(luò)層的成員函數(shù),一個(gè)用于創(chuàng)建普通的全連接層,一個(gè)用于創(chuàng)建卷積層。classCNNlayer{private:CNNlayer*preLayer;vector<CNNneural>m_neurals;vector<double>m_weights;public:CNNlayer(){preLayer=nullptr;}//創(chuàng)建卷積層voidcreateConvLayer(unsignedcurNumberOfNeurals,unsignedpreNumberOfNeurals,unsignedpreNumberOfFeatMaps,unsignedcurNumberOfFeatMaps);//創(chuàng)建普通層voidcreateLayer(unsignedcurNumberOfNeurals,unsignedpreNumberOfNeurals);voidbackPropagate(vector<double>&dErrWrtDxn,vector<double>&dErrWrtDxnm,doubleeta);};創(chuàng)建普通層,在前面介紹的多層神經(jīng)網(wǎng)絡(luò)中已經(jīng)給出過代碼,它接收兩個(gè)參數(shù),一個(gè)是前面一層結(jié)點(diǎn)數(shù),一個(gè)是當(dāng)前層結(jié)點(diǎn)數(shù)。而卷積層的創(chuàng)建則復(fù)雜的多,所有連結(jié)線的索引值的確定需要對(duì)整個(gè)網(wǎng)絡(luò)有較清楚的了解。這里設(shè)計(jì)的createConvLayer函數(shù),它接收4個(gè)參數(shù),分別對(duì)應(yīng),當(dāng)前層結(jié)點(diǎn)數(shù),前一層結(jié)點(diǎn)數(shù),前一層特征圖的個(gè)數(shù)和當(dāng)前層特征圖像的個(gè)數(shù)。下面是C++代碼,要理解這一部分可以會(huì)稍有點(diǎn)難度,因?yàn)樘卣鲌D實(shí)際中都被按列展開了,所以鄰域這個(gè)概念會(huì)比較抽象,我們考慮把特征圖像還原,從圖像的角度去考慮。1voidCNNlayer::createConvLayer2(unsignedcurNumberOfNeurals,unsignedpreNumberOfNeurals,unsignedpreNumberOfFeatMaps,unsignedcurNumberOfFeatMaps){//前一層和當(dāng)前層特征圖的結(jié)點(diǎn)數(shù)unsignedpreImgSize=preNumberOfNeurals/preNumberOfFeatMaps;

unsignedcurImgSize=curNumberOfNeurals/curNumberOfFeatMaps;7//初始化權(quán)重unsignednumberOfWeights=preNumberOfFeatMaps*curNumberOfFeatMaps*(5*5+1);for(unsignedi=0;i!=numberOfWeights;i++)TOC\o"1-5"\h\z{m_weights.push_back(0.05*rand()/RAND_MAX);}14//建立所有連結(jié)線15for(unsignedi=0;i!=curNumberOfFeatMaps;i++){unsignedimgRow=sqrt(preImgSize);//上一層特征圖像的大小,imgRow=imgCol19//間隙2進(jìn)行取樣,鄰域周圍25個(gè)點(diǎn)20for(intc=2;c<imgRow-2;c=c+2)21{2223242526272822232425262728293031k*(5*5+1)+kk;32333435363738394041}for(intr=2;r<imgRow-2;r=r+2){CNNneuralneural;for(unsignedk=0;k!=preNumberOfNeurals;k++){for(intkk=0;kk<(5*5+1);kk++){CNNconnectionconnection;//權(quán)重的索引connection.weightIdx=i*(curNumberOfFeatMaps*5*5+1))+//結(jié)點(diǎn)的索引connection.neuralIdx=k*preImgSize+c*imgRow+r;neural.m_connections.push_back(connection);}m_neurals.push_back(neural);五、訓(xùn)練與識(shí)別整個(gè)網(wǎng)絡(luò)結(jié)構(gòu)搭建好以后,訓(xùn)練只用按照多層神經(jīng)網(wǎng)絡(luò)那樣訓(xùn)練即可,其中的權(quán)值更新策略都是一致的。所以總體來說,卷積神經(jīng)網(wǎng)絡(luò)與普通的多層神經(jīng)網(wǎng)絡(luò),就是結(jié)構(gòu)上不同。卷積神經(jīng)網(wǎng)絡(luò)多了特征提取層與降維層,他們之間結(jié)點(diǎn)的連結(jié)方式是部分連結(jié),多個(gè)連結(jié)線共享權(quán)重。而多層神經(jīng)網(wǎng)絡(luò)前后兩層之間結(jié)點(diǎn)是全連結(jié)。除了這以外,權(quán)值更新、訓(xùn)練、識(shí)別都是一致的。訓(xùn)練得到一組權(quán)值,也就是說在這組權(quán)值下網(wǎng)絡(luò)可以更好的提取圖像特征用于分類識(shí)別。關(guān)于源碼的問題:個(gè)人非常不推薦直接用別人的源碼,所以我的博客里所有文章不會(huì)給出整個(gè)工程的源碼,但是會(huì)給出一些核心函數(shù)的代碼,如果你仔細(xì)閱讀文章,一定能夠很好的理解算法的核心思想。嘗試著去自己實(shí)現(xiàn),會(huì)對(duì)你的理解更有幫助。有什么疑問可以直接在下面留言。轉(zhuǎn)自:/ronny/p/ann_03.htmlCNN卷積神經(jīng)網(wǎng)絡(luò)代碼理解DeepLearning論文筆記之(五)CNN卷積神經(jīng)網(wǎng)絡(luò)代碼理解zouxy09@/link.php?url二/zouxy09自己平時(shí)看了一些論文,但老感覺看完過后就會(huì)慢慢的淡忘,某一天重新拾起來的時(shí)候又好像沒有看過一樣。所以想習(xí)慣地把一些感覺有用的論文中的知識(shí)點(diǎn)總結(jié)整理一下,一方面在整理過程中,自己的理解也會(huì)更深,另一方面也方便未來自己的勘察。更好的還可以放到博客上面與大家交流。因?yàn)榛A(chǔ)有限,所以對(duì)論文的一些理解可能不太正確,還望大家不吝指正交流,謝謝。本文的代碼來自githup的DeepLearning的toolbox,(在這里,先感謝該toolbox的作者)里面包含了很多DeepLearning方法的代碼。是用Matlab編寫的(另外,有人翻譯成了C++和python的版本了)。本文中我們主要解讀下CNN的代碼。詳細(xì)的注釋見代碼。在讀代碼之前,最好先閱讀下我的上一個(gè)博文:DeepLearning論文筆記之(四)CNN卷積神經(jīng)網(wǎng)絡(luò)推導(dǎo)和實(shí)現(xiàn)http:///link.php?url二/zouxy09/article/details/9993371里面包含的是我對(duì)一個(gè)作者的CNN筆記的翻譯性的理解,對(duì)CNN的推導(dǎo)和實(shí)現(xiàn)做了詳細(xì)的介紹,看明白這個(gè)筆記對(duì)代碼的理解非常重要,所以強(qiáng)烈建議先看懂上面這篇文章。下面是自己對(duì)代碼的注釋:cnnexamples.mclearall;closeall;clc;addpath('../data');addpath('../util');loadmnist_uint8;train_x=double(reshape(train_x',28,28,60000))/255;test_x=double(reshape(test_x',28,28,10000))/255;train_y=double(train_y');test_y=double(test_y');%%ex1%willrun1epochinabout200secondandgetaround11%error.%With100epochsyou'llgetaround1.2%errorcnn.layers={struct('type','i')%inputlayerstruct('type','c','outputmaps',6,'kernelsize',5)%convolutionlayerstruct('type','s','scale',2)%subsamplinglayerstruct('type','c','outputmaps',12,'kernelsize',5)%convolutionlayerstruct('type','s','scale',2)%subsamplinglayer};%這里把cnn的設(shè)置給cnnsetup,它會(huì)據(jù)此構(gòu)建一個(gè)完整的CNN網(wǎng)絡(luò),并返回cnn=cnnsetup(cnn,train_x,train_y);%學(xué)習(xí)率opts.alpha=1;%每次挑出一個(gè)batchsize的batch來訓(xùn)練,也就是每用batchsize個(gè)樣本就調(diào)整一次權(quán)值,而不是%把所有樣本都輸入了,計(jì)算所有樣本的誤差了才調(diào)整一次權(quán)值opts.batchsize=50;%訓(xùn)練次數(shù),用同樣的樣本集。我訓(xùn)練的時(shí)候:%1的時(shí)候11.41%error%5的時(shí)候4.2%error%10的時(shí)候2.73%erroropts.numepochs=10;%然后開始把訓(xùn)練樣本給它,開始訓(xùn)練這個(gè)CNN網(wǎng)絡(luò)cnn=cnntrain(cnn,train_x,train_y,opts);%然后就用測(cè)試樣本來測(cè)試[er,bad]=cnntest(cnn,test_x,test_y);%plotmeansquarederrorplot(cnn.rL);%showtesterrordisp([num2str(er*100)'%error']);cnnsetup.mfunctionnet=cnnsetup(net,x,y)inputmaps=1;%B=squeeze(A)返回和矩陣A相同元素但所有單一維都移除的矩陣B,單一維是滿足size(A,dim)=1的維。%train_x中圖像的存放方式是三維的reshape(train_x',28,28,60000),前面兩維表示圖像的行與列,%第三維就表示有多少個(gè)圖像。這樣squeeze(x(:,:,1))就相當(dāng)于取第一個(gè)圖像樣本后,再把第三維%移除,就變成了28x28的矩陣,也就是得到一幅圖像,再size一下就得到了訓(xùn)練樣本圖像的行數(shù)與列數(shù)了mapsize=size(squeeze(x(:,:,1)));%下面通過傳入net這個(gè)結(jié)構(gòu)體來逐層構(gòu)建CNN網(wǎng)絡(luò)%n=numel(A)返回?cái)?shù)組A中元素個(gè)數(shù)%net.layers中有五個(gè)struct類型的元素,實(shí)際上就表示CNN共有五層,這里范圍的是5forl=1:numel(net.layers)%layerifstrcmp(net.layers{l}.type,'s')%如果這層是子采樣層%subsampling層的mapsize,最開始mapsize是每張圖的大小28*28%這里除以scale=2,就是pooling之后圖的大小,pooling域之間沒有重疊,所以pooling后的圖像為14*14%注意這里的右邊的mapsize保存的都是上一層每張?zhí)卣鱩ap的大小,它會(huì)隨著循環(huán)進(jìn)行不斷更新mapsize=floor(mapsize/net.layers{l}.scale);forj=1:inputmaps%inputmap就是上一層有多少張?zhí)卣鲌Dnet.layers{l}.b{j}=0;%將偏置初始化為0endendifstrcmp(net.layers{l}.type,'c')%如果這層是卷積層%舊的mapsize保存的是上一層的特征map的大小,那么如果卷積核的移動(dòng)步長(zhǎng)是1,那用%kernelsize*kernelsize大小的卷積核卷積上一層的特征map后,得到的新的map的大小就是下面這樣mapsize=mapsize-net.layers{l}.kernelsize+1;%該層需要學(xué)習(xí)的參數(shù)個(gè)數(shù)。每張?zhí)卣鱩ap是一個(gè)(后層特征圖數(shù)量)*(用來卷積的patch圖的大小)%因?yàn)槭峭ㄟ^用一個(gè)核窗口在上一個(gè)特征map層中移動(dòng)(核窗口每次移動(dòng)1個(gè)像素),遍歷上一個(gè)特征map%層的每個(gè)神經(jīng)元。核窗口由kernelsize*kernelsize個(gè)元素組成,每個(gè)元素是一個(gè)獨(dú)立的權(quán)值,所以%就有kernelsize*kernelsize個(gè)需要學(xué)習(xí)的權(quán)值,再加一個(gè)偏置值。另外,由于是權(quán)值共享,也就是%說同一個(gè)特征map層是用同一個(gè)具有相同權(quán)值元素的kernelsize*kernelsize的核窗口去感受輸入上一%個(gè)特征map層的每個(gè)神經(jīng)元得到的,所以同一個(gè)特征map,它的權(quán)值是一樣的,共享的,權(quán)值只取決于%核窗口。然后,不同的特征map提取輸入上一個(gè)特征map層不同的特征,所以采用的核窗口不一樣,也%就是權(quán)值不一樣,所以outputmaps個(gè)特征map就有(kernelsize*kernelsize+1)*outputmaps那么多的權(quán)值了%但這里fan_out只保存卷積核的權(quán)值W,偏置b在下面獨(dú)立保存fan_out二net.layers{l}.outputmaps*net.layers{l}.kernelsize"2;forj=1:net.layers{l}.outputmaps%outputmap%fan_out保存的是對(duì)于上一層的一張?zhí)卣鱩ap,我在這一層需要對(duì)這一張?zhí)卣鱩ap提取outputmaps種特征,%提取每種特征用到的卷積核不同,所以fan_out保存的是這一層輸出新的特征需要學(xué)習(xí)的參數(shù)個(gè)數(shù)%而,fan_in保存的是,我在這一層,要連接到上一層中所有的特征map,然后用fan_out保存的提取特征%的權(quán)值來提取他們的特征。也即是對(duì)于每一個(gè)當(dāng)前層特征圖,有多少個(gè)參數(shù)鏈到前層fan_in=inputmaps*net.layers{l}.kernelsize"2;fori=1:inputmaps%inputmap%隨機(jī)初始化權(quán)值,也就是共有outputmaps個(gè)卷積核,對(duì)上層的每個(gè)特征map,都需要用這么多個(gè)卷積核%去卷積提取特征。%rand(n)是產(chǎn)生nXn的0-1之間均勻取值的數(shù)值的矩陣,再減去0.5就相當(dāng)于產(chǎn)生-0.5到0.5之間的隨機(jī)數(shù)%再*2就放大到[-1,1]。然后再乘以后面那一數(shù),why?%反正就是將卷積核每個(gè)元素初始化為[-sqrt(6/(fan_in+fan_out)),sqrt(6/(fan_in+fan_out))]%之間的隨機(jī)數(shù)。因?yàn)檫@里是權(quán)值共享的,也就是對(duì)于一張?zhí)卣鱩ap,所有感受野位置的卷積核都是一樣的%所以只需要保存的是inputmaps*outputmaps個(gè)卷積核。net.layers{l}.k{i}{j}=(rand(net.layers{l}.kernelsize)-0.5)*2*sqrt(6/(fan_in+fan_out));endnet.layers{l}.b{j}=0;%將偏置初始化為0end%只有在卷積層的時(shí)候才會(huì)改變特征map的個(gè)數(shù),pooling的時(shí)候不會(huì)改變個(gè)數(shù)。這層輸出的特征map個(gè)數(shù)就是%輸入到下一層的特征map個(gè)數(shù)inputmaps=net.layers{l}.outputmaps;endend%fvnum是輸出層的前面一層的神經(jīng)元個(gè)數(shù)。%這一層的上一層是經(jīng)過poolin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論