1. 程式人生 > >BP神經網路java實現,按照演算法步驟也參考網上相關資源寫的,若君有高見,非常歡迎指教

BP神經網路java實現,按照演算法步驟也參考網上相關資源寫的,若君有高見,非常歡迎指教

for(int i=0;i<hidN;i++){
for(int j=0;j<=inN;j++){
wyh[i][j]=Math.random()-0.5;//初始化權值和閾值
//System.out.println(wyh[i][j]);
}
}
//System.out.println();
wyo=new double[outN][hidN+1];//最後一行為計算輸出的閾值
for(int i=0;i<outN;i++){
for(int j=0;j<=hidN;j++){
wyo[i][j]=Math.random()-0.5;//初始化權值和閾值
//System.out.println(wyo[i][j]);
}
}
while((count--)>0){
for(int i=0;i<hidN;i++){//遍歷每個隱含單元的結果
temphid[i]=0;
for(int j=0;j<inN;j++){
temphid[i]+=wyh[i][j]*inData[j];
}
temphid[i]+=wyh[i][inN];
temphid[i]=1.0/(1+Math.exp(-temphid[i]));
//System.out.println(temphid[i]);
}

for(int i=0;i<outN;i++){//計算每個輸出層單元的結果
tempout[i]=0;
for(int j=0;j<hidN;j++){
tempout[i]+=wyo[i][j]*temphid[j];
}
tempout[i]+=wyo[i][hidN];
tempout[i]=1.0/(1+Math.exp(-tempout[i]));
}
//每個輸出單元的計算誤差
for(int i=0;i<outN;++i ){
errout[i]=tempout[i]*(1-tempout[i])*(outData[i]-tempout[i]);
err+=Math.pow((outData[i]-tempout[i]), 2);
}
err=err/2;//最終誤差計算
//計算每個隱含層單元的誤差
double errh=0;
for(int i=0;i<hidN;i++){
for(int j=0;j<outN;j++){
errh+=errout[j]*wyo[j][i];
}
errhid[i]=temphid[i]*(1-temphid[i])*errh;
}

//改變輸出層權值
for(int i=0;i<outN;i++){
for(int j=0;j<hidN;j++){
wyo[i][j]+=rate*temphid[j]*errout[i];
}
wyo[i][hidN]+=rate*errout[i];//改變閾值
}

//改變隱含層權值和閾值
for(int i=0;i<hidN;i++){
for(int j=0;j<inN;j++){
wyh[i][j]+=rate*inData[j]*errhid[i];
}
wyh[i][inN]+=rate*errhid[i];
}
if(err<0.0001)
break;