如何用c語言編程實(shí)現(xiàn)多層前向bp神經(jīng)網(wǎng)絡(luò),用來解決邏輯xor運(yùn)算和奇偶檢驗(yàn)問題_第1頁
如何用c語言編程實(shí)現(xiàn)多層前向bp神經(jīng)網(wǎng)絡(luò),用來解決邏輯xor運(yùn)算和奇偶檢驗(yàn)問題_第2頁
如何用c語言編程實(shí)現(xiàn)多層前向bp神經(jīng)網(wǎng)絡(luò),用來解決邏輯xor運(yùn)算和奇偶檢驗(yàn)問題_第3頁
如何用c語言編程實(shí)現(xiàn)多層前向bp神經(jīng)網(wǎng)絡(luò),用來解決邏輯xor運(yùn)算和奇偶檢驗(yàn)問題_第4頁
如何用c語言編程實(shí)現(xiàn)多層前向bp神經(jīng)網(wǎng)絡(luò),用來解決邏輯xor運(yùn)算和奇偶檢驗(yàn)問題_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、6.(1)試用C語言編程實(shí)現(xiàn)多層前向NN的BP算法。要求:輸入、輸出結(jié)點(diǎn)數(shù)目,隱層數(shù)目,及各隱層中結(jié)點(diǎn)的數(shù)目應(yīng)為任意整數(shù)。(2)試用所編出的BP算法程序訓(xùn)練出一個(gè)實(shí)現(xiàn)XOR運(yùn)算的2層前向網(wǎng)絡(luò)。(3)用所編出的BP算法程序訓(xùn)練出輸入矢量的維數(shù)分別為n=7和n=8的兩個(gè)實(shí)現(xiàn)奇偶檢驗(yàn)運(yùn)算(即如題2.(2)所述)的2層前向NN。注:對(duì)第6題的要求:列表給出訓(xùn)練收斂后的NN權(quán)值和所用的迭代次數(shù);給出訓(xùn)練收斂后的訓(xùn)練誤差和檢驗(yàn)誤差,及用訓(xùn)練集和檢驗(yàn)集做輸入時(shí)所得到的正確輸出率;給出NN的學(xué)習(xí)曲線(即E(W(k)隨迭代次數(shù)k的變化曲線,該結(jié)果應(yīng)是用計(jì)算程序計(jì)算和打印出來的曲線,而不要是用手畫出的曲線)。(1

2、)用C語言編程實(shí)現(xiàn)前向NN的BP算法解:解題思路:先用C語言編程實(shí)現(xiàn)前向NN的BP算法,再將誤差保存至文本文件,最后用MATLAB繪制出誤差曲線。開發(fā)思路奇偶檢驗(yàn)問題可視為XOR問題的推廣(由2輸入到n輸入的推廣):若n個(gè)輸入中有奇數(shù)個(gè)1,則輸出為1;若n個(gè)輸入中有偶數(shù)個(gè)1,則輸出為0。一個(gè)2層的NN可實(shí)現(xiàn)奇偶檢驗(yàn)運(yùn)算。本文選用2層神經(jīng)網(wǎng)絡(luò),包括隱含層1層,輸出層1層,來設(shè)計(jì)BP神經(jīng)網(wǎng)絡(luò)。x1x2xnnW212w211W101012層神經(jīng)網(wǎng)絡(luò)本文隱含層和輸出層的激活函數(shù)選用Sigmoid函數(shù),申(s)=,=9(s)(1_9(s)1+e_sds其函數(shù)曲線如下所示:可定義如下分類函數(shù):Y(y)=1

3、y=1/20y3b871W網(wǎng)絡(luò)訓(xùn)練結(jié)朿!BP神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)曲線如下:2LayerBPNeuralNetworkforXORwith2inputand1outpufi-TheErrorlin-e可以看出bp神經(jīng)網(wǎng)絡(luò)的誤差很快收斂至0。為了測(cè)試BP神經(jīng)網(wǎng)絡(luò)的有效性,取10次運(yùn)算的平均值,其正確率如下圖所示:2LayerBPNeuralN&tworkforXORwith2inputan-d1output-Thre-ResultHne2iiiiiiii0.4&5noo7kltW15.9960904一再加R.77832?丄丄.丄丄37?玄3.868187.62337?-28,213789-31.9644

4、903.1B6909-2B.83553M18.95683412.3785285.7623559.17216037.60412612.82109El.it26G6-0.6073?!4.980324-11.981143-23.9005E0血網(wǎng)絡(luò)訓(xùn)練皓束!巔罰2.0580185208-4.653486E.498790一$72GS27-6.814911-7.55052B一?6S5629一5922517-5.835666-5.214218一8丄208?一7179203-5丄28L847.?62376-2.Z55177-1HU5M535一7-26S1B8-7.5835132.813371-10運(yùn)7孑481

5、-E.791459-4.722353-4.E7B572-4.27651111.446776-6.86751經(jīng)過85857次迭代學(xué)習(xí)后,收斂至指定誤差范圍內(nèi)。鬲正正lip測(cè)試結(jié)果為=1281281.盹妣妣L2J全部樣本參加測(cè)試,所有的樣本的輸出值都能完全和真值吻合,正確率為1。BP神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)曲線如下:2LaerBPN&ursENetworkforXORwith7inputand1output-TheErrorlin-e可以看出BP神經(jīng)網(wǎng)絡(luò)的誤差很快收斂至0。為了測(cè)試BP神經(jīng)網(wǎng)絡(luò)的有效性,取10次運(yùn)算的平均值,其正確率如下圖所示:2LayerBPNeuralNetworkforXQRwith7

6、inputaruj1output-Th&ResultHn&IIIIIIIIFErroris0.96094afteriteration10times,0.D9234568590.0a0_&6_NO939794O.times定義正確率:其中,A為正確率,n=測(cè)試值和真實(shí)值相等的數(shù)量,N為參與測(cè)試的樣本數(shù)量。由上圖可以看出,10次測(cè)試的正確率均值為0.967,有理由相信,BP神經(jīng)網(wǎng)絡(luò)所訓(xùn)練出來的參數(shù)是正確的。附錄、NeuralNetBP.h/*參數(shù)定義*/#pragmaonce#ifndef_NEURALNETBP_H#define_NEURALNETBP_H/XOR2#defineIN_COUT#

7、defineOUT_COUT/#defineIMPLY_NUM/#defineSampleTrain/#defineSampleTest/#defineNN_lmplyCout/#defineNN_Rate/#defineNN_Error/#defineNN_LOOP輸入向量維數(shù)輸出向量維數(shù)隱含層層數(shù)訓(xùn)練樣本數(shù)量用0-127共128組數(shù)據(jù)全部參加訓(xùn)練/測(cè)試樣本數(shù)量用0-127共128組數(shù)據(jù)全部參加測(cè)試隱含層節(jié)點(diǎn)數(shù)學(xué)習(xí)速率0.001精度控制參數(shù)100000最大循環(huán)次數(shù)0.5/*參數(shù)該變量輸入維數(shù)改變時(shí),改變INCOUT的值即可同時(shí)需要修改SampleTrain、SampleTest、NN_Imp

8、lyCout的值;本程序?。篠ampleTrain=2AIN_COUTSampleTest=2A|N_COUTNN_ImplyCout=(2-4)*IN_COUT*/XOR7#defineIN_COUT7輸入向量維數(shù)#defineOUT_COUT1輸出向量維數(shù)#defineIMPLY_NUM1隱含層層數(shù)#defineSampleTrain128訓(xùn)練樣本數(shù)量用0-127共128組數(shù)據(jù)全部參加訓(xùn)練#defineSampleTest128測(cè)試樣本數(shù)量用0-127共128組數(shù)據(jù)全部參加測(cè)試#defineNN_lmplyCout25隱含層節(jié)點(diǎn)數(shù)#defineNN_Rate#defineNN_Error#

9、defineNN_LOOP0.4學(xué)習(xí)速率0.001精度控制參數(shù)100000最大循環(huán)次數(shù)typedefstructinth;/bp人工神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)實(shí)際使用隱層節(jié)點(diǎn)數(shù)doublevIN_COUT50;隱藏層權(quán)矩陣i,隱層節(jié)點(diǎn)最大數(shù)量為50doublew50OUT_COUT;輸出層權(quán)矩陣doublea;doubleb;intLoopCout;intLoopItera;學(xué)習(xí)率精度控制參數(shù)最大循環(huán)次數(shù)實(shí)際循環(huán)次數(shù)doubleErrorNN_LOOP;誤差bp_nn;intlnitBp(bp_nn*bp);初始化bp網(wǎng)絡(luò)intTrainBp(bp_nn*bp,intxSampleTrainIN_COUT,

10、intySampleTrainOUT_COUT);/訓(xùn)練bp網(wǎng)絡(luò),樣本為x,理想輸出為yintUseBp(bp_nn*bp,intInputIN_COUT,doubleOutputOUT_COUT);使用bp網(wǎng)絡(luò)doubleTestBp(bp_nn*bp,intxSampleTestIN_COUT,intySampleTestOUT_COUT);測(cè)試bp網(wǎng)絡(luò)#endif二、NeuralNetBP.cpp”/*BP人工神經(jīng)網(wǎng)絡(luò)基本算法C語言實(shí)現(xiàn)*/#include#include#include#include#includeNeuralNetBP.h/神經(jīng)網(wǎng)絡(luò)激活函數(shù)doublefnet(do

11、ublenet)doubletemp=0;/Sigmoid函數(shù)temp=1.0/(1+exp(-net);returntemp;intlnitBp(bp_nn*bp)/初始化bp網(wǎng)絡(luò)請(qǐng)輸入隱層節(jié)點(diǎn)數(shù),最大數(shù)為50(*bp).h=NN_ImplyCout;請(qǐng)輸入學(xué)習(xí)率(*bp).a=NN_Rate;/(*bp).a為double型數(shù)據(jù),所以必須是If請(qǐng)輸入精度控制參數(shù)(*bp).b=NN_Error;請(qǐng)輸入最大循環(huán)次數(shù)(*bp).LoopCout=NN_LOOP;產(chǎn)生隨機(jī)數(shù)初始化權(quán)值矩陣inti,j;srand(unsigned)time(NULL);for(i=0;iIN_COUT;i+)fo

12、r(j=0;j(*bp).h;j+)(*bp).vij=rand()/(double)(RAND_MAX);for(i=0;i(*bp).h;i+)for(j=0;jOUT_COUT;j+)(*bp).wij=rand()/(double)(RAND_MAX);return1;intTrainBp(bp_nn*bp,intxSampleTrainIN_COUT,intySampleTrainOUT_COUT)/訓(xùn)練bp網(wǎng)絡(luò),樣本為x,理想輸出為ydoublef=(*bp).b;精度控制參數(shù)doublea=(*bp).a;學(xué)習(xí)率inth=(*bp).h;隱層節(jié)點(diǎn)數(shù)doublevIN_COUT50

13、,w50OUT_COUT;權(quán)矩陣修改量矩陣隱層和輸出層輸出量/最大循環(huán)次數(shù)doubleChgH50,ChgOOUT_COUT;doubleO150,O2OUT_COUT;intLoopCout=(*bp).LoopCout;inti,j,k,n;doubletemp;for(i=0;iIN_COUT;i+)/復(fù)制結(jié)構(gòu)體中的權(quán)矩陣for(j=0;jh;j+)vij=(*bp).vij;for(i=0;ih;i+)for(j=0;jf&nLoopCout;n+)對(duì)每個(gè)樣本訓(xùn)練網(wǎng)絡(luò)e=0;for(i=0;iSampleTrain;i+)for(k=0;kh;k+)計(jì)算隱層輸出向量temp=0;for

14、(j=0;jIN_COUT;j+)temp=temp+xij*vjk;O1k=fnet(temp);for(k=0;kOUT_COUT;k+)計(jì)算輸出層輸出向量temp=0;for(j=0;jh;j+)temp=temp+O1j*wjk;O2k=fnet(temp);for(j=0;jOUT_COUT;j+)計(jì)算輸出層的權(quán)修改量ChgOj=O2j*(1-O2j)*(yij-O2j);for(j=0;jOUT_COUT;j+)計(jì)算輸出誤差e=e+(yij-O2j)*(yij-O2j);for(j=0;jh;j+)計(jì)算隱層權(quán)修改量temp=0;for(k=0;kOUT_COUT;k+)temp=t

15、emp+wjk*ChgOk;ChgHj=temp*O1j*(1-O1j);for(j=0;jh;j+)修改輸出層權(quán)矩陣for(k=0;kOUT_COUT;k+)wjk=wjk+a*O1j*ChgOk;for(j=0;jIN_COUT;j+)修改隱含層權(quán)矩陣for(k=0;kh;k+)vjk=vjk+a*xij*ChgHk;(*bp).Errorn=e;/記錄誤差訐(n%10=0)printf(循環(huán)次數(shù):%d,誤差:%fn,n,e);(*bp).Loopltera=n;實(shí)際循環(huán)次數(shù)printf(總共循環(huán)次數(shù):%dn,n);printf(調(diào)整后的隱層權(quán)矩陣:n);for(i=0;iIN_COUT;

16、i+)for(j=0;jh;j+)printf(%f,vij);printf(n);printf(調(diào)整后的輸出層權(quán)矩陣:n);for(i=0;ih;i+)for(j=0;jOUT_COUT;j+)printf(%f,wij);printf(n);for(i=0;iIN_COUT;i+)把結(jié)果復(fù)制回結(jié)構(gòu)體for(j=0;jh;j+)(*bp).vij=vij;for(i=0;ih;i+)for(j=0;jOUT_COUT;j+)(*bp).wij=wij;printf(bp網(wǎng)絡(luò)訓(xùn)練結(jié)束!nn);return1;/使用bp網(wǎng)絡(luò)intUseBp(bp_nn*bp,intInputIN_COUT,do

17、ubleOutputOUT_COUT)doubleO150;doubleO2OUT_COUT;/O1為隱層輸出,O2為輸出層輸出inti,j;doubletemp;for(i=0;i(*bp).h;i+)temp=0;for(j=0;jIN_COUT;j+)temp+=Inputj*(*bp).vji;O1i=fnet(temp);for(i=0;iOUT_COUT;i+)temp=0;for(j=0;j(*bp).h;j+)temp+=O1j*(*bp).wji;O2i=fnet(temp);輸出值for(i=0;iOUT_COUT;i+)Outputi=O2i;return1;double

18、TestBp(bp_nn*bp,intSampleTestIN_COUT,intSampleTestOUT_COUT)使用bp網(wǎng)絡(luò)inti,j;intInputIN_COUT;doubleOutputOUT_COUT;此處的輸出是實(shí)際計(jì)算輸出所以為double型intyMeasureSampleTest;intCorrectN=0;doubleAccuracy=0;正確率for(i=0;iSampleTest;i+)for(j=0;j=0.5)yMeasurei=1;elseyMeasurei=0;訐(iOUT_COUT-1=yMeasurei)真值=測(cè)量值CorrectN+;Accuracy

19、=CorrectN*1.0/SampleTest;計(jì)算正確率顯示測(cè)試結(jié)果printf(n=7時(shí),BPNN測(cè)試結(jié)果為:n);printf(測(cè)試樣本數(shù):%dn,SampleTest);printf(正確樣本數(shù):%dn,CorrectN);printf(正確率為:%fn,Accuracy);printf(nn);returnAccuracy;三、main.cpp#include#include#include#include#include#includeNeuralNetBP.h#includeHandleFile.h#includeSample.h/*奇偶性判斷若n個(gè)輸入中有奇數(shù)個(gè)1,則輸出為1;若n個(gè)

溫馨提示

  • 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)論