大學(xué)BP神經(jīng)網(wǎng)絡(luò)實驗報告_第1頁
大學(xué)BP神經(jīng)網(wǎng)絡(luò)實驗報告_第2頁
大學(xué)BP神經(jīng)網(wǎng)絡(luò)實驗報告_第3頁
大學(xué)BP神經(jīng)網(wǎng)絡(luò)實驗報告_第4頁
大學(xué)BP神經(jīng)網(wǎng)絡(luò)實驗報告_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

..XX大學(xué)物聯(lián)網(wǎng)工程學(xué)院實驗報告課程名稱人工智能實驗名稱BP神經(jīng)網(wǎng)絡(luò)實驗日期實驗報告要求1.實驗名稱2.實驗要求3.實驗環(huán)境4.實驗步驟5.實驗體會實驗?zāi)康模簝蓚€輸入a、b(10以內(nèi)的數(shù)),一個輸出c,c=a+b。換句話說就是教BP神經(jīng)網(wǎng)絡(luò)加法運算。實驗內(nèi)容:

Data用來表示已經(jīng)知道的數(shù)據(jù)樣本的數(shù)量,也就是訓(xùn)練樣本的數(shù)量。In表示對于每個樣本有多少個輸入變量;Out表示對于每個樣本有多少個輸出變量。Neuron表示神經(jīng)元的數(shù)量,TrainC來表示訓(xùn)練的次數(shù)。再來我們看對神經(jīng)網(wǎng)絡(luò)描述的數(shù)據(jù)定義,來看下面這張圖里面的數(shù)據(jù)類型都是double型。

d_in[Data][In]存儲Data個樣本,每個樣本的In個輸入。d_out[Data][Out]存儲Data個樣本,每個樣本的Out個輸出。我們用鄰接表法來表示圖1中的網(wǎng)絡(luò),w[Neuron][In]

表示某個輸入對某個神經(jīng)元的權(quán)重,v[Out][Neuron]來表示某個神經(jīng)元對某個輸出的權(quán)重;與之對應(yīng)的保存它們兩個修正量的數(shù)組dw[Neuron][In]和dv[Out][Neuron]。數(shù)組o[Neuron]記錄的是神經(jīng)元通過激活函數(shù)對外的輸出,OutputData[Out]

存儲BP神經(jīng)網(wǎng)絡(luò)的輸出。

初始化主要是涉及兩個方面的功能,一方面是對讀取的訓(xùn)練樣本數(shù)據(jù)進行歸一化處理,歸一化處理就是指的就是將數(shù)據(jù)轉(zhuǎn)換成0~1之間。在BP神經(jīng)網(wǎng)絡(luò)理論里面,并沒有對這個進行要求,不過實際實踐過程中,歸一化處理是不可或缺的。因為理論模型沒考慮到,BP神經(jīng)網(wǎng)絡(luò)收斂的速率問題,一般來說神經(jīng)元的輸出對于0~1之間的數(shù)據(jù)非常敏感,歸一化能夠顯著提高訓(xùn)練效率??梢杂靡韵鹿絹韺ζ溥M行歸一化,其中加個常數(shù)A是為了防止出現(xiàn)0的情況(0不能為分母)。

y=(x-MinValue+A)/(MaxValue-MinValue+A)

另一方面,就是對神經(jīng)元的權(quán)重進行初始化了,數(shù)據(jù)歸一到了(0~1)之間,那么權(quán)重初始化為(-1~1)之間的數(shù)據(jù),另外對修正量賦值為0函數(shù)backUpdate(i)負責(zé)的是將預(yù)測輸出的結(jié)果與樣本真實的結(jié)果進行比對,然后對神經(jīng)網(wǎng)絡(luò)中涉及到的權(quán)重進行修正,也這是BP神經(jīng)網(wǎng)絡(luò)實現(xiàn)的關(guān)鍵所在。如何求到對于w[Neuron][In]和v[Out][Neuron]進行修正的誤差量便是關(guān)鍵所在!誤差修正量的求法在基本模型一文中數(shù)學(xué)分析部分有解答,具體問題具體分析,落實到我們設(shè)計的這個BP神經(jīng)網(wǎng)絡(luò)上來說,需要得到的是對w[Neuron][In]和v[Out][Neuron]兩個數(shù)據(jù)進行修正誤差,誤差量用數(shù)據(jù)結(jié)構(gòu)dw[Neuron][In]

dv[Out][Neuron]

來進行存儲。那么來分析下這兩個修正誤差量是什么樣的?推導(dǎo)的思路與基本模型中推導(dǎo)誤差量的一致,這里僅列出對具體對于我們設(shè)計的BP神經(jīng)網(wǎng)絡(luò)中的數(shù)學(xué)推導(dǎo)過程:實驗環(huán)境VS2010實驗步驟(對照截圖具體說明,盡量詳細)#include<stdio.h>#include<time.h>#include<math.h>#include<stdlib.h>#defineData820#defineIn2#defineOut1#defineNeuron45#defineTrainC20000#defineA0.2#defineB0.4#definea0.2#defineb0.3doubled_in[Data][In],d_out[Data][Out];doublew[Neuron][In],o[Neuron],v[Out][Neuron];doubleMaxin[In],Minin[In],Maxout[Out],Minout[Out];doubleOutputData[Out];doubledv[Out][Neuron],dw[Neuron][In];doublee;voidwriteTest(){ FILE*fp1,*fp2; doubler1,r2; inti; srand((unsigned)time(NULL)); if((fp1=fopen("D:\\in.txt","w"))==NULL){ printf("cannotopentheinfile\n"); exit(0); } if((fp2=fopen("D:\\out.txt","w"))==NULL){ printf("cannotopentheoutfile\n"); exit(0); } for(i=0;i<Data;i++){ r1=rand()%1000/100.0; r2=rand()%1000/100.0; fprintf(fp1,"%lf%lf\n",r1,r2); fprintf(fp2,"%lf\n",r1+r2); } fclose(fp1); fclose(fp2);}voidreadData(){ FILE*fp1,*fp2; inti,j; if((fp1=fopen("D:\\in.txt","r"))==NULL){ printf("cannotopentheinfile\n"); exit(0); } for(i=0;i<Data;i++) for(j=0;j<In;j++) fscanf(fp1,"%lf",&d_in[i][j]); fclose(fp1); if((fp2=fopen("D:\\out.txt","r"))==NULL){ printf("cannotopentheoutfile\n"); exit(0); } for(i=0;i<Data;i++) for(j=0;j<Out;j++) fscanf(fp1,"%lf",&d_out[i][j]); fclose(fp2);}voidinitBPNework(){ inti,j; for(i=0;i<In;i++){ Minin[i]=Maxin[i]=d_in[0][i]; for(j=0;j<Data;j++) { Maxin[i]=Maxin[i]>d_in[j][i]?Maxin[i]:d_in[j][i]; Minin[i]=Minin[i]<d_in[j][i]?Minin[i]:d_in[j][i]; } } for(i=0;i<Out;i++){ Minout[i]=Maxout[i]=d_out[0][i]; for(j=0;j<Data;j++) { Maxout[i]=Maxout[i]>d_out[j][i]?Maxout[i]:d_out[j][i]; Minout[i]=Minout[i]<d_out[j][i]?Minout[i]:d_out[j][i]; } } for(i=0;i<In;i++) for(j=0;j<Data;j++) d_in[j][i]=(d_in[j][i]-Minin[i]+1)/(Maxin[i]-Minin[i]+1); for(i=0;i<Out;i++) for(j=0;j<Data;j++) d_out[j][i]=(d_out[j][i]-Minout[i]+1)/(Maxout[i]-Minout[i]+1); for(i=0;i<Neuron;++i) for(j=0;j<In;++j){ w[i][j]=rand()*2.0/RAND_MAX-1; dw[i][j]=0; } for(i=0;i<Neuron;++i) for(j=0;j<Out;++j){ v[j][i]=rand()*2.0/RAND_MAX-1; dv[j][i]=0; }}voidcomputO(intvar){ inti,j; doublesum,y; for(i=0;i<Neuron;++i){ sum=0; for(j=0;j<In;++j) sum+=w[i][j]*d_in[var][j]; o[i]=1/(1+exp(-1*sum)); } for(i=0;i<Out;++i){ sum=0; for(j=0;j<Neuron;++j) sum+=v[i][j]*o[j]; OutputData[i]=sum; } }voidbackUpdate(intvar){ inti,j; doublet; for(i=0;i<Neuron;++i) { t=0; for(j=0;j<Out;++j){ t+=(OutputData[j]-d_out[var][j])*v[j][i]; dv[j][i]=A*dv[j][i]+B*(OutputData[j]-d_out[var][j])*o[i]; v[j][i]-=dv[j][i]; } for(j=0;j<In;++j){ dw[i][j]=a*dw[i][j]+b*t*o[i]*(1-o[i])*d_in[var][j]; w[i][j]-=dw[i][j]; } }}doubleresult(doublevar1,doublevar2){ inti,j; doublesum,y; var1=(var1-Minin[0]+1)/(Maxin[0]-Minin[0]+1); var2=(var2-Minin[1]+1)/(Maxin[1]-Minin[1]+1); for(i=0;i<Neuron;++i){ sum=0; sum=w[i][0]*var1+w[i][1]*var2; o[i]=1/(1+exp(-1*sum)); } sum=0; for(j=0;j<Neuron;++j) sum+=v[0][j]*o[j]; returnsum*(Maxout[0]-Minout[0]+1)+Minout[0]-1;}voidwriteNeuron(){ FILE*fp1; inti,j; if((fp1=fopen("D:\\neuron.txt","w"))==NULL) { printf("cannotopentheneuronfile\n"); exit(0); } for(i=0;i<Neuron;++i) for(j=0;j<In;++j){ fprintf(fp1,"%lf",w[i][j]); } fprintf(fp1,"\n\n\n\n"); for(i=0;i<Neuron;++i) for(j=0;j<Out;++j){ fprintf(fp1,"%lf",v[j][i]); } fclose(fp1);}voidtrainNetwork(){ inti,c=0,j; do{ e=0; for(i=0;i<Data;++i){ computO(i); for(j=0;j<Out;++j) e+=fabs((OutputData[j]-d_out[i][j])/d_out[i][j]); backUpdate(i); } printf("%d%lf\n",c,e/Data); c++; }while(c<TrainC&&e/Data>0.01);}intmain(intargc,charconst*argv[]){ writeTest(); readData(); initBPNework(); trainNetwork(); printf("%lf\n",re

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論