




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
./卷積神經(jīng)網(wǎng)絡(luò)CNN從入門到精通卷積神經(jīng)網(wǎng)絡(luò)算法的一個實現(xiàn)前言從理解卷積神經(jīng)到實現(xiàn)它,前后花了一個月時間,現(xiàn)在也還有一些地方?jīng)]有理解透徹,CNN還是有一定難度的,不是看哪個的博客和一兩篇論文就明白了,主要還是靠自己去專研,閱讀推薦列表在末尾的參考文獻。目前實現(xiàn)的CNN在MINIT數(shù)據(jù)集上效果還不錯,但是還有一些bug,因為最近比較忙,先把之前做的總結(jié)一下,以后再繼續(xù)優(yōu)化。卷積神經(jīng)網(wǎng)絡(luò)CNN是DeepLearning的一個重要算法,在很多應(yīng)用上表現(xiàn)出卓越的效果,[1]中對比多重算法在文檔字符識別的效果,結(jié)論是CNN優(yōu)于其他所有的算法。CNN在手寫體識別取得最好的效果,[2]將CNN應(yīng)用在基于人臉的性別識別,效果也非常不錯。前段時間我用BP神經(jīng)網(wǎng)絡(luò)對手機拍照圖片的數(shù)字進行識別,效果還算不錯,接近98%,但在漢字識別上表現(xiàn)不佳,于是想試試卷積神經(jīng)網(wǎng)絡(luò)。1、CNN的整體網(wǎng)絡(luò)結(jié)構(gòu)卷積神經(jīng)網(wǎng)絡(luò)是在BP神經(jīng)網(wǎng)絡(luò)的改進,與BP類似,都采用了前向傳播計算輸出值,反向傳播調(diào)整權(quán)重和偏置;CNN與標(biāo)準(zhǔn)的BP最大的不同是:CNN中相鄰層之間的神經(jīng)單元并不是全連接,而是部分連接,也就是某個神經(jīng)單元的感知區(qū)域來自于上層的部分神經(jīng)單元,而不是像BP那樣與所有的神經(jīng)單元相連接。CNN的有三個重要的思想架構(gòu):局部區(qū)域感知權(quán)重共享空間或時間上的采樣局部區(qū)域感知能夠發(fā)現(xiàn)數(shù)據(jù)的一些局部特征,比如圖片上的一個角,一段弧,這些基本特征是構(gòu)成動物視覺的基礎(chǔ)[3];而BP中,所有的像素點是一堆混亂的點,相互之間的關(guān)系沒有被挖掘。CNN中每一層的由多個map組成,每個map由多個神經(jīng)單元組成,同一個map的所有神經(jīng)單元共用一個卷積核〔即權(quán)重,卷積核往往代表一個特征,比如某個卷積和代表一段弧,那么把這個卷積核在整個圖片上滾一下,卷積值較大的區(qū)域就很有可能是一段弧。注意卷積核其實就是權(quán)重,我們并不需要單獨去計算一個卷積,而是一個固定大小的權(quán)重矩陣去圖像上匹配時,這個操作與卷積類似,因此我們稱為卷積神經(jīng)網(wǎng)絡(luò),實際上,BP也可以看做一種特殊的卷積神經(jīng)網(wǎng)絡(luò),只是這個卷積核就是某層的所有權(quán)重,即感知區(qū)域是整個圖像。權(quán)重共享策略減少了需要訓(xùn)練的參數(shù),使得訓(xùn)練出來的模型的泛華能力更強。采樣的目的主要是混淆特征的具體位置,因為某個特征找出來后,它的具體位置已經(jīng)不重要了,我們只需要這個特征與其他的相對位置,比如一個"8",當(dāng)我們得到了上面一個"o"時,我們不需要知道它在圖像的具體位置,只需要知道它下面又是一個"o"我們就可以知道是一個'8'了,因為圖片中"8"在圖片中偏左或者偏右都不影響我們認(rèn)識它,這種混淆具體位置的策略能對變形和扭曲的圖片進行識別。CNN的這三個特點是其對輸入數(shù)據(jù)在空間〔主要針對圖像數(shù)據(jù)上和時間〔主要針對時間序列數(shù)據(jù),參考TDNN上的扭曲有很強的魯棒性。CNN一般采用卷積層與采樣層交替設(shè)置,即一層卷積層接一層采樣層,采樣層后接一層卷積...這樣卷積層提取出特征,再進行組合形成更抽象的特征,最后形成對圖片對象的描述特征,CNN后面還可以跟全連接層,全連接層跟BP一樣。下面是一個卷積神經(jīng)網(wǎng)絡(luò)的示例:圖1〔圖片來源卷積神經(jīng)網(wǎng)絡(luò)的基本思想是這樣,但具體實現(xiàn)有多重版本,我參考了matlab的DeepLearning的工具箱DeepLearnToolbox,這里實現(xiàn)的CNN與其他最大的差別是采樣層沒有權(quán)重和偏置,僅僅只對卷積層進行一個采樣過程,這個工具箱的測試數(shù)據(jù)集是MINIST,每張圖像是28*28大小,它實現(xiàn)的是下面這樣一個CNN:圖22、網(wǎng)絡(luò)初始化CNN的初始化主要是初始化卷積層和輸出層的卷積核〔權(quán)重和偏置,DeepLearnToolbox里面對卷積核和權(quán)重進行隨機初始化,而對偏置進行全0初始化。3、前向傳輸計算前向計算時,輸入層、卷積層、采樣層、輸出層的計算方式不相同。3.1輸入層:輸入層沒有輸入值,只有一個輸出向量,這個向量的大小就是圖片的大小,即一個28*28矩陣;3.2卷積層:卷積層的輸入要么來源于輸入層,要么來源于采樣層,如上圖紅色部分。卷積層的每一個map都有一個大小相同的卷積核,Toolbox里面是5*5的卷積核。下面是一個示例,為了簡單起見,卷積核大小為2*2,上一層的特征map大小為4*4,用這個卷積在圖片上滾一遍,得到一個一個<4-2+1>*〔4-2+1=3*3的特征map,卷積核每次移動一步,因此。在Toolbox的實現(xiàn)中,卷積層的一個map與上層的所有map都關(guān)聯(lián),如上圖的S2和C3,即C3共有6*12個卷積核,卷積層的每一個特征map是不同的卷積核在前一層所有map上作卷積并將對應(yīng)元素累加后加一個偏置,再求sigmod得到的。還有需要注意的是,卷積層的map個數(shù)是在網(wǎng)絡(luò)初始化指定的,而卷積層的map的大小是由卷積核和上一層輸入map的大小決定的,假設(shè)上一層的map大小是n*n、卷積核的大小是k*k,則該層的map大小是<n-k+1>*<n-k+1>,比如上圖的24*24的map大小24=〔28-5+1。斯坦福的深度學(xué)習(xí)教程更加詳細的介紹了卷積特征提取的計算過程。
圖33.3采樣層〔subsampling,Pooling:采樣層是對上一層map的一個采樣處理,這里的采樣方式是對上一層map的相鄰小區(qū)域進行聚合統(tǒng)計,區(qū)域大小為scale*scale,有些實現(xiàn)是取小區(qū)域的最大值,而ToolBox里面的實現(xiàn)是采用2*2小區(qū)域的均值。注意,卷積的計算窗口是有重疊的,而采用的計算窗口沒有重疊,ToolBox里面計算采樣也是用卷積<conv2<A,K,'valid'>>來實現(xiàn)的,卷積核是2*2,每個元素都是1/4,去掉計算得到的卷積結(jié)果中有重疊的部分,即:
圖44、反向傳輸調(diào)整權(quán)重反向傳輸過程是CNN最復(fù)雜的地方,雖然從宏觀上來看基本思想跟BP一樣,都是通過最小化殘差來調(diào)整權(quán)重和偏置,但CNN的網(wǎng)絡(luò)結(jié)構(gòu)并不像BP那樣單一,對不同的結(jié)構(gòu)處理方式不一樣,而且因為權(quán)重共享,使得計算殘差變得很困難,很多論文[1][5]和文章[4]都進行了詳細的講述,但我發(fā)現(xiàn)還是有一些細節(jié)沒有講明白,特別是采樣層的殘差計算,我會在這里詳細講述。4.1輸出層的殘差和BP一樣,CNN的輸出層的殘差與中間層的殘差計算方式不同,輸出層的殘差是輸出值與類標(biāo)值得誤差值,而中間各層的殘差來源于下一層的殘差的加權(quán)和。輸出層的殘差計算如下:公式來源這個公式不做解釋,可以查看公式來源,看斯坦福的深度學(xué)習(xí)教程的解釋。4.2下一層為采樣層〔subsampling的卷積層的殘差當(dāng)一個卷積層L的下一層<L+1>為采樣層,并假設(shè)我們已經(jīng)計算得到了采樣層的殘差,現(xiàn)在計算該卷積層的殘差。從最上面的網(wǎng)絡(luò)結(jié)構(gòu)圖我們知道,采樣層〔L+1的map大小是卷積層L的1/〔scale*scale,ToolBox里面,scale取2,但這兩層的map個數(shù)是一樣的,卷積層L的某個map中的4個單元與L+1層對應(yīng)map的一個單元關(guān)聯(lián),可以對采樣層的殘差與一個scale*scale的全1矩陣進行克羅內(nèi)克積進行擴充,使得采樣層的殘差的維度與上一層的輸出map的維度一致,Toolbox的代碼如下,其中d表示殘差,a表示輸出值:net.layers{l}.d{j}=net.layers{l}.a{j}.*<1-net.layers{l}.a{j}>.*expand<net.layers{l+1}.d{j},[net.layers{l+1}.scalenet.layers{l+1}.scale1]>擴展過程:圖5利用卷積計算卷積層的殘差:圖64.3下一層為卷積層〔subsampling的采樣層的殘差當(dāng)某個采樣層L的下一層是卷積層<L+1>,并假設(shè)我們已經(jīng)計算出L+1層的殘差,現(xiàn)在計算L層的殘差。采樣層到卷積層直接的連接是有權(quán)重和偏置參數(shù)的,因此不像卷積層到采樣層那樣簡單。現(xiàn)再假設(shè)L層第j個mapMj與L+1層的M2j關(guān)聯(lián),按照BP的原理,L層的殘差Dj是L+1層殘差D2j的加權(quán)和,但是這里的困難在于,我們很難理清M2j的那些單元通過哪些權(quán)重與Mj的哪些單元關(guān)聯(lián),Toolbox里面還是采用卷積〔稍作變形巧妙的解決了這個問題,其代碼為:convn<net.layers{l+1}.d{j},rot180<net.layers{l+1}.k{i}{j}>,'full'>;rot180表示對矩陣進行180度旋轉(zhuǎn)〔可通過行對稱交換和列對稱交換完成,為什么這里要對卷積核進行旋轉(zhuǎn),答案是:通過這個旋轉(zhuǎn),'full'模式下得卷積的正好抓住了前向傳輸計算上層map單元與卷積和及當(dāng)期層map的關(guān)聯(lián)關(guān)系,需要注意的是matlab的內(nèi)置函數(shù)convn在計算卷積前,會對卷積核進行一次旋轉(zhuǎn),因此我們之前的所有卷積的計算都對卷積核進行了旋轉(zhuǎn):a=111111111k=123456789>>convn<a,k,'full'>ans=13653512211691227453318112439281571524179
convn在計算前還會對待卷積矩陣進行0擴展,如果卷積核為k*k,待卷積矩陣為n*n,需要以n*n原矩陣為中心擴展到<n+2<k-1>>*<n+2<k-1>>,所有上面convn<a,k,'full'>的計算過程如下:圖7實際上convn內(nèi)部是否旋轉(zhuǎn)對網(wǎng)絡(luò)訓(xùn)練沒有影響,只要內(nèi)部保持一致〔即都要么旋轉(zhuǎn),要么都不旋轉(zhuǎn),所有我的卷積實現(xiàn)里面沒有對卷積核旋轉(zhuǎn)。如果在convn計算前,先對卷積核旋轉(zhuǎn)180度,然后convn內(nèi)部又對其旋轉(zhuǎn)180度,相當(dāng)于卷積核沒有變。為了描述清楚對卷積核旋轉(zhuǎn)180與卷積層的殘差的卷積所關(guān)聯(lián)的權(quán)重與單元,正是前向計算所關(guān)聯(lián)的權(quán)重與單元,我們選一個稍微大一點的卷積核,即假設(shè)卷積層采用用3*3的卷積核,其上一層采樣層的輸出map的大小是5*5,那么前向傳輸由采樣層得到卷積層的過程如下:圖8這里我們采用自己實現(xiàn)的convn〔即內(nèi)部不會對卷積核旋轉(zhuǎn),并假定上面的矩陣A、B下標(biāo)都從1開始,那么有:B11=A11*K11+A12*K12+A13*K13+A21*K21+A22*K22+A23*K23+A31*K31+A32*K32+A33*K33B12=A12*K11+A13*K12+A14*K13+A22*K21+A23*K22+A24*K23+A32*K31+A33*K32+A34*K33B13=A13*K11+A14*K12+A15*K13+A23*K21+A24*K22+A25*K23+A33*K31+A34*K32+A35*K33B21=A21*K11+A22*K12+A23*K13+A31*K21+A32*K22+A33*K23+A41*K31+A42*K32+A43*K33B22=A22*K11+A23*K12+A24*K13+A32*K21+A33*K22+A34*K23+A42*K31+A43*K32+A44*K33B23=A23*K11+A24*K12+A25*K13+A33*K21+A34*K22+A35*K23+A43*K31+A44*K32+A45*K33B31=A31*K11+A32*K12+A33*K13+A41*K21+A42*K22+A43*K23+A51*K31+A52*K32+A53*K33B32=A32*K11+A33*K12+A34*K13+A42*K21+A43*K22+A44*K23+A52*K31+A53*K32+A54*K33B33=A33*K11+A34*K12+A35*K13+A43*K21+A44*K22+A45*K23+A53*K31+A54*K32+A55*K33我們可以得到B矩陣每個單元與哪些卷積核單元和哪些A矩陣的單元之間有關(guān)聯(lián):A11[K11][B11]A12[K12,K11][B12,B11]A13[K13,K12,K11][B12,B13,B11]A14[K13,K12][B12,B13]A15[K13][B13]A21[K21,K11][B21,B11]A22[K22,K21,K12,K11][B12,B22,B21,B11]A23[K23,K22,K21,K13,K12,K11][B23,B22,B21,B12,B13,B11]A24[K23,K22,K13,K12][B23,B12,B13,B22]A25[K23,K13][B23,B13]A31[K31,K21,K11][B31,B21,B11]A32[K32,K31,K22,K21,K12,K11][B31,B32,B22,B12,B21,B11]A33[K33,K32,K31,K23,K22,K21,K13,K12,K11][B23,B22,B21,B31,B12,B13,B11,B33,B32]A34[K33,K32,K23,K22,K13,K12][B23,B22,B32,B33,B12,B13]A35[K33,K23,K13][B23,B13,B33]A41[K31,K21][B31,B21]A42[K32,K31,K22,K21][B32,B22,B21,B31]A43[K33,K32,K31,K23,K22,K21][B31,B23,B22,B32,B33,B21]A44[K33,K32,K23,K22][B23,B22,B32,B33]A45[K33,K23][B23,B33]A51[K31][B31]A52[K32,K31][B31,B32]A53[K33,K32,K31][B31,B32,B33]A54[K33,K32][B32,B33]A55[K33][B33]然后再用matlab的convn<內(nèi)部會對卷積核進行180度旋轉(zhuǎn)>進行一次convn<B,K,'full'>,結(jié)合圖7,看紅色部分,除去0,A11=B'33*K'33=B11*K11,發(fā)現(xiàn)A11正好與K11、B11關(guān)聯(lián)對不對;我們再看一個A24=B'34*K'21+B'35*K'22+B'44*K'31+B'45*K'32=B12*K23+B13*K22+B22*K13+B23*K12,發(fā)現(xiàn)參與A24計算的卷積核單元與B矩陣單元,正好是前向計算時關(guān)聯(lián)的單元,所以我們可以通過旋轉(zhuǎn)卷積核后進行卷積而得到采樣層的殘差。殘差計算出來后,剩下的就是用更新權(quán)重和偏置,這和BP是一樣的,因此不再細究,有問題歡迎交流。5、代碼實現(xiàn)詳細的代碼不再這里貼了,我依舊放在了github,歡迎參考和指正。我又是在重造車輪了,沒有使用任何第三方的庫類,這里貼一下調(diào)用代碼:publicstaticvoidrunCnn<>{//創(chuàng)建一個卷積神經(jīng)網(wǎng)絡(luò)LayerBuilderbuilder=newLayerBuilder<>;builder.addLayer<Layer.buildInputLayer<newSize<28,28>>>;builder.addLayer<Layer.buildConvLayer<6,newSize<5,5>>>;builder.addLayer<Layer.buildSampLayer<newSize<2,2>>>;builder.addLayer<Layer.buildConvLayer<12,newSize<5,5>>>;builder.addLayer<Layer.buildSampLayer<newSize<2,2>>>;builder.addLayer<Layer.buildOutputLayer<10>>;CNNcnn=newCNN<builder,50>;//導(dǎo)入數(shù)據(jù)集StringfileName="dataset/train.format";Datasetdataset=Dataset.load<fileName,",",784>;cnn.train<dataset,3>;//StringmodelName="model/n";cnn.saveModel<modelName>;dataset.clear<>;dataset=null;//預(yù)測//CNNcnn=CNN.loadModel<modelName>;Datasettestset=Dataset.load<"dataset/test.format",",",-1>;cnn.predict<testset,"dataset/test.predict">;}6、參考文獻[1].YANNLECUN.
Gradient-BasedLearningApplied
toDocumentRecognition.[2].ShanSungLIEW.
Genderclassification:Aconvolutionalneuralnetworkapproach.[3]D.H.HubelandT.N.Wiesel,"Receptivefields,binocularinteraction
teraction,andfunctionalarchitectureinthecat’svisualcortex,"[5]JakeBouvrie.
NotesonConvolutionalNeuralNetworks.[6]C++實現(xiàn)的詳細介紹[7]matlabDeepLearnToolbox
/rasmusbergpalm/DeepLearnToolbox
轉(zhuǎn)載自:卷積神經(jīng)網(wǎng)絡(luò)卷積神經(jīng)網(wǎng)絡(luò)<Convolutional
Neural
Networks:CNN>是人工神經(jīng)網(wǎng)絡(luò)<ANN>的一種,是深度學(xué)習(xí)的一種學(xué)習(xí)算法。它在圖像識別和分類、自然語言處理廣告系統(tǒng)中都有應(yīng)用。有意思是,卷積神經(jīng)網(wǎng)絡(luò)的提出其實就是來自于生物視覺模型。1981年的諾貝爾醫(yī)學(xué)獎,頒發(fā)給了DavidHubel、TorstenWiesel。他們的工作給人們呈現(xiàn)了視覺系統(tǒng)是如何將來自外界的視覺信號傳遞到視皮層,并通過一系列處理過程〔包括邊界檢測、運動檢測、立體深度檢測和顏色檢測,最后在大腦中構(gòu)建出一幅視覺圖像。這個發(fā)現(xiàn)激發(fā)了人們對于神經(jīng)系統(tǒng)的進一步思考,神經(jīng)-中樞-大腦的工作過程,或許是一個不斷迭代、不斷抽象的過程。如下圖所示,從原始信號攝入開始〔瞳孔攝入像素Pixels,首先進行初步處理〔大腦皮層某些細胞發(fā)現(xiàn)邊緣和方向,抽象〔大腦判定眼前的物體的形狀是圓形的,然后進一步抽象〔大腦進一步判定該物體是只氣球。六十年代的生理學(xué)的發(fā)現(xiàn),促成了計算機人工智能在四十年后的突破性發(fā)展。1989年,YannLeCun
<紐約大學(xué)教授,現(xiàn)FacebookAI研究室主任>提出了卷積神經(jīng)網(wǎng)絡(luò),這是第一個真正成功訓(xùn)練多層網(wǎng)絡(luò)結(jié)構(gòu)的學(xué)習(xí)算法,但在當(dāng)時的計算能力下效果欠佳。直到2006年,GeoffreyHinton提出基于深信度網(wǎng)〔Deep
Belief
Net和限制波爾茲曼機〔RestrictedBoltzmann
Machine的學(xué)習(xí)算法,重新點燃了人工智能領(lǐng)域?qū)τ谏窠?jīng)網(wǎng)絡(luò)的熱情。卷積神經(jīng)網(wǎng)絡(luò)現(xiàn)在計算機視覺領(lǐng)域表現(xiàn)出眾。ImageNetClassificationwithDeepConvolutionalNeuralNetworks,這篇發(fā)表于NIPS2012的文章,是Hinton與其學(xué)生為了回應(yīng)別人對于DeepLearning的質(zhì)疑而將CNN結(jié)合GPU并行技術(shù)用于ImagenetChallenge〔圖像識別目前最大的數(shù)據(jù)庫,被譽為計算機視覺圣杯,最終取得了非常驚人的結(jié)果。他們的算法在2012年取得世界最好結(jié)果,使分類錯誤率從26.2%下降到16%。2013年MatthewZeiler的算法繼續(xù)將錯誤率下降到11.2%。MatthewZeiler還創(chuàng)立了Clarifai,讓我們可以有機會使用他們的圖像識別算法對圖片標(biāo)注分類或圖像搜索。
TheconvnetfromKrizhevskyetal.'sNIPS2012ImageNetclassificationpaper.在月初Kaggle結(jié)束的GalaxyZoochallenge中,參賽者要對星系圖像進行分類<Spiral/Elliptical,Merging/Notmerging,Clockwise/Anti-clockwise>,獲勝的算法也是使用了卷積神經(jīng)網(wǎng)絡(luò)。SanderDieleman已放出了代碼和詳盡的文檔:
MysolutionfortheGalaxyZoochallenge2014年3月,Facebook剛剛公布了他們在CVPR2014的文章:DeepFace:ClosingtheGaptoHuman-LevelPerformanceinFaceVerification。他們用四百萬人臉圖片訓(xùn)練了一個九層的卷積神經(jīng)網(wǎng)絡(luò)來獲得臉部特征,神經(jīng)網(wǎng)絡(luò)處理的參數(shù)高達1.2億。他們在著名的公共測試數(shù)據(jù)集LFW〔labeledfaceinthewild,1:1地判斷是否兩個照片是一個人上達到了97.25%的正確率。這個數(shù)字已經(jīng)基本接近人眼的辨識水平。北京Face++團隊的算法達到97.27%的正確率,在美圖秀秀中就有應(yīng)用,他們的主頁提供了API、demo展示和論文?,F(xiàn)在的最新進展是,香港中文大學(xué)基于FisherDiscriminantAnalysis的算法將FaceVerification正確率提高到98.52%,超過了人類水平〔97.53%。
SystemoverviewinFace++paperinICCV2013除了計算機視覺領(lǐng)域,卷積神經(jīng)網(wǎng)絡(luò)在人工智能和robotics也有很大潛力。Hinton的另外一個學(xué)生創(chuàng)立了人工智能公司DeepMind,沒有商業(yè)產(chǎn)品,只憑一篇論文,就已被Google招聘式收購。他們使用深度學(xué)習(xí)〔CNN結(jié)合強化學(xué)習(xí)〔ReinforcementLearning,在Stella模擬機上讓機器自己玩了7個Atari2600的游戲,結(jié)果不僅戰(zhàn)勝了其他機器人,甚至在其中3個游戲中超越了人類游戲?qū)<?。很有意?具體可以見InfoQ的看DeepMind如何用Reinforcementlearning玩游戲,以及論文原文PlayingAtariwithDeepReinforcementLearning從線性分類器到卷積神經(jīng)網(wǎng)絡(luò)前言本文大致分成兩大部分,第一部分嘗試將本文涉及的分類器統(tǒng)一到神經(jīng)元類模型中,第二部分闡述卷積神經(jīng)網(wǎng)絡(luò)〔CNN的發(fā)展簡述和目前的相關(guān)工作。
本文涉及的分類器〔分類方法有:線性回歸邏輯回歸〔即神經(jīng)元模型神經(jīng)網(wǎng)絡(luò)〔NN支持向量機〔SVM卷積神經(jīng)網(wǎng)絡(luò)〔CNN
從神經(jīng)元的角度來看,上述分類器都可以看成神經(jīng)元的一部分或者神經(jīng)元組成的網(wǎng)絡(luò)結(jié)構(gòu)。各分類器簡述邏輯回歸說邏輯回歸之前需要簡述一下線性回歸。
圖1單變量的線性回歸圖1中描述了一個單變量的線性回歸模型:藍點代表自變量x的分布——顯然x呈現(xiàn)線性分布。于是我們可以用下面的式子對其進行擬合,即我們的目標(biāo)函數(shù)可以寫成:y^=ωx+b從單變量到多變量模型,需要將x變成向量x?,同時權(quán)重ω也需要變成向量ω?。y^=ω??x?
+b而一般線性回歸的損失函數(shù)會用歐氏距離來進行衡量,即常說的最小二乘法,單個樣本的損失函數(shù)可以寫成:ε=12<y?y^>2而邏輯回歸,可以簡單理解成線性回歸的結(jié)果加上了一個sigmoid函數(shù)。
圖2sigmoid函數(shù)圖像從本質(zhì)上來說,加上sigmoid函數(shù)的目的在于能夠?qū)⒑瘮?shù)輸出的值域從<?∞,∞>映射到<0,1>之間,于是可以說邏輯回歸的輸出能夠代表一個事件發(fā)生的概率。
邏輯分類的目標(biāo)函數(shù)和單樣本損失函數(shù)是:y^=sigmoid<w??x?
+b>ε=?ylog<y^>?<1?y>log<1?y^>這里為何要使用一個復(fù)雜的損失函數(shù)這構(gòu)造了一個凸函數(shù),而如果直接使用最小二乘進行定義,損失函數(shù)會變成非凸函數(shù)。實際上邏輯回歸模型雖然名字帶有回歸,實際上一般用于二分類問題。即對y^設(shè)置一個閾值〔一般是0.5,便實現(xiàn)了二分類問題。而邏輯回歸模型的另外一個名稱為神經(jīng)元模型——即我們認(rèn)為大腦的神經(jīng)元有著像上述模型一樣的結(jié)構(gòu):一個神經(jīng)元會根據(jù)與它相連的神經(jīng)元的輸入〔x做出反應(yīng),決定自身的激活程度〔一般用sigmoid函數(shù)衡量激活程度,并將激活后的數(shù)值〔y輸出到其他神經(jīng)元。圖3邏輯回歸模型,即單個的神經(jīng)元模型神經(jīng)網(wǎng)絡(luò)〔NeuralNetwork,簡稱NN邏輯回歸的決策平面是線性的,所以,它一般只能夠解決樣本是線性可分的情況。
如果樣本呈現(xiàn)非線性的時候,我們可以引入多項式回歸。
圖4多項式回歸解決樣本線性不可分的情況,圖片來自AndrewNg的MachineLearning課程的課件其實,多項式回歸也可以看成是線性回歸或者邏輯回歸的一個特例——將線性回歸或者邏輯回歸的特征x轉(zhuǎn)化為x2,x3…等非線性的特征組合,然后對其進行線性的擬合。
多項式回歸雖然能夠解決非線性問題,但需要人工構(gòu)造非線性的特征,那么,是否有一種模型,既能夠應(yīng)付樣本非線性可分的情況,又同時能夠自動構(gòu)造非線性的特征呢?
答案是有的,這個模型就是神經(jīng)網(wǎng)絡(luò)。
圖5帶一個隱層的神經(jīng)網(wǎng)絡(luò)模型如圖5所示,每個圓圈都是一個神經(jīng)元〔或者說是一個邏輯回歸模型。所以神經(jīng)網(wǎng)絡(luò)可以看成"線性組合-非線性激活函數(shù)-線性組合-非線性激活函數(shù)…"這樣的較為復(fù)雜網(wǎng)絡(luò)結(jié)構(gòu),它的決策面是復(fù)雜的,于是能夠適應(yīng)樣本非線性可分的情況。
另一方面,圖5中中間一列的橙色神經(jīng)元構(gòu)成的層次我們成為隱層。我們認(rèn)為隱層的神經(jīng)元對原始特征進行了組合,并提取出來了新的特征,而這個過程是模型在訓(xùn)練過程中自動"學(xué)習(xí)"出來的。
神經(jīng)網(wǎng)絡(luò)的fomulation相對較為復(fù)雜,已經(jīng)超出本文的范圍,可參考Standford的深度學(xué)習(xí)教程支持向量機〔簡稱SVM神經(jīng)網(wǎng)絡(luò)的出現(xiàn)一度引起研究熱潮,但神經(jīng)網(wǎng)絡(luò)有它的缺點:一般來說需要大量的訓(xùn)練樣本代價函數(shù)邊界復(fù)雜,非凸,存在多個局部最優(yōu)值。參數(shù)意義模糊,比如隱層的神經(jīng)元個數(shù)應(yīng)該取多少一直沒有定論。淺層神經(jīng)網(wǎng)絡(luò)對于特征學(xué)習(xí)的表達能力有限。深層神經(jīng)網(wǎng)絡(luò)的參數(shù)繁多,一方面容易導(dǎo)致過擬合問題,另一方面因為訓(xùn)練時間過長而導(dǎo)致不可學(xué)習(xí)。
于是,在上世紀(jì)90年代SVM被提出來后,神經(jīng)網(wǎng)絡(luò)一度衰落了。
那么SVM是什么?
SVM,更準(zhǔn)確的說是L-SVM,本質(zhì)上依然是一個線性分類器,SVM的核心思想在于它的分類準(zhǔn)則——最大間隔〔maxmargin.
圖6L-SVM本質(zhì)上是最大分類間隔的線性分類器同為線性分類器的拓展,邏輯回歸和L-SVM有著千絲萬縷的關(guān)系,AndrewNg的課件有一張圖很清晰地把這兩者的代價函數(shù)聯(lián)系起來了〔見圖7。
圖7L-SVM和邏輯回歸的代價函數(shù)對比,SVM的有一個明顯的轉(zhuǎn)折點由于L-SVM是線性分類器,所以不能解決樣本線性不可分的問題。于是后來人們引入了核函數(shù)的概念,于是得到了K-SVM〔K是Kernel的意思。從本質(zhì)上講,核函數(shù)是用于將原始特征映射到高維的特征空間中去,并認(rèn)為在高為特征空間中能夠?qū)崿F(xiàn)線性可分。個人認(rèn)為,這個跟多項式回歸的思想是類似的,只不過核函數(shù)涵括的范圍更加廣,以及形式上更加優(yōu)雅,使得它能夠避免維數(shù)災(zāi)難。
圖8Kernel能夠?qū)μ卣鬟M行非線性映射<圖片frompluskid>SVM比起神經(jīng)網(wǎng)絡(luò)有著以下的優(yōu)點:代價函數(shù)是凸函數(shù),存在全局最優(yōu)值。能夠應(yīng)付小樣本集的情況不容易過擬合,并且有著不錯的泛化性能和魯棒性核函數(shù)的引入,解決了非線性問題,同時還避免了維數(shù)災(zāi)難更多關(guān)于SVM的內(nèi)容可以參考July的這篇文章:支持向量機通俗導(dǎo)論〔理解SVM的三層境界然而,其實我們依然可以將SVM看成一種特殊的神經(jīng)元模型:L-SVM本質(zhì)上跟單神經(jīng)元〔即邏輯回歸模型的最大差別,只是代價函數(shù)的不同,所以可以將SVM也理解成一種神經(jīng)元,只不過它的激活函數(shù)不是sigmoid函數(shù),而是SVM獨有的一種激活函數(shù)的定義方法。K-SVM只是比起L-SVM多了一個負責(zé)用于非線性變換的核函數(shù),這個跟神經(jīng)網(wǎng)絡(luò)的隱層的思想也是一脈相承的。所以K-SVM實際上是兩層的神經(jīng)元網(wǎng)絡(luò)結(jié)構(gòu):第一層負責(zé)非線性變換,第二層負責(zé)回歸。《基于核函數(shù)的SVM機與三層前向神經(jīng)網(wǎng)絡(luò)的關(guān)系》一文中,認(rèn)為這兩者從表達性來說是等價的。〔注:這里的"三層前向神經(jīng)網(wǎng)絡(luò)"實際上是帶一個隱層的神經(jīng)網(wǎng)絡(luò),說是三層是因為它把網(wǎng)絡(luò)的輸入也看成一個層。卷積神經(jīng)網(wǎng)絡(luò)近年來,神經(jīng)網(wǎng)絡(luò)又重新興盛起來了。尤以"卷積神經(jīng)網(wǎng)絡(luò)"為其代表。于是本文下面的篇幅主要圍繞卷積神經(jīng)網(wǎng)絡(luò)進行展開。生物學(xué)基礎(chǔ)引自DeepLearning〔深度學(xué)習(xí)學(xué)習(xí)筆記整理系列之〔七。
1962年Hubel和Wiesel通過對貓視覺皮層細胞的研究,提出了感受野<receptivefield>的概念,1984年日本學(xué)者Fukushima基于感受野概念提出的神經(jīng)認(rèn)知機<neocognitron>可以看作是卷積神經(jīng)網(wǎng)絡(luò)的第一個實現(xiàn)網(wǎng)絡(luò),也是感受野概念在人工神經(jīng)網(wǎng)絡(luò)領(lǐng)域的首次應(yīng)用。神經(jīng)認(rèn)知機將一個視覺模式分解成許多子模式〔特征,然后進入分層遞階式相連的特征平面進行處理,它試圖將視覺系統(tǒng)模型化,使其能夠在即使物體有位移或輕微變形的時候,也能完成識別。
通常神經(jīng)認(rèn)知機包含兩類神經(jīng)元,即承擔(dān)特征抽取的S-元和抗變形的C-元。S-元中涉及兩個重要參數(shù),即感受野與閾值參數(shù),前者確定輸入連接的數(shù)目,后者則控制對特征子模式的反應(yīng)程度。許多學(xué)者一直致力于提高神經(jīng)認(rèn)知機的性能的研究:在傳統(tǒng)的神經(jīng)認(rèn)知機中,每個S-元的感光區(qū)中由C-元帶來的視覺模糊量呈正態(tài)分布。如果感光區(qū)的邊緣所產(chǎn)生的模糊效果要比中央來得大,S-元將會接受這種非正態(tài)模糊所導(dǎo)致的更大的變形容忍性。我們希望得到的是,訓(xùn)練模式與變形刺激模式在感受野的邊緣與其中心所產(chǎn)生的效果之間的差異變得越來越大。為了有效地形成這種非正態(tài)模糊,Fukushima提出了帶雙C-元層的改進型神經(jīng)認(rèn)知機。基本的網(wǎng)絡(luò)結(jié)構(gòu)一個較為出名的CNN結(jié)構(gòu)為LeNet5,它的demo可以參看這個網(wǎng)站。圖9是LeNet的結(jié)構(gòu)示意圖。
圖9LeNet5的網(wǎng)絡(luò)結(jié)構(gòu)示意圖圖中的Convolutions對應(yīng)了上一段說的S-元,Subsampling對應(yīng)了上一段中說的C-元。
對于Convolution層的每個神經(jīng)元,它們的權(quán)值都是共享的,這樣做的好處是大大減少了神經(jīng)網(wǎng)絡(luò)的參數(shù)個數(shù)。
對于Sampling層的每個神經(jīng)元,它們是上一層Convolution層的局部范圍的均值<或者最大值>,能夠有效地提供局部的平移和旋轉(zhuǎn)不變性。為何神經(jīng)網(wǎng)絡(luò)重新興起?卷積神經(jīng)網(wǎng)絡(luò)屬于一種深度的神經(jīng)網(wǎng)絡(luò),如上文所說,深度神經(jīng)網(wǎng)絡(luò)在之前是不可計算的,主要是由于網(wǎng)絡(luò)層次變深后會導(dǎo)致下面問題:由于網(wǎng)絡(luò)參數(shù)增多,導(dǎo)致了嚴(yán)重的過擬合現(xiàn)象在訓(xùn)練過程中,對深度網(wǎng)絡(luò)使用BP算法傳播時候梯度迅速減少,導(dǎo)致前面的網(wǎng)絡(luò)得不到訓(xùn)練,網(wǎng)絡(luò)難以收斂。而這兩個問題在目前都得到了較好的解決:共享權(quán)值:即上文提到的卷積層的卷積核權(quán)值共享,大大減少了網(wǎng)絡(luò)中參數(shù)的數(shù)量級。加大數(shù)據(jù)量:一個是通過眾包的方式來增加樣本的量級,比如,目前ImageNet已經(jīng)有了120萬的帶標(biāo)注的圖片數(shù)據(jù)。另一個是通過對已有的樣本進行隨機截取、局部擾動、小角度扭動等方法,來倍增已有的樣本數(shù)。改變激活函數(shù):使用ReLU>作為激活函數(shù),由于ReLU的導(dǎo)數(shù)對于正數(shù)輸入來說恒為1,能夠很好地將梯度傳到位于前面的網(wǎng)絡(luò)當(dāng)中。Dropout機制:Hinton在2012提出了Dropout機制,能夠在訓(xùn)練過程中將通過隨機禁止一半的神經(jīng)元被修改,避免了過擬合的現(xiàn)象。GPU編程:使用GPU進行運算,比起CPU時代運算性能有了數(shù)量級的提升。上述問題得到有效解決后,神經(jīng)網(wǎng)絡(luò)的優(yōu)勢就得到充分的顯現(xiàn)了:復(fù)雜模型帶來的強大的表達能力有監(jiān)督的自動特征提取于是神經(jīng)網(wǎng)絡(luò)能夠得到重新興起,也就可以解釋了。下文會選取一些樣例來說明神經(jīng)網(wǎng)絡(luò)的強大之處。CNN樣例1AlexNet在ImageNet舉辦的大規(guī)模圖像識別比賽ILSVRC2012中分類比賽中,Hinton的學(xué)生Alex搭建了一個8層的CNN,最終top-5的漏報率是16%,拋離而第二名的27%整整有11個百分點。
圖10AlexNet的CNN結(jié)構(gòu),包括5個卷積層,和3個全連接層,最后一個softmax分類器這個網(wǎng)絡(luò)中用到的技術(shù)有:ReLU激活函數(shù)多GPU編程局部正則化〔LocalResponseNormalization重疊的下采樣〔OverlappingPooling通過隨機截取和PCA來增加數(shù)據(jù)DropoutCNN樣例2deconvnet在下一年的比賽ILSVRC2013中,在同樣的數(shù)據(jù)集同樣的任務(wù)下,Matthew進一步將漏報率降到了11%。他使用了一個被命名為"DeconvolutionalNetwork"〔簡稱deconvnet的技術(shù)。
Matthew的核心工作在于嘗試將CNN學(xué)習(xí)出來的特征映射回原圖片,來對每個卷積層最具有判別性的部分實現(xiàn)可視化——也就是,觀察CNN在卷積層中學(xué)習(xí)到了什么。
圖11deconvnet的思想是將網(wǎng)絡(luò)的輸出還原成輸入CNN樣例3DeepPoseDeepPose的貢獻在于它對CNN使用了級聯(lián)的思想:首先,可以用第一層CNN大致定位出人物的關(guān)節(jié)位置,然后使用反復(fù)使用第二層神經(jīng)網(wǎng)絡(luò)對第一層網(wǎng)絡(luò)進行微調(diào),以達到精細定位的目的。
從另外一個角度,這個工作也說明了,CNN不僅能夠應(yīng)付分類問題,也能夠應(yīng)付定位的問題。
圖12DeepPose通過級聯(lián)地使用CNN來達到精細定位關(guān)節(jié)的位置CNN樣例4CNNvs人工特征CNNFeaturesoff-the-shelf:anAstoundingBaselineforRecognition
該工作旨在驗證CNN提取出來的特征是否有效,于是作者做了這樣的一個實驗:將在ILSVRC2013的分類+定位比賽中獲勝的OverFeat團隊使用CNN提取出來的特征,加上一個L-SVM后構(gòu)成了一個分類器,去跟各個物體分類的數(shù)據(jù)集上目前最好<state-of-the-art>的方法進行比較,結(jié)果幾乎取得了全面的優(yōu)勝??偨Y(jié)本文對數(shù)個分類器模型進行了介紹,并嘗試統(tǒng)一到神經(jīng)元網(wǎng)絡(luò)模型的框架之中。
神經(jīng)元網(wǎng)絡(luò)模型的發(fā)展一直發(fā)生停滯,只是在中途有著不同的發(fā)展方向和重點。
神經(jīng)元網(wǎng)絡(luò)模型是個極其有效的模型,近年來由于樣本數(shù)量和計算性能都得到了幾何量級的提高,CNN這一深度框架得以發(fā)揮它的優(yōu)勢,在計算機視覺的數(shù)個領(lǐng)域都取得了不菲的成就。
目前來說,對CNN本身的研究還不夠深入,CNN效果雖然優(yōu)秀,但對于我們來說依然是一個黑盒子。弄清楚這個黑盒子的構(gòu)造,從而更好地去改進它,會是一個相當(dāng)重要的工作。參考MachineLearning@CourseraUFLDLTutorial支持向量機通俗導(dǎo)論〔理解SVM的三層境界支持向量機系列frompluskid基于核函數(shù)的SVM機與三層前向神經(jīng)網(wǎng)絡(luò)的關(guān)系,張鈴,計算機學(xué)報,vol.25,No.7,July2012DeepLearning〔深度學(xué)習(xí)學(xué)習(xí)筆記整理系列之〔七ImageNetClassificationwithDeepConvolutionalNeuralNetworks,AlexKrizhevsky.etc,NIPS2012VisualizingandUnderstandingConvolutionalNetworks,MatthewD.Zeiler,arXiv:1311.2901v3[cs.CV]28Nov2013DeepPose:HumanPoseEstimationviaDeepNeuralNetworks,arXiv:1312.4659v1[cs.CV]17Dec2013CNNFeaturesoff-the-shelf:anAstoundingBaselineforRecognition,arXiv:1403.6382v3[cs.CV]12May2014轉(zhuǎn)載自:/2014/06/14/from-lr-to-cnn/神經(jīng)網(wǎng)絡(luò):卷積神經(jīng)網(wǎng)絡(luò)一、前言這篇卷積神經(jīng)網(wǎng)絡(luò)是前面介紹的多層神經(jīng)網(wǎng)絡(luò)的進一步深入,它將深度學(xué)習(xí)的思想引入到了神經(jīng)網(wǎng)絡(luò)當(dāng)中,通過卷積運算來由淺入深的提取圖像的不同層次的特征,而利用神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程讓整個網(wǎng)絡(luò)自動調(diào)節(jié)卷積核的參數(shù),從而無監(jiān)督的產(chǎn)生了最適合的分類特征。這個概括可能有點抽象,我盡量在下面描述細致一些,但如果要更深入了解整個過程的原理,需要去了解DeepLearning。這篇文章會涉及到卷積的原理與圖像特征提取的一般概念,并詳細描述卷積神經(jīng)網(wǎng)絡(luò)的實現(xiàn)。但是由于精力有限,沒有對人類視覺的分層以及機器學(xué)習(xí)等原理有進一步介紹,后面會在深度學(xué)習(xí)相關(guān)文章中展開描述。二、卷積卷積是分析數(shù)學(xué)中一種很重要的運算,其實是一個很簡單的概念,但是很多做圖像處理的人對這個概念都解釋不清,為了簡單起見,這里面我們只介紹離散形式的卷積,那么在圖像上,對圖像用一個卷積核進行卷積運算,實際上是一個濾波的過程。我們先看一下卷積的基本數(shù)學(xué)表示:f<x,y>°w<x,y>=∑s=?aa∑t=?bbw<s,t>f<x?s,y?t>其中I=f<x,y>是一個圖像,f<x,y>是圖像I上面x行y列上點的灰度值。而w<x,y>有太多名字叫了,濾波器、卷積核、響應(yīng)函數(shù)等等,而a和b定義了卷積核即w<x,y>的大小。從上面的式子中,可以很明顯的看到,卷積實際上是提供了一個權(quán)重模板,這個模板在圖像上滑動,并將中心依次與圖像中每一個像素對齊,然后對這個模板覆蓋的所有像素進行加權(quán),并將結(jié)果作為這個卷積核在圖像上該點的響應(yīng)。所以從整個卷積運算我們可以看到以下幾點:1卷積是一種線性運算2卷積核的大小,定義了圖像中任何一點參與運算的鄰域的大小。3卷積核上的權(quán)值大小說明了對應(yīng)的鄰域點對最后結(jié)果的貢獻能力,權(quán)重越大,貢獻能力越大。4卷積核沿著圖像所有像素移動并計算響應(yīng),會得到一個和原圖像等大圖像。5在處理邊緣上點時,卷積核會覆蓋到圖像外層沒有定義的點,這時候有幾種方法設(shè)定這些沒有定義的點,可以用內(nèi)層像素鏡像復(fù)制,也可以全設(shè)置為0。三、卷積特征層其實圖像特征提取在博客里的一些其他文章都有提過,這里我想說一下圖像特征提取與卷積的關(guān)系。其實大部分的圖像特征提取都依賴于卷積運算,比如顯著的邊緣特征就是用各種梯度卷積算子對圖像進行濾波的結(jié)果。一個圖像里目標(biāo)特征主要體現(xiàn)在像素與周圍像素之間形成的關(guān)系,這些鄰域像素關(guān)系形成了線條、角點、輪廓等。而卷積運算正是這種用鄰域點按一定權(quán)重去重新定義該點值的運算。水平梯度的卷積算子:豎直梯度的卷積算子:根據(jù)深度學(xué)習(xí)關(guān)于人的視覺分層的理論,人的視覺對目標(biāo)的辨識是分層的,低層會提取一些邊緣特征,然后高一些層次進行形狀或目標(biāo)的認(rèn)知,更高層的會分析一些運動和行為。也就是說高層的特征是低層特征的組合,從低層到高層的特征表示越來越抽象,越來越能表現(xiàn)語義或者意圖。而抽象層面越高,存在的可能猜測就越少,就越利于分類。而深度學(xué)習(xí)就是通過這種分層的自動特征提取來達到目標(biāo)分類,先構(gòu)建一些基本的特征層,然后用這些基礎(chǔ)特征去構(gòu)建更高層的抽象,更精準(zhǔn)的分類特征。那整個卷積神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)也就很容易理解了,它在普通的多層神經(jīng)網(wǎng)絡(luò)的前面加了2層特征層,這兩層特征層是通過權(quán)重可調(diào)整的卷積運算實現(xiàn)的。四、卷積神經(jīng)網(wǎng)絡(luò)在原來的多層神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)中,每一層的所有結(jié)點會按照連續(xù)線的權(quán)重向前計算,成為下一層結(jié)點的輸出。而每一條權(quán)重連結(jié)線都彼此不同,互不共享。每一個下一層結(jié)點的值與前一層所有結(jié)點都相關(guān)。與普通多層神經(jīng)網(wǎng)絡(luò)不同的是,卷積神經(jīng)網(wǎng)絡(luò)里,有特征抽取層與降維層,這些層的結(jié)點連結(jié)是部分連接且,一幅特征圖由一個卷積核生成,這一幅特征圖上的所有結(jié)點共享這一組卷積核的參數(shù)。這里我們設(shè)計一個5層的卷積神經(jīng)網(wǎng)絡(luò),一個輸入層,一個輸出層,2個特征提取層,一個全連接的隱藏層。下面詳細說明每一層的設(shè)計思路。在一般的介紹卷積神經(jīng)網(wǎng)絡(luò)的文章中你可能會看到在特征層之間還有2層降維層,在這里我們將卷積與降維同步進行,只用在卷積運算時,遍歷圖像中像素時按步長間隔遍歷即可。輸入層:普通的多層神經(jīng)網(wǎng)絡(luò),第一層就是特征向量。一般圖像經(jīng)過人為的特征挑選,通過特征函數(shù)計算得到特征向量,并作為神經(jīng)網(wǎng)絡(luò)的輸入。而卷積神經(jīng)網(wǎng)絡(luò)的輸出層則為整個圖像,如上圖示例29*29,那么我們可以將圖像按列展開,形成841個結(jié)點。而第一層的結(jié)點向前沒有任何的連結(jié)線。第1層:第1層是特征層,它是由6個卷積模板與第一層的圖像做卷積形成的6幅13*13的圖像。也就是說這一層中我們算上一個偏置權(quán)重,一共有只有〔5*5+1*6=156權(quán)重參數(shù),但是,第二層的結(jié)點是將6張圖像按列展開,即有6*13*13=1014個結(jié)點。而第2層構(gòu)建的真正難點在于,連結(jié)線的設(shè)定,當(dāng)前層的結(jié)點并不是與前一層的所有結(jié)點相連,而是只與25鄰域點連接,所以第二層一定有〔25+1*13*13*6=26364條連線,但是這些連結(jié)線共享了156個權(quán)值。按前面多層網(wǎng)絡(luò)C++的設(shè)計中,每個連線對象有2個成員,一個是權(quán)重的索引,一個是上一層結(jié)點的索引,所以這里面要正確的設(shè)置好每個連線的索引值,這也是卷積神經(jīng)網(wǎng)絡(luò)與一般全連結(jié)層的區(qū)別。第2層:第2層也是特征層,它是由50個特征圖像組成,每個特征圖像是5*5的大小,這個特征圖像上的每一點都是由前一層6張?zhí)卣鲌D像中每個圖像取25個鄰域點最后在一起加權(quán)而成,所以每個點也就是一個結(jié)點有〔5*5+1*6=156個連結(jié)線,那么當(dāng)前層一共有5*5*50=1250個結(jié)點,所以一共有195000個權(quán)重連結(jié)線,但是只有〔5*5+1*6*50=7800個權(quán)重參數(shù),每個權(quán)重連結(jié)線的值都可以在7800個權(quán)重參數(shù)數(shù)組中找到索引。所以第3層的關(guān)鍵也是,如何建立好每根連結(jié)線的權(quán)重索引與與前一層連結(jié)的結(jié)點的索引。第3層:和普通多神經(jīng)網(wǎng)絡(luò)沒有區(qū)別了,是一個隱藏層,有100個結(jié)點構(gòu)成,每個結(jié)點與上一層中1250個結(jié)點相聯(lián),共有125100個權(quán)重與125100個連結(jié)線。第4層:輸出層,它個結(jié)點個數(shù)與分類數(shù)目有關(guān),假設(shè)這里我們設(shè)置為10類,則輸出層為10個結(jié)點,相應(yīng)的期望值的設(shè)置在多層神經(jīng)網(wǎng)絡(luò)里已經(jīng)介紹過了,每個輸出結(jié)點與上面隱藏層的100個結(jié)點相連,共有〔100+1*10=1010條連結(jié)線,1010個權(quán)重。從上面可以看出,卷積神經(jīng)網(wǎng)絡(luò)的核心在于卷積層的創(chuàng)建,所以在設(shè)計CNNLayer類的時候,需要兩種創(chuàng)建網(wǎng)絡(luò)層的成員函數(shù),一個用于創(chuàng)建普通的全連接層,一個用于創(chuàng)建卷積層。1classCNNlayer2{3private:4CNNlayer*preLayer;5vector<CNNneural>m_neurals;6vector<double>m_weights;7public:8CNNlayer<>{preLayer=nullptr;}9//創(chuàng)建卷積層10voidcreateConvLayer<unsignedcurNumberOfNeurals,unsignedpreNumberOfNeurals,unsignedpreNumberOfFeatMaps,unsignedcurNumberOfFeatMaps>;11//創(chuàng)建普通層12voidcreateLayer<unsignedcurNumberOfNeurals,unsignedpreNumberOfNeurals>;13voidbackPropagate<vector<double>&dErrWrtDxn,vector<double>&dErrWrtDxnm,doubleeta>;14};創(chuàng)建普通層,在前面介紹的多層神經(jīng)網(wǎng)絡(luò)中已經(jīng)給出過代碼,它接收兩個參數(shù),一個是前面一層結(jié)點數(shù),一個是當(dāng)前層結(jié)點數(shù)。而卷積層的創(chuàng)建則復(fù)雜的多,所有連結(jié)線的索引值的確定需要對整個網(wǎng)絡(luò)有較清楚的了解。這里設(shè)計的createConvLayer函數(shù),它接收4個參數(shù),分別對應(yīng),當(dāng)前層結(jié)點數(shù),前一層結(jié)點數(shù),前一層特征圖的個數(shù)和當(dāng)前層特征圖像的個數(shù)。下面是C++代碼,要理解這一部分可以會稍有點難度,因為特征圖實際中都被按列展開了,所以鄰域這個概念會比較抽象,我們考慮把特征圖像還原,從圖像的角度去考慮。1voidCNNlayer::createConvLayer2<unsignedcurNumberOfNeurals,unsignedpreNumberOfNeurals,unsignedpreNumberOfFeatMaps,unsignedcurNumberOfFeatMaps>3{4//前一層和當(dāng)前層特征圖的結(jié)點數(shù)5unsignedpreImgSize=preNumberOfNeurals/preNumberOfFeatMaps;6unsignedcurImgSize=curNumberOfNeurals/curNumberOfFeatMaps;78//初始化權(quán)重9unsignednumberOfWeights=preNumberOfFeatMaps*curNumberOfFeatMaps*<5*5+1>;10for<unsignedi=0;i!=numberOfWeights;i++>11{12m_weights.push_back<0.05*rand<>/RAND_MAX>;13}14//建立所有連結(jié)線1516for<unsignedi=0;i!=curNumberOfFeatMaps;i++>17{18unsignedimgRow=sqrt<preImgSize>;//上一層特征圖像的大小,imgRow=imgCol19//間隙2進行取樣,鄰域周圍25個點20for<intc=2;c<imgRow-2;c=c+2>21{22for<intr=2;r<imgRow-2;r=r+2>23{24CNNneuralneural;25for<unsignedk=0;k!=preNumberOfNeurals;k++>26{27for<intkk=0;kk<<5*5+1>;kk++>28{29CNNconnectionconnection;30//權(quán)重的索引31connection.weightIdx=i*<curNumberOfFeatMaps*<5*5+1>>+k*<5*5+1>+kk;32//結(jié)點的索引33connection.neuralIdx=k*preImgSize+c*imgRow+r;34neural.m_connections.push_back<connection>;35}36m_neurals.push_back<neural>;37}38}39}40}41}五、訓(xùn)練與識別整個網(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é)點的連結(jié)方式是部分連結(jié),多個連結(jié)線共享權(quán)重。而多層神經(jīng)網(wǎng)絡(luò)前后兩層之間結(jié)點是全連結(jié)。除了這以外,權(quán)值更新、訓(xùn)練、識別都是一致的。訓(xùn)練得到一組權(quán)值,也就是說在這組權(quán)值下網(wǎng)絡(luò)可以更好的提取圖像特征用于分類識別。關(guān)于源碼的問題:個人非常不推薦直接用別人的源碼,所以我的博客里所有文章不會給出整個工程的源碼,但是會給出一些核心函數(shù)的代碼,如果你仔細閱讀文章,一定能夠很好的理解算法的核心思想。嘗試著去自己實現(xiàn),會對你的理解更有幫助。有什么疑問可以直接在下面留言。轉(zhuǎn)載自:卷積神經(jīng)網(wǎng)絡(luò)〔CNN1.概述卷積神經(jīng)網(wǎng)絡(luò)是一種特殊的深層的神經(jīng)網(wǎng)絡(luò)模型,它的特殊性體現(xiàn)在兩個方面,一方面它的神經(jīng)元間的連接是非全連接的,另一方面同一層中某些神經(jīng)元之間的連接的權(quán)重是共享的〔即相同的。它的非全連接和權(quán)值共享的網(wǎng)絡(luò)結(jié)構(gòu)使之更類似于生物神經(jīng)網(wǎng)絡(luò),降低了網(wǎng)絡(luò)模型的復(fù)雜度〔對于很難學(xué)習(xí)的深層結(jié)構(gòu)來說,這是非常重要的,減少了權(quán)值的數(shù)量。卷積網(wǎng)絡(luò)最初是受視覺神經(jīng)機制的啟發(fā)而設(shè)計的,是為識別二維形狀而設(shè)計的一個多層感知器,這種網(wǎng)絡(luò)結(jié)構(gòu)對平移、比例縮放、傾斜或者共他形式的變形具有高度不變性。1962年Hubel和Wiesel通過對貓視覺皮層細胞的研究,提出了感受野<receptivefield>的概念,1984年日本學(xué)者Fukushima基于感受野概念提出的神經(jīng)認(rèn)知機<neocognitron>模型,它可以看作是卷積神經(jīng)網(wǎng)絡(luò)的第一個實現(xiàn)網(wǎng)絡(luò),也是感受野概念在人工神經(jīng)網(wǎng)絡(luò)領(lǐng)域的首次應(yīng)用。神經(jīng)認(rèn)知機將一個視覺模式分解成許多子模式<特征>,然后進入分層遞階式相連的特征平面進行處理,它試圖將視覺系統(tǒng)模型化,使其能夠在即使物體有位移或輕微變形的時候,也能完成識別。神經(jīng)認(rèn)知機能夠利用位移恒定能力從激勵模式中學(xué)習(xí),并且可識別這些模式的變化形。在其后的應(yīng)用研究中,Fukushima將神經(jīng)認(rèn)知機主要用于手寫數(shù)字的識別。隨后,國內(nèi)外的研究人員提出多種卷積神經(jīng)網(wǎng)絡(luò)形式,在郵政編碼識別〔Y.LeCunetc、車牌識別和人臉識別等方面得到了廣泛的應(yīng)用。2.CNN的結(jié)構(gòu)卷積網(wǎng)絡(luò)是為識別二維形狀而特殊設(shè)計的一個多層感知器,這種網(wǎng)絡(luò)結(jié)構(gòu)對平移、比例縮放、傾斜或者共他形式的變形具有高度不變性。這些良好的性能是網(wǎng)絡(luò)在有監(jiān)督方式下學(xué)會的,網(wǎng)絡(luò)的結(jié)構(gòu)主要有稀疏連接和權(quán)值共享兩個特點,包括如下形式的約束:
1特征提取。每一個神經(jīng)元從上一層的局部接受域得到突觸輸人,因而迫使它提取局部特征。一旦一個特征被提取出來,只要它相對于其他特征的位置被近似地保留下來,它的精確位置就變得沒有那么重要了。
2特征映射。網(wǎng)絡(luò)的每一個計算層都是由多個特征映射組成的,每個特征映射都是平面形式的。平面中單獨的神經(jīng)元在約束下共享相同的突觸權(quán)值集,這種結(jié)構(gòu)形式具有如下的有益效果:a.平移不變性。b.自由參數(shù)數(shù)量的縮減<通過權(quán)值共享實現(xiàn)>。
3.子抽樣。每個卷積層跟著一個實現(xiàn)局部平均和子抽樣的計算層,由此特征映射的分辨率降低。這種操作具有使特征映射的輸出對平移和其他形式的變形的敏感度下降的作用。2.1稀疏連接<SparseConnectivity>卷積網(wǎng)絡(luò)通過在相鄰兩層之間強制使用局部連接模式來利用圖像的空間局部特性,在第m層的隱層單元只與第m-1層的輸入單元的局部區(qū)域有連接,第m-1層的這些局部區(qū)域被稱為空間連續(xù)的接受域。我們可以將這種結(jié)構(gòu)描述如下:
設(shè)第m-1層為視網(wǎng)膜輸入層,第m層的接受域的寬度為3,也就是說該層的每個單元與且僅與輸入層的3個相鄰的神經(jīng)元相連,第m層與第m+1層具有類似的鏈接規(guī)則,如下圖所示??梢钥吹絤+1層的神經(jīng)元相對于第m層的接受域的寬度也為3,但相對于輸入層的接受域為5,這種結(jié)構(gòu)將學(xué)習(xí)到的過濾器〔對應(yīng)于輸入信號中被最大激活的單元限制在局部空間模式〔因為每個單元對它接受域外的variation不做反應(yīng)。從上圖也可以看出,多個這樣的層堆疊起來后,會使得過濾器〔不再是線性的逐漸成為全局的〔也就是覆蓋到了更大的視覺區(qū)域。例如上圖中第m+1層的神經(jīng)元可以對寬度為5的輸入進行一個非線性的特征編碼。2.2權(quán)值共享<SharedWeights>在卷積網(wǎng)絡(luò)中,每個稀疏過濾器hi通過共享權(quán)值都會覆蓋整個可視域,這些共享權(quán)值的單元構(gòu)成一個特征映射,如下圖所示。在圖中,有3個隱層單元,他們屬于同一個特征映射。同種顏色的鏈接的權(quán)值是相同的,我們?nèi)匀豢梢允褂锰荻认陆档姆椒▉韺W(xué)習(xí)這些權(quán)值,只需要對原始算法做一些小的改動,這里共享權(quán)值的梯度是所有共享參數(shù)的梯度的總和。我們不禁會問為什么要權(quán)重共享呢?一方面,重復(fù)單元能夠?qū)μ卣鬟M行識別,而不考慮它在可視域中的位置。另一方面,權(quán)值共享使得我們能更有效的進行特征抽取,因為它極大的減少了需要學(xué)習(xí)的自由變量的個數(shù)。通過控制模型的規(guī)模,卷積網(wǎng)絡(luò)對視覺問題可以具有很好的泛化能力。2.3TheFullModel卷積神經(jīng)網(wǎng)絡(luò)是一個多層的神經(jīng)網(wǎng)絡(luò),每層由多個二維平面組成,而每個平面由多個獨立神經(jīng)元組成。網(wǎng)絡(luò)中包含一些簡單元和復(fù)雜元,分別記為S-元和C-元。S-元聚合在一起組成S-面,S-面聚合在一起組成S-層,用Us表示。C-元、C-面和C-層<Us>之間存在類似的關(guān)系。網(wǎng)絡(luò)的任一中間級由S-層與C-層串接而成,而輸入級只含一層,它直接接受二維視覺模式,樣本特征提取步驟已嵌入到卷積神經(jīng)網(wǎng)絡(luò)模型的互聯(lián)結(jié)構(gòu)中。一般地,Us為特征提取層,每個神經(jīng)元的輸入與前一層的局部感受野相連,并提取該局部的特征,一旦該局部特征被提取后,它與其他特征間的位置關(guān)系也隨之確定下來;Uc是特征映射層,網(wǎng)絡(luò)的每個計算層由多個特征映射組成,每個特征映射為一個平面,平面上所有神經(jīng)元的權(quán)值相等。特征映射結(jié)構(gòu)采用影響函數(shù)核小的sigmoid函數(shù)作為卷積網(wǎng)絡(luò)的激活函數(shù),使得特征映射具有位移不變性<這一句表示沒看懂,那位如果看懂了,請給我講解一下>。此外,由于一個映射面上的神經(jīng)元共享權(quán)值,因而減少了網(wǎng)絡(luò)自由參數(shù)的個數(shù),降低了網(wǎng)絡(luò)參數(shù)選擇的復(fù)雜度。卷積神經(jīng)網(wǎng)絡(luò)中的每一個特征提取層<S-層>都緊跟著一個用來求局部平均與二次提取的計算層<C-層>,這種特有的兩次特征提取結(jié)構(gòu)使網(wǎng)絡(luò)在識別時對輸入樣本有較高的畸變?nèi)萑棠芰?。下圖是一個卷積網(wǎng)絡(luò)的實例圖中的卷積網(wǎng)絡(luò)工作流程如下,輸入層由32×32個感知節(jié)點組成,接收原始圖像。然后,計算流程在卷積和子抽樣之間交替進行,如下所述:第一隱藏層進行卷積,它由8個特征映射組成,每個特征映射由28×28個神經(jīng)元組成,每個神經(jīng)元指定一個5×5的接受域;第二隱藏層實現(xiàn)子抽樣和局部平均,它同樣由8個特征映射組成,但其每個特征映射由14×14個神經(jīng)元組成。每個神經(jīng)元具有一個2×2的接受域,一個可訓(xùn)練系數(shù),一個可訓(xùn)練偏置和一個sigmoid激活函數(shù)??捎?xùn)練系數(shù)和偏置控制神經(jīng)元的操作點。第三隱藏層進行第二次卷積,它由20個特征映射組成每個特征映射由10×10個神經(jīng)元組成。該隱藏層中的每個神經(jīng)元可能具有和下一個隱藏層幾個特征映射相連的突觸連接,它以與第一個卷積層相似的方式操作。第四個隱藏層進行第二次子抽樣和局部平均汁算。它由20個特征映射組成,但每個特征映射由5×5個神經(jīng)元組成,它以與第一次抽樣相似的方式操作。第五個隱藏層實現(xiàn)卷積的最后階段,它由120個神經(jīng)元組成,每個神經(jīng)元指定一個5×5的接受域。最后是個全連接層,得到輸出向量。相繼的計算層在卷積和抽樣之間的連續(xù)交替,我們得到一個"雙尖塔"的效果,也就是在每個卷積或抽樣層,隨著空間分辨率下降,與相應(yīng)的前一層相比特征映射的數(shù)量增加。卷積之后進行子抽樣的思想是受到動物視覺系統(tǒng)中的"簡單的"細胞后面跟著"復(fù)雜的"細胞的想法的啟發(fā)而產(chǎn)生的。圖中所示的多層感知器包含近似100000個突觸連接,但只有大約2600個自由參數(shù)。自由參數(shù)在數(shù)量上顯著地減少是通過權(quán)值共享獲得的,學(xué)習(xí)機器的能力〔以VC維的形式度量因而下降,這又提高它的泛化能力。而且它對自由參數(shù)的調(diào)整通過反向傳播學(xué)習(xí)的隨機形式來實現(xiàn)。另一個顯著的特點是使用權(quán)值共享使得以并行形式實現(xiàn)卷積網(wǎng)絡(luò)變得可能。這是卷積網(wǎng)絡(luò)對全連接的多層感知器而言的另一個優(yōu)點。3.CNN的學(xué)習(xí)總體而言,前面提到的卷積網(wǎng)絡(luò)可以簡化為下圖所示模型:其中,input到C1、S4到C5、C5到output是全連接,C1到S2、C3到S4是一一對應(yīng)的連接,S2到C3為了消除網(wǎng)絡(luò)對稱性,去掉了一部分連接,可以讓特征映射更具多樣性。需要注意的是C5卷積核的尺寸要和S4的輸出相同,只有這樣才能保證輸出是一維向量。3.1卷積層的學(xué)習(xí)卷積層的典型結(jié)構(gòu)如下圖所示。卷積層的前饋運算是通過如下算法實現(xiàn)的:卷積層的輸出=Sigmoid<Sum<卷積>+偏移量>其中卷積核和偏移量都是可訓(xùn)練的。下面是其核心代碼:12345678910111213141516171819ConvolutionLayer::fprop<input,output>{//取得卷積核的個數(shù)intn=kernel.GetDim<0>;for<inti=0;i<n;i++>{//第i個卷積核對應(yīng)輸入層第a個特征映射,輸出層的第b個特征映射//這個卷積核可以形象的看作是從輸入層第a個特征映射到輸出層的第b個特征映射的一個鏈接inta=table[i][0],b=table[i][1];//用第i個卷積核和輸入層第a個特征映射做卷積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>;}其中,input是n1×n2×n3的矩陣,n1是輸入層特征映射的個數(shù),n2是輸入層特征映射的寬度,n3是輸入層特征映射的高度。output,sum,convolution,bias是n1×<n2-kw+1>×<n3-kh+1>的矩陣,kw,kh是卷積核的寬度高度<圖中是5×5>。kernel是卷積核矩陣。table是連接表,即如果第a輸入和第b個輸出之間有連接,table里就會有[a,b]這一項,而且每個連接都對應(yīng)一個卷積核。卷積層的反饋運算的核心代碼如下:123456789101112131415161718ConvolutionLayer::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];}//取得卷積核的個數(shù)intn=kernel.GetDim<0>;for<inti=0;i<n;i++>{inta=table[i][0],b=table[i][1];//用第i個卷積核和第b個輸出層反向卷積〔即輸出層的一點乘卷積模板返回給輸入層,并把結(jié)果累加到第a個輸入層input_dx[a]+=DConv<sum_dx[b],kernel[i]>;//用同樣的方法計算卷積模板的梯度kernel_dx[i]+=DConv<sum_dx[b],input[a]>;}}其中in_dx,out_dx的結(jié)構(gòu)和input,output相同,代表的是相應(yīng)點的梯度。3.2子采樣層的學(xué)習(xí)子采樣層的典型結(jié)構(gòu)如下圖所示。類似的字采樣層的輸出的計算式為:輸出=Sigmoid<采樣*權(quán)重+偏移量>其核心代碼如下:123456789101112131415161718SubSamplingLayer::fprop<input,output>{intn1=input.GetDim<0>;intn2=input.GetDim<1>;intn3=input.GetDim<2>;for<inti=0;i<n1;i++>{for<intj=0;j<n2;j++>{for<intk=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>;}子采樣層的反饋運算的核心代碼如下:1234567891011121314151617181920SubSamplingLayer::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];}}}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代碼。References[1]LearnDeepArchitecturesforAI,Chapter4.5.
[2]DeepLear
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 跨境電商建站平臺
- 智能家居 系統(tǒng)
- 市場競爭對手分析數(shù)據(jù)表
- 智能制造技術(shù)生產(chǎn)流水線操作手冊
- 三農(nóng)村公共服務(wù)智能化提升方案
- 交通物流行業(yè)綠色運輸策略方案
- 物流行業(yè)無人配送技術(shù)推廣方案
- 附件3醫(yī)院護類人員年終理論考試500題練習(xí)卷附答案
- 鄉(xiāng)村綠化美化服務(wù)方案
- 三農(nóng)產(chǎn)品電商助力農(nóng)業(yè)新興業(yè)態(tài)培育與發(fā)展方案
- 2019版外研社高中英語選擇性必修二Unit 1 Growing up 單詞表
- 路基接觸網(wǎng)基礎(chǔ)技術(shù)交底
- 氣瓶充裝安全及培訓(xùn)課件PPT幻燈片
- (高清版)輻射供暖供冷技術(shù)規(guī)程JGJ142-2012
- JTT 1295—2019道路大型物件運輸規(guī)范_(高清-最新)
- 土壤固化土施工技術(shù)導(dǎo)則
- VAR模型Johansen協(xié)整檢驗在eviews中的具體操作步驟及結(jié)果解釋
- 冷凍面團項目市場分析
- 北工大電子課程設(shè)計報告數(shù)電自行車?yán)锍瘫?
- 加油站法律法規(guī)符合性評價
- 5外科--丹毒下肢丹毒中醫(yī)診療方案2017年版
評論
0/150
提交評論