![卷積神經(jīng)網(wǎng)絡(luò)(CNN)代碼實現(xiàn)(MNIST)解析_第1頁](http://file4.renrendoc.com/view/1756ba9605cbacf0a27dadebe9b46b77/1756ba9605cbacf0a27dadebe9b46b771.gif)
![卷積神經(jīng)網(wǎng)絡(luò)(CNN)代碼實現(xiàn)(MNIST)解析_第2頁](http://file4.renrendoc.com/view/1756ba9605cbacf0a27dadebe9b46b77/1756ba9605cbacf0a27dadebe9b46b772.gif)
![卷積神經(jīng)網(wǎng)絡(luò)(CNN)代碼實現(xiàn)(MNIST)解析_第3頁](http://file4.renrendoc.com/view/1756ba9605cbacf0a27dadebe9b46b77/1756ba9605cbacf0a27dadebe9b46b773.gif)
![卷積神經(jīng)網(wǎng)絡(luò)(CNN)代碼實現(xiàn)(MNIST)解析_第4頁](http://file4.renrendoc.com/view/1756ba9605cbacf0a27dadebe9b46b77/1756ba9605cbacf0a27dadebe9b46b774.gif)
![卷積神經(jīng)網(wǎng)絡(luò)(CNN)代碼實現(xiàn)(MNIST)解析_第5頁](http://file4.renrendoc.com/view/1756ba9605cbacf0a27dadebe9b46b77/1756ba9605cbacf0a27dadebe9b46b775.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、卷積神經(jīng)網(wǎng)絡(luò)(CNN)代碼實現(xiàn)(MNIST)解析共7層:依次為輸入層、C1層、S2層、C3層、S4層、C5層、輸出層,C代表卷積層(特征提取),S代表降采樣層或池化層(Pooling),輸出層為全連接層。1.各層權(quán)值、偏置(閾值)初始化:各層權(quán)值、偏置個數(shù)計算如下:、輸入層:預(yù)處理后的32*32圖像數(shù)據(jù),無權(quán)值和偏置;、C1層:卷積窗大小5*5,輸出特征圖數(shù)量6,卷積窗種類1*6=6,輸出特征圖大小28*28,因此可訓(xùn)練參數(shù)(權(quán)值+偏置):(5*5*1)*6+6=150+6;、S2層:卷積窗大小2*2,輸出下采樣圖數(shù)量6,卷積窗種類6,輸出下采樣圖大小14*14,因此可訓(xùn)練參數(shù)(權(quán)值+偏置):
2、1*6+6=6+6;、C3層:卷積窗大小5*5,輸出特征圖數(shù)量16,卷積窗種類6*16=96,輸出特征圖大小10*10,因此可訓(xùn)練參數(shù)(權(quán)值+偏置):(5*5*6)*16+16=2400+16;、S4層:卷積窗大小2*2,輸出下采樣圖數(shù)量16,卷積窗種類16,輸出下采樣圖大小5*5,因此可訓(xùn)練參數(shù)(權(quán)值+偏置):1*16+16=16+16;、C5層:卷積窗大小5*5,輸出特征圖數(shù)量120,卷積窗種類16*120=1920,輸出特征圖大小1*1,因此可訓(xùn)練參數(shù)(權(quán)值+偏置):(5*5*16)*120+120=48000+120;、輸出層:卷積窗大小1*1,輸出特征圖數(shù)量10,卷積窗種類120*1
3、0=1200,輸出特征圖大小1*1,因此可訓(xùn)練參數(shù)(權(quán)值+偏置):(1*120)*10+10=1200+10.代碼段如下:cppviewplaincopy#definenum_map_input_CNN#definenum_map_C1_CNNcppviewplaincopy#definenum_map_input_CNN#definenum_map_C1_CNN#definenum_map_S2_CNN#definenum_map_C3_CNN#definenum_map_S4_CNN#definenum_map_C5_CNN#definenum_map_output_CNN#definel
4、en_weight_C1_CNN#definelen_bias_C1_CNN1/輸入層map個數(shù)6/C1層map個數(shù)6/S2層map個數(shù)16/C3層map個數(shù)16/S4層map個數(shù)120/C5層map個數(shù)10輸出層map個數(shù)150/C1層權(quán)值數(shù),(5*5*1)*6=1506/C1層閾值數(shù),6#definelen_weight_S2_CNN#definelen_bias_S2_CNN#definelen_weight_C3_CNN#definelen_bias_C3_CNN#definelen_weight_S4_CNN#definelen_bias_S4_CNN#definelen_weigh
5、t_C5_CNN#definelen_bias_C5_CNN#definelen_weight_output_CNN#definelen_bias_output_CNN#definenum_neuron_input_CNN#definenum_neuron_C1_CNN#definenum_neuron_S2_CNN#definenum_neuron_C3_CNN#definenum_neuron_S4_CNN#definenum_neuron_C5_CNN#definenum_neuron_output_CNN權(quán)值、偏置初始化:6/S2#definelen_weight_S2_CNN#def
6、inelen_bias_S2_CNN#definelen_weight_C3_CNN#definelen_bias_C3_CNN#definelen_weight_S4_CNN#definelen_bias_S4_CNN#definelen_weight_C5_CNN#definelen_bias_C5_CNN#definelen_weight_output_CNN#definelen_bias_output_CNN#definenum_neuron_input_CNN#definenum_neuron_C1_CNN#definenum_neuron_S2_CNN#definenum_neur
7、on_C3_CNN#definenum_neuron_S4_CNN#definenum_neuron_C5_CNN#definenum_neuron_output_CNN權(quán)值、偏置初始化:6/S2層閾值數(shù),62400/C3層權(quán)值數(shù),(5*5*6)*16=240016/C3層閾值數(shù),1616/S4層權(quán)值數(shù),1*16=1616S4層閾值數(shù),1648000/C5層權(quán)值數(shù),(5*5*16)*120=48000120/C5層閾值數(shù),1201200/輸出層權(quán)值數(shù),(1*120)*10=120010/輸出層閾值數(shù),101024/輸入層神經(jīng)元數(shù),(32*32)*1=10244704/C1層神經(jīng)元數(shù),(28*2
8、8)*6=47041176S2層神經(jīng)元數(shù),(14*14)*6=11761600/C3層神經(jīng)元數(shù),(10*10)*16=1600400S4層神經(jīng)元數(shù),(5*5)*16=400120/C5層神經(jīng)元數(shù),(1*1)*120=12010/輸出層神經(jīng)元數(shù),(1*1)*10=10、權(quán)值使用函數(shù)uniform_real_distribution均勻分布初始化,tiny-cnn中每次初始化權(quán)值數(shù)值都相同,這里作了調(diào)整,使每次初始化的權(quán)值均不同。每層權(quán)值初始化大小范圍都不一樣;、所有層的偏置均初始化為0.代碼段如下:cppviewplaincopydoubleCNN:uniform_rand(doublemin,
9、doublemax)/staticstd:mt19937gen(1);std:random_devicerd;std:mt19937gen(rd();std:uniform_real_distributiondst(min,max);returndst(gen);boolCNN:uniform_rand(double*src,intlen,doublemin,doublemax)for(inti=0;ilen;i+)srci=uniform_rand(min,max);returntrue;boolCNN:initWeightThreshold()srand(time(0)+rand();co
10、nstdoublescale=6.0;doublemin_=-std:sqrt(scale/(25.0+150.0);doublemax_=std:sqrt(scale/(25.0+150.0);uniform_rand(weight_C1,len_weight_C1_CNN,min_,max_);for(inti=0;ilen_bias_C1_CNN;i+)bias_C1i=0.0;min_=-std:sqrt(scale/(4.0+1.0);max_=std:sqrt(scale/(4.0+1.0);uniform_rand(weight_S2,len_weight_S2_CNN,min_
11、,max_);for(inti=0;ilen_bias_S2_CNN;i+)bias_S2i=0.0;min_=-std:sqrt(scale/(150.0+400.0);max_=std:sqrt(scale/(150.0+400.0);uniform_rand(weight_C3,len_weight_C3_CNN,min_,max_);for(inti=0;ilen_bias_C3_CNN;i+)bias_C3i=0.0;min_=-std:sqrt(scale/(4.0+1.0);max_=std:sqrt(scale/(4.0+1.0);uniform_rand(weight_S4,
12、len_weight_S4_CNN,min_,max_);for(inti=0;ilen_bias_S4_CNN;i+)bias_S4i=0.0;min_=-std:sqrt(scale/(400.0+3000.0);max_=std:sqrt(scale/(400.0+3000.0);uniform_rand(weight_C5,len_weight_C5_CNN,min_,max_);for(inti=0;ilen_bias_C5_CNN;i+)bias_C5i=0.0;min_=-std:sqrt(scale/(120.0+10.0);max_=std:sqrt(scale/(120.0
13、+10.0);uniform_rand(weight_output,len_weight_output_CNN,min_,max_);for(inti=0;ilen_bias_output_CNN;i+)bias_outputi=0.0;returntrue;2.加載MNIST數(shù)據(jù):關(guān)于MNIST的介紹可以參考:/fengbingchun/article/details/49611549使用MNIST庫作為訓(xùn)練集和測試集,訓(xùn)練樣本集為60000個,測試樣本集為10000個。(1)、MNIST庫中圖像原始大小為28*28,這里縮放為32*32,數(shù)據(jù)取值范圍為-1,1,擴(kuò)充值均取-1,作為輸入層輸
14、入數(shù)據(jù)。代碼段如下:cppviewplaincopystaticvoidreadMnistImages(std:stringfilename,double*data_dst,intnum_image)constintwidth_src_image=28;constintheight_src_image=28;constintx_padding=2;constinty_padding=2;constdoublescale_min=-1;constdoublescale_max=1;std:ifstreamfile(filename,std:ios:binary);assert(file.is_o
15、pen();intmagic_number=0;intnumber_of_images=0;intn_rows=0;intn_cols=0;file.read(char*)&magic_number,sizeof(magic_number);magic_number=reverseInt(magic_number);file.read(char*)&number_of_images,sizeof(number_of_images);number_of_images=reverseInt(number_of_images);assert(number_of_images=num_image);f
16、ile.read(char*)&n_rows,sizeof(n_rows);n_rows=reverseInt(n_rows);file.read(char*)&n_cols,sizeof(n_cols);n_cols=reverseInt(n_cols);assert(n_rows=height_src_image&n_cols=width_src_image);intsize_single_image=width_image_input_CNN*height_image_input_CNN;for(inti=0;inumber_of_images;+i)intaddr=size_singl
17、e_image*i;for(intr=0;rn_rows;+r)for(intc=0;cn_cols;+c)unsignedchartemp=0;file.read(char*)&temp,sizeof(temp);data_dstaddr+width_image_input_CNN*(r+y_padding)+c+x_padding=(temp/255.0)*(scale_max-scale_min)+scale_min;(2)、對于Label,輸出層有10個節(jié)點,對應(yīng)位置的節(jié)點值設(shè)為0.8,其它節(jié)點設(shè)為-0.8,作為輸出層數(shù)據(jù)。代碼段如下:cppviewplaincopy在CODE上查看代
18、碼片派生到我的代碼片staticvoidreadMnistLabels(std:stringfilename,double*data_dst,intnum_image)constdoublescale_max=0.8;std:ifstreamfile(filename,std:ios:binary);assert(file.is_open();intmagic_number=0;intnumber_of_images=0;file.read(char*)&magic_number,sizeof(magic_number);magic_number=reverseInt(magic_number
19、);file.read(char*)&number_of_images,sizeof(number_of_images);number_of_images=reverseInt(number_of_images);assert(number_of_images=num_image);for(inti=0;inumber_of_images;+i)unsignedchartemp=0;file.read(char*)&temp,sizeof(temp);data_dsti*num_map_output_CNN+temp=scale_max;staticvoidreadMnistLabels(st
20、d:stringfilename,double*data_dst,intnum_image)constdoublescale_max=0.8;std:ifstreamfile(filename,std:ios:binary);assert(file.is_open();intmagic_number=0;intnumber_of_images=0;file.read(char*)&magic_number,sizeof(magic_number);magic_number=reverseInt(magic_number);file.read(char*)&number_of_images,si
21、zeof(number_of_images);number_of_images=reverseInt(number_of_images);assert(number_of_images=num_image);for(inti=0;inumber_of_images;+i)unsignedchartemp=0;file.read(char*)&temp,sizeof(temp);data_dsti*num_map_output_CNN+temp=scale_max;3.前向傳播:主要計算每層的神經(jīng)元值;其中C1層、C3層、C5層操作過程相同;S2層、S4層操作過程相同。、輸入層:神經(jīng)元數(shù)為(32
22、*32)*1=1024。、C1層:神經(jīng)元數(shù)為(28*28)*6=4704,分別用每一個5*5的卷積圖像去乘以32*32的圖像,獲得一個28*28的圖像,即對應(yīng)位置相加再求和,stride長度為1;一共6個5*5的卷積圖像,然后對每一個神經(jīng)元加上一個閾值,最后再通過tanh激活函數(shù)對每一神經(jīng)元進(jìn)行運算得到最終每一個神經(jīng)元的結(jié)果。激活函數(shù)的作用:它是用來加入非線性因素的,解決線性模型所不能解決的問題,提供網(wǎng)絡(luò)的非線性建模能力。如果沒有激活函數(shù),那么該網(wǎng)絡(luò)僅能夠表達(dá)線性映射,此時即便有再多的隱藏層,其整個網(wǎng)絡(luò)跟單層神經(jīng)網(wǎng)絡(luò)也是等價的。因此也可以認(rèn)為,只有加入了激活函數(shù)之后,深度神經(jīng)網(wǎng)絡(luò)才具備了分層的
23、非線性映射學(xué)習(xí)能力。代碼段如下:cppviewplaincopy在CODE上查看代碼片派生到我的代碼片doubleCNN:activation_function_tanh(doublex)doubleep=std:exp(x);doubleem=std:exp(-x);return(ep-em)/(ep+em);boolCNN:Forward_C1()for(into=0;ofor(into=0;onum_map_C1_CNN;o+)for(intinc=0;incintaddr1=width_kernel_conv_CNN,num_map_input_CNN);intaddr2num_map
24、_input_CNN;inc+)get_index(0,0,num_map_input_CNN*o+inc,height_kernel_conv_CNN,num_map_C1_CNN*get_index(0,0,inc,width_image_input_CNN,height_image_input_CNN,num_map_input_CNN);intaddr3=get_index(0,0,o,width_image_C1_CNN,height_image_C1_CNN,num_map_C1_CNN);constdouble*pw=&weight_C10+addr1;constdouble*p
25、i=data_single_image+addr2;double*pa=&neuron_C10+addr3;for(inty=0;yheight_image_C1_CNN;y+)for(intx=0;xwidth_image_C1_CNN;x+)constdouble*ppw=pw;constdouble*ppi=pi+y*width_image_input_CNN+x;doublesum=0.0;for(intwy=0;wyheight_kernel_conv_CNN;wy+)for(intwx=0;wxwidth_kernel_conv_CNN;wx+)sum+=*ppw+*ppiwy*w
26、idth_image_input_CNN+wx;pay*width_image_C1_CNN+x+=sum;intaddr3=get_index(0,0,o,width_image_C1_CNN,height_image_C1_CNN,num_map_C1_CNN);double*pa=&neuron_C10+addr3;doubleb=bias_C1o;for(inty=0;yheight_image_C1_CNN;y+)for(intx=0;xwidth_image_C1_CNN;x+)payneuron_S2i+=neuron_C1connectionsindex.second;widt
27、h_image_C1_CNN+neuron_S2i+=neuron_C1connectionsindex.second;for(inti=0;inum_neuron_C1_CNN;i+)neuron_C1i=activation_function_tanh(neuron_C1i);returntrue;(3)、S2層:神經(jīng)元數(shù)為(14*14)*6=1176,對C1中6個28*28的特征圖生成6個14*14的下采樣圖,相鄰四個神經(jīng)元分別乘以同一個權(quán)值再進(jìn)行相加求和,再求均值即除以4,然后再加上一個閾值,最后再通過tanh激活函數(shù)對每一神經(jīng)元進(jìn)行運算得到最終每一個神經(jīng)代碼段如下:cppviewpl
28、aincopy在CODE上查看代碼片派生到我的代碼片boolCNN:Forward_S2()init_variable(neuron_S2,0.0,num_neuron_S2_CNN);doublescale_factor=1.0/(width_kernel_pooling_CNN*height_kernel_pooling_CNN);assert(out2wi_S2.size()=num_neuron_S2_CNN);assert(out2bias_S2.size()=num_neuron_S2_CNN);for(inti=0;inum_neuron_S2_CNN;i+)constwi_co
29、nnections&connections=out2wi_S2i;neuron_S2i=0;for(intindex=0;indexconnections.size();index+)weight_S2connectionsindex.firstneuron_S2i*=scale_factor;neuron_S2i+=bias_S2out2bias_S2i;for(inti=0;inum_neuron_S2_CNN;i+)neuron_S2i=activation_function_tanh(neuron_S2i);returntrue;(4)、C3層:神經(jīng)元數(shù)為(10*10)*16=1600
30、,C3層實現(xiàn)方式與C1層完全相同,由S2中的6個14*14下采樣圖生成16個10*10特征圖,對于生成的每一個10*10的特征圖,是由6個5*5的卷積圖像去乘以6個14*14的下采樣圖,然后對應(yīng)位置相加求和,然后對每一個神經(jīng)元加上一個閾值,最后再通過tanh激活函數(shù)對每一神經(jīng)元進(jìn)行運算得到最終每一個神經(jīng)元的結(jié)果。也可按照Y.Lecun給出的表進(jìn)行計算,即對于生成的每一個10*10的特征圖,是由n個5*5的卷積圖像去乘以n個14*14的下采樣圖,其中n是小于6的,即不完全連接。這樣做的原因:第一,不完全的連接機(jī)制將連接的數(shù)量保持在合理的范圍內(nèi)。第二,也是最重要的,其破壞了網(wǎng)絡(luò)的對稱性。由于不同的
31、特征圖有不同的輸入,所以迫使他們抽取不同的特征。代碼段如下:cppviewplaincopy在CODE上查看代碼片派生到我的代碼片/connectiontableY.Lecun,1998Table.1#defineOtrue#defineXfalsestaticconstbooltbl616=O,X,X,X,O,O,O,X,X,O,O,O,O,X,O,O,O,O,X,X,X,O,O,O,X,X,O,O,O,O,X,O,O,O,O,X,X,X,O,O,O,X,X,O,X,O,O,O,X,O,O,O,X,X,O,O,O,O,X,X,O,X,O,O,X,X,O,O,O,X,X,O,O,O,O,X,O
32、,O,X,O,X,X,X,O,O,O,X,X,O,O,O,O,X,O,O,O;#undefO#undefXboolCNN:Forward_C3()init_variable(neuron_C3,0.0,num_neuron_C3_CNN);for(into=0;onum_map_C3_CNN;o+)for(intinc=0;incnum_map_S2_CNN;inc+)if(!tblinco)continue;intaddr1=get_index(0,0,num_map_S2_CNN*o+inc,width_kernel_conv_CNN,height_kernel_conv_CNN,num_
33、map_C3_CNN*num_map_S2_CNN);intaddr2=get_index(0,0,inc,width_image_S2_CNN,height_image_S2_CNN,num_map_S2_CNN);intaddr3=get_index(0,0,o,width_image_C3_CNN,height_image_C3_CNN,num_map_C3_CNN);constdouble*pw=&weight_C30+addr1;constdouble*pi=&neuron_S20+addr2;double*pa=&neuron_C30+addr3;for(inty=0;yheigh
34、t_image_C3_CNN;y+)for(intx=0;xwidth_image_C3_CNN;x+)constdouble*ppw=pw;constdouble*ppi=pi+y*width_image_S2_CNN+x;doublesum=0.0;for(intwy=0;wyheight_kernel_conv_CNN;wy+)for(intwx=0;wxwidth_kernel_conv_CNN;wx+)sum+=*ppw+*ppiwy*width_image_S2_CNN+wx;pay*width_image_C3_CNN+x+=sum;intaddr3=get_index(0,0,
35、o,width_image_C3_CNN,height_image_C3_CNN,num_map_C3_CNN);double*pa=&neuron_C30+addr3;doubleb=bias_C3o;for(inty=0;yheight_image_C3_CNN;y+)for(intx=0;xwidth_image_C3_CNN;x+)pay*width_image_C3_CNN+x+=b;for(inti=0;inum_neuron_C3_CNN;i+)neuron_C3i=activation_function_tanh(neuron_C3i);returntrue;(5)、S4層:神
36、經(jīng)元數(shù)為(5*5)*16=400,S4層實現(xiàn)方式與S2層完全相同,由C3中16個10*10的特征圖生成16個5*5下采樣圖,相鄰四個神經(jīng)元分別乘以同一個權(quán)值再進(jìn)行相加求和,再求均值即除以4,然后再加上一個閾值,最后再通過tanh激活函數(shù)對每一神經(jīng)元進(jìn)行運算得到最終每一個神經(jīng)元的結(jié)果。代碼段如下:cppviewplaincopy在CODE上查看代碼片派生到我的代碼片boolCNN:Forward_S4()doublescale_factor=1.0/(width_kernel_pooling_CNN*height_kernel_pooling_CNN);init_variable(neuron_
37、S4,0.0,num_neuron_S4_CNN);assert(out2wi_S4.size()=num_neuron_S4_CNN);assert(out2bias_S4.size()=num_neuron_S4_CNN);for(inti=0;inum_neuron_S4_CNN;i+)constwi_connections&connections=out2wi_S4i;neuron_S4i=0.0;for(intindex=0;indexconnections.size();index+)neuron_S4i+=weight_S4connectionsindex.first*neuro
38、n_C3connectionsindex.second;neuron_S4i*=scale_factor;neuron_S4i+=bias_S4out2bias_S4i;for(inti=0;inum_neuron_S4_CNN;i+)neuron_S4i=activation_function_tanh(neuron_S4i);returntrue;(6)、C5層:神經(jīng)元數(shù)為(1*1)*120=120,也可看為全連接層,C5層實現(xiàn)方式與Cl、C3層完全相同,由S4中16個5*5下采樣圖生成120個1*1特征圖,對于生成的每一個1*1的特征圖,是由16個5*5的卷積圖像去乘以16個5*5的下采
39、用圖,然后相加求和,然后對每一個神經(jīng)元加上一個閾值,最后再通過tanh激活函數(shù)對每一神經(jīng)元進(jìn)行運算得到最終每一個神經(jīng)元的結(jié)果。代碼段如下:cppviewplaincopy在CODE上查看代碼片派生到我的代碼片boolCNN:Forward_C5()init_variable(neuron_C5,0.0,num_neuron_C5_CNN);for(into=0;onum_map_C5_CNN;o+)for(intinc=0;incnum_map_S4_CNN;inc+)intaddr1=get_index(0,0,num_map_S4_CNN*o+inc,width_kernel_conv_C
40、NN,height_kernel_conv_CNN,num_map_C5_CNN*num_map_S4_CNN);intaddr2=get_index(0,0,inc,width_image_S4_CNN,height_image_S4_CNN,num_map_S4_CNN);intaddr3=get_index(0,0,o,width_image_C5_CNN,height_image_C5_CNN,num_map_C5_CNN);constdouble*pw=&weight_C50+addr1;constdouble*pi=&neuron_S40+addr2;double*pa=&neur
41、on_C50+addr3;for(inty=0;yheight_image_C5_CNN;y+)for(intx=0;xwidth_image_C5_CNN;x+)constdouble*ppw=pw;constdouble*ppi=pi+y*width_image_S4_CNN+x;doublesum=0.0;for(intwy=0;wyheight_kernel_conv_CNN;wy+)for(intwx=0;wxwidth_kernel_conv_CNN;wx+)sum+=*ppw+*ppiwy*width_image_S4_CNN+wx;pay*width_image_C5_CNN+
42、x+=sum;intaddr3=get_index(0,0,o,width_image_C5_CNN,height_image_C5_CNN,num_map_C5_CNN);double*pa=&neuron_C50+addr3;doubleb=bias_C5o;for(inty=0;yheight_image_C5_CNN;y+)for(intx=0;xwidth_image_C5_CNN;x+)pay*width_image_C5_CNN+x+=b;for(inti=0;inum_neuron_C5_CNN;i+)neuron_C5i=activation_function_tanh(ne
43、uron_C5i);returntrue;(7)、輸出層:神經(jīng)元數(shù)為(1*1)*10=10,為全連接層,輸出層中的每一個神經(jīng)元均是由C5層中的120個神經(jīng)元乘以相對應(yīng)的權(quán)值,然后相加求和;然后對每一個神經(jīng)元加上一個閾值,最后再通過tanh激活函數(shù)對每一神經(jīng)元進(jìn)行運算得到最終每一個神經(jīng)元的結(jié)果。代碼段如下:cppviewplaincopy在CODE上查看代碼片派生到我的代碼片boolCNN:Forward_output()init_variable(neuron_output,0.0,num_neuron_output_CNN);for(inti=0;inum_neuron_output_CNN
44、;i+)neuron_outputi=0.0;for(intc=0;cnum_neuron_C5_CNN;c+)neuron_outputi+=weight_outputc*num_neuron_output_CNN+i*neuron_C5c;neuron_outputi+=bias_outputi;for(inti=0;inum_neuron_output_CNN;i+)neuron_outputi=activation_function_tanh(neuron_outputi);returntrue;4.反向傳播:主要計算每層權(quán)值和偏置的誤差以及每層神經(jīng)元的誤差;其中輸入層、S2層、S4層
45、操作過程相同;C1層、C3層操作過程相同。、輸出層:計算輸出層神經(jīng)元誤差;通過mse損失函數(shù)的導(dǎo)數(shù)函數(shù)和tanh激活函數(shù)的導(dǎo)數(shù)函數(shù)來計算輸出層神經(jīng)元誤差,即a、已計算出的輸出層神經(jīng)元值減去對應(yīng)labe1值,b、1.0減去輸出層神經(jīng)元值的平方,c、a與c的乘積和。損失函數(shù)作用:在統(tǒng)計學(xué)中損失函數(shù)是一種衡量損失和錯誤(這種損失與”錯誤地”估計有關(guān))程度的函數(shù)。損失函數(shù)在實踐中最重要的運用,在于協(xié)助我們通過過程的改善而持續(xù)減少目標(biāo)值的變異,并非僅僅追求符合邏輯。在深度學(xué)習(xí)中,對于損失函數(shù)的收斂特性,我們期望是當(dāng)誤差越大的時候,收斂(學(xué)習(xí))速度應(yīng)該越快。成為損失函數(shù)需要滿足兩點要求:非負(fù)性;預(yù)測值和期
46、望值接近時,函數(shù)值趨于0.代碼段如下:cppviewplaincopy在CODE上查看代碼片派生到我的代碼片doubleCNN:loss_function_mse_derivative(doubley,doublet)return(y-t);voidCNN:loss_function_gradient(constdouble*y,constdouble*t,double*dst,intlen)for(inti=0;ilen;i+)dsti=loss_function_mse_derivative(yi,ti);doubleCNN:activation_function_tanh_derivat
47、ive(doublex)return(1.0-x*x);doubleCNN:dot_product(constdouble*s1,constdouble*s2,intlen)doubleresult=0.0;for(inti=0;ilen;i+)result+=s1i*s2i;returnresult;boolCNN:Backward_output()init_variable(delta_neuron_output,0.0,num_neuron_output_CNN);doubledE_dynum_neuron_output_CNN;init_variable(dE_dy,0.0,num_n
48、euron_output_CNN);loss_function_gradient(neuron_output,data_single_label,dE_dy,num_neuron_output_CNN);/損失函數(shù):meansquarederror(均方差)/delta=dE/da=(dE/dy)*(dy/da)for(inti=0;inum_neuron_output_CNN;i+)doubledy_danum_neuron_output_CNN;init_variable(dy_da,0.0,num_neuron_output_CNN);dy_dai=activation_function
49、_tanh_derivative(neuron_outputi);delta_neuron_outputi=dot_product(dE_dy,dy_da,num_neuron_output_CNN);returntrue;、C5層:計算C5層神經(jīng)元誤差、輸出層權(quán)值誤差、輸出層偏置誤差;通過輸出層神經(jīng)元誤差乘以輸出層權(quán)值,求和,結(jié)果再乘以C5層神經(jīng)元的tanh激活函數(shù)的導(dǎo)數(shù)(即1-C5層神經(jīng)元值的平方),獲得C5層每一個神經(jīng)元誤差;通過輸出層神經(jīng)元誤差乘以C5層神經(jīng)元獲得輸出層權(quán)值誤差;輸出層偏置誤差即為輸出層神經(jīng)元誤差。代碼段如下:cppviewplaincopy在CODE上查看代碼片派生到
50、我的代碼片boolCNN:muladd(constdouble*src,doublec,intlen,double*dst)for(inti=0;ilen;i+)dsti+=(srci*c);returntrue;boolCNN:Backward_C5()init_variable(delta_neuron_C5,0.0,num_neuron_C5_CNN);init_variable(delta_weight_output,0.0,len_weight_output_CNN);init_variable(delta_bias_output,0.0,len_bias_output_CNN);f
51、or(intc=0;cnum_neuron_C5_CNN;c+)/propagatedeltatoprev HYPERLINK ious iouslayer/prev_deltac+=current_deltar*W_c*out_size_+rdelta_neuron_C5c=dot_product(&delta_neuron_output0,&weight_outputc*num_neuron_output_CNN,num_neuron_output_CNN);delta_neuron_C5c*=activation_function_tanh_derivative(neuron_C5c);
52、/accumulateweight-stepusingdelta/dWc*out_size+i+=current_deltai*prev_outcfor(intc=0;cnum_neuron_C5_CNN;c+)muladd(&delta_neuron_output0,neuron_C5c,num_neuron_output_CNN,&delta_weight_output0+c*num_neuron_output_CNN);for(inti=0;ilen_bias_output_CNN;i+)delta_bias_outputi+=delta_neuron_outputi;returntru
53、e;、S4層:計算S4層神經(jīng)元誤差、C5層權(quán)值誤差、C5層偏置誤差;通過C5層權(quán)值乘以C5層神經(jīng)元誤差,求和,結(jié)果再乘以S4層神經(jīng)元的tanh激活函數(shù)的導(dǎo)數(shù)(即1-S4神經(jīng)元的平方),獲得S4層每一個神經(jīng)元誤差;通過S4層神經(jīng)元乘以C5層神經(jīng)元誤差,求和,獲得C5層權(quán)值誤差;C5層偏置誤差即為C5層神經(jīng)元誤差。代碼段如下:cppviewplaincopy在CODE上查看代碼片派生到我的代碼片boolCNN:Backward_S4()init_variable(delta_neuron_S4,0.0,num_neuron_S4_CNN);init_variable(delta_weight_C5
54、,0.0,len_weight_C5_CNN);init_variable(delta_bias_C5,0.0,len_bias_C5_CNN);/propagatedeltatopreviouslayerfor(intinc=0;incnum_map_S4_CNN;inc+)for(intoutc=0;outcnum_map_C5_CNN;outc+)intaddr1=get_index(0,0,num_map_S4_CNN*outc+inc,width_kernel_conv_CNN,height_kernel_conv_CNN,num_map_S4_CNN*num_map_C5_CNN)
55、;intaddr2=get_index(0,0,outc,width_image_C5_CNN,height_image_C5_CNN,num_map_C5_CNN);intaddr3=get_index(0,0,inc,width_image_S4_CNN,height_image_S4_CNN,num_map_S4_CNN);constdouble*pw=&weight_C50+addr1;constdouble*pdelta_src=&delta_neuron_C50+addr2;double*pdelta_dst=&delta_neuron_S40+addr3;for(inty=0;y
56、height_image_C5_CNN;y+)for(intx=0;xwidth_image_C5_CNN;x+)constdouble*ppw=p HYPERLINK w w;constdoubleppdelta_src=pdelta_srcy*width_image_C5_CNN+x;double*ppdelta_dst=pdelta_dst+y*width_image_S4_CNN+x;for(intwy=0;wyheight_kernel_conv_CNN;wy+)for(intwx=0;wxwidth_kernel_conv_CNN;wx+)ppdelta_dstwy*width_i
57、mage_S4_CNN+wx+=*ppw+*ppdelta_src;for(inti=0;inum_neuron_S4_CNN;i+)delta_neuron_S4i*=activation_function_tanh_derivative(neuron_S4i);/accumulatedwfor(intinc=0;incnum_map_S4_CNN;inc+)for(intoutc=0;outcnum_map_C5_CNN;outc+)for(intwy=0;wyheight_kernel_conv_CNN;wy+)for(intwx=0;wxwidth_kernel_conv_CNN;wx
58、+)intaddr1=get_index(wx,wy,inc,width_image_S4_CNN,height_image_S4_CNN,num_map_S4_CNN);intaddr2=get_index(0,0,outc,width_image_C5_CNN,height_image_C5_CNN,num_map_C5_CNN);intaddr3=get_index(wx,wy,num_map_S4_CNN*outc+inc,height_kernel_conv_CNN,num_map_S4_CNNwidth_kernel_conv_CNN,height_kernel_conv_CNN,
59、num_map_S4_CNNnum_map_C5_CNN);doubledst=0.0;constdouble*prevo=&neuron_S40+addr1;constdouble*delta=&delta_neuron_C50+addr2;for(inty=0;yheight_image_C5_CNN;y+)dst+=dot_product(prevo+y*width_image_S4_CNN,delta+y*width_image_C5_CNN,width_image_C5_CNN);delta_weight_C5addr3+=dst;/accumulatedbfor(intoutc=0
60、;outcnum_map_C5_CNN;outc+)intaddr2=get_index(0,0,outc,width_image_C5_CNN,height_image_C5_CNN,num_map_C5_CNN);constdoublescale_factordelta=&delta_neuron_C50+addr2;scale_factorfor(inty=0;yheight_image_C5_CNN;y+)for(intx=0;xwidth_image_C5_CNN;x+)delta_bias_C5outc+=deltay*width_image_C5_CNN+x;returntrue
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖南理工學(xué)院《企業(yè)家精神》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣西科技職業(yè)學(xué)院《軟件工程(雙語)》2023-2024學(xué)年第二學(xué)期期末試卷
- 重慶藝術(shù)工程職業(yè)學(xué)院《當(dāng)代西方經(jīng)濟(jì)學(xué)流派》2023-2024學(xué)年第二學(xué)期期末試卷
- 鄭州師范學(xué)院《會計報表解讀與分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 玉柴職業(yè)技術(shù)學(xué)院《火電廠煙氣凈化Ⅰ》2023-2024學(xué)年第二學(xué)期期末試卷
- 西安翻譯學(xué)院《生物制品藥劑學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 南昌師范學(xué)院《中學(xué)蒙古語文課程與教學(xué)論》2023-2024學(xué)年第二學(xué)期期末試卷
- 華北理工大學(xué)輕工學(xué)院《生物醫(yī)藥產(chǎn)業(yè)分析概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 河南質(zhì)量工程職業(yè)學(xué)院《書法實訓(xùn)I》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024-2025學(xué)年江蘇省南京市五校聯(lián)盟高二(上)期末數(shù)學(xué)試卷【含答案】
- 高支模專項施工方案(專家論證)
- 深圳版初中英語單詞匯總
- 健康養(yǎng)生,快樂生活課件
- 《物流與供應(yīng)鏈管理-新商業(yè)、新鏈接、新物流》配套教學(xué)課件
- 物聯(lián)網(wǎng)項目實施進(jìn)度計劃表
- MDD指令附錄一 基本要求檢查表2013版
- 駱駝祥子1一24章批注
- 新部編人教版四年級下冊道德與法治全冊教案(教學(xué)設(shè)計)
- 2021年胃腸外科規(guī)培出科考試試題及答案
- 人美版高中美術(shù)選修:《繪畫》全冊課件【優(yōu)質(zhì)課件】
- FANUC數(shù)控系統(tǒng)面板介紹與編程操作參考模板
評論
0/150
提交評論