?? bpnet002.txt
字號(hào):
/****** 增加動(dòng)量項(xiàng)alpha 初始化alpha=0.4 動(dòng)態(tài)修改 ******/
/****** 自適應(yīng)調(diào)節(jié)學(xué)習(xí)率eta 初始化eta=0.8 動(dòng)態(tài)修改 ****/
/****** 隱含層權(quán)值矩陣w1 初始化接近0 ******************/
/****** terget 正弦函數(shù) *******************************/
/*!!!!! 仿正弦函數(shù)效果不好!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
#include <math.h>
#include <stdio.h>
#include <time.h>
#define nP 1 //期望模式對(duì)數(shù)nP=1
#define nHiddenNodes 5 //隱含層節(jié)點(diǎn)數(shù) 5
#define nInputNodes 1 //輸入節(jié)點(diǎn)數(shù) 1
#define nOutputNodes 1 //輸出節(jié)點(diǎn)數(shù) 1
#define Sample 21 //樣本數(shù) 1-10
void Initialw1(); //初始化w1矩陣
void Initialw2(); //初始化w2矩陣
void Initialdelw(); //初始化權(quán)值變化矩陣
void InitialSample(); //初始化樣本
double w1[nHiddenNodes][nInputNodes]; //輸入層--隱含層權(quán)值矩陣
double w2[nOutputNodes][nHiddenNodes]; //隱含層--輸出層權(quán)值矩陣
double delw1[nHiddenNodes][nInputNodes]; //輸入層--隱含層權(quán)值變化矩陣
double delw2[nOutputNodes][nHiddenNodes];//隱含層--輸出層權(quán)值變化矩陣
double out0[Sample]; //輸入樣本 1維
double out1[nHiddenNodes][Sample]; //隱含層節(jié)點(diǎn)值 2維
double delta1[nHiddenNodes]; //隱含層節(jié)點(diǎn)偏差
double out2[Sample]; //輸出層節(jié)點(diǎn)值 1維
double delta2[Sample]; //輸出層節(jié)點(diǎn)偏差
double target[Sample]; //輸出目標(biāo)值 1維
float scale=42767; //求隨機(jī)數(shù)時(shí)的標(biāo)準(zhǔn)化標(biāo)尺因子
float wmax=0.8; //最大權(quán)值
int nlteration=10; //迭代次數(shù)
float eta=0.8; //學(xué)習(xí)因子
float alpha=0.4; //動(dòng)態(tài)因子
float w11; //w1陣 產(chǎn)生隨機(jī)數(shù)
float w22; //w2陣 產(chǎn)生隨機(jī)數(shù)
float dw;
int i,j,h,p,q;
double sum,sum1;
float Erms=0.0;
float Ermspre=0.0;
/**************************************************************************/
/*****************************main()***************************************/
main()
{ Initialw1(); //初始化w1矩陣
Initialw2(); //初始化w2矩陣
Initialdelw(); //初始化權(quán)值變化矩陣
InitialSample(); //初始化樣本
/***************************開(kāi)始迭代********************************/
for(q=0;q<200;q++) //迭代步數(shù)
{for(p=0;p<Sample;p++) //輸入樣本對(duì) 第p個(gè)樣本對(duì)
{//樣本為第p個(gè)樣本對(duì)
//p=0的樣本不進(jìn)行迭代
/*********************隱含層節(jié)點(diǎn)輸出值****************************/
sum=0.0;
for(h=0;h<nHiddenNodes;h++)
{float sum=w1[h][0];
sum=w1[h][0]*out0[p];
out1[h][p]=1.0/(1.0+exp(-sum));
sum=0.0;
}
/********************輸出層節(jié)點(diǎn)值********************************/
sum1=0.0;
sum=0.0;
for(h=0;h<nHiddenNodes;h++)
{float sum=w2[0][h];
sum=w2[0][h]*out1[h][p];
sum1=sum1+sum;
}
out2[p]=1.0/(1.0+exp(-sum1));
/************************樣本p迭代結(jié)束后,計(jì)算誤差,修正權(quán)值*********/
//輸出節(jié)點(diǎn)偏差delta2
delta2[p]=(target[p]-out2[p])*out2[p]*(1.0-out2[p]);
//隱含層節(jié)點(diǎn)偏差delta1
for(h=0;h<nHiddenNodes;h++)
{float sum=0.0;
sum=delta2[p]*w2[0][h];
delta1[h]=sum*out1[h][p]*(1.0-out1[h][p]);
}
/*===================調(diào)節(jié)隱層與輸出層間的權(quán)值==============*/
//計(jì)算權(quán)值偏差矩陣delw2
dw=sum=0.0;
//sum=delta2[p];
for(h=0;h<nHiddenNodes;h++)
{dw=eta*delta2[p]*out1[h][p]+alpha*delw2[0][h]; //計(jì)算權(quán)值變化
w2[0][h]+=dw; //新權(quán)值
delw2[0][h]=dw;} //保存變化值
/*===================調(diào)節(jié)輸入與隱含層間的權(quán)值==============*/
dw=sum=0.0;
for(h=0;h<nHiddenNodes;h++)
{
dw=eta*delta1[h]*out0[p]+alpha*delw1[h][0]; //計(jì)算權(quán)值變化
w1[h][0]+=dw; //新權(quán)值
delw1[h][0]=dw; //保存變化值
dw=sum=0.0;
}
/***********************************************************************/
}//p個(gè)樣本一次迭代結(jié)束
//動(dòng)態(tài)修改學(xué)習(xí)因子eta
sum1=0.0;
for(p=1;p<Sample;p++)
{sum=0.0;
sum=0.5*(target[p]-out2[p])*(target[p]-out2[p]);
sum1=sum1+sum;} //sum1累加本次誤差
Erms=sum1; //Erms本次誤差,Ermspre上一次誤差
if(Erms/Ermspre>1.0001) //Erms>Ermspre 減慢學(xué)習(xí)速率eta
{eta*=0.7;
alpha*=0.7;
if (eta>0.99)
eta=0.9;
if (alpha>0.5)
alpha=0.5;}
else //Erms<Ermspre 加快學(xué)習(xí)速率eta
{eta*=1.05;
alpha*=1.05;
if (eta>0.99)
eta=0.9;
if (alpha>0.5)
alpha=0.5;}
Ermspre=Erms; //保存本次誤差值
}//q步迭代結(jié)束
puts ("diedai finish");
}//main結(jié)束
/****************************************************************************/
/*****************************初始化權(quán)矩陣***********************************/
//初始化輸入層--隱含層權(quán)值矩陣w1
void Initialw1()
{
register int i1,j1;
srand((int)time(0)); // 初始化隨機(jī)數(shù)生成器
for(i1=0;i1<nHiddenNodes;i1++)
{for(j1=0;j1<nInputNodes;j1++)
{float frand=rand();
w11 = wmax*(1.0-2*frand/scale);
w1[i1][j1]=w11/10;
}
}
puts ("initial w1 finish\n");
}
//初始化隱含層--輸出層權(quán)值矩陣w2
void Initialw2()
{
register int i2,j2;
srand((int)time(0));
for(i2=0;i2<nOutputNodes;i2++)
{for(j2=0;j2<nHiddenNodes;j2++)
{float frand=rand();
//(wmax-0.05) 防止w1,w2矩陣初始值相同
w22 = (wmax-0.05)*(1.0-2*frand/scale);
w2[i2][j2]=w22;
}
}
puts ("initial w2 finish\n");
}
/**************************************************************************/
/*****************************初始化權(quán)值變化矩陣***************************/
void Initialdelw()
{register int h,i,j;
for(h=0;h<nHiddenNodes;h++) //delw1全部為0
for(i=0;i<nInputNodes;i++)
{delw1[h][i]=0.0;}
for(j=0;j<nOutputNodes;j++) //delw2全部為0
for(h=0;h<nHiddenNodes;h++)
{delw2[j][h]=0.0;}
for(j=0;j<nOutputNodes;j++) //調(diào)整delw2為0.0-0.04的小數(shù),防止delw2在程序運(yùn)行中全部相等
for(h=0;h<nHiddenNodes;h++)
{delw2[j][h]=delw2[j][h]+0.01*h;}
puts ("initial delw1 and delw2 finish\n");
}
/**************************************************************************/
/*****************************初始化樣本***********************************/
void InitialSample()
{ for (i=0;i<Sample;i++) //輸入樣本值
{out0[i]=(double)(i)/20.0;}
for(i=0;i<Sample;i++) //輸出目標(biāo)值
{target[i]=(0.4 * sin ((2*3.1415926)*(out0[i]))+0.5);}
//隱含層 輸出層 節(jié)點(diǎn)值及其偏差矩陣清零
//便于觀察
for (i=0;i<Sample;i++)
{for (j=0;j<nHiddenNodes;j++)
{out1[j][i]=0.0;
delta1[j]=0.0;}
out2[i]=0.0;
delta2[i]=0.0;
}
puts ("initial Sample finish\n");
}
/**************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -