用C++实现BP算法

2020-05-15  本文已影响0人  天使zhang

#include

#include

#include

#include

using namespace std;

#define IN  3             //第一层神经元个数

#define IN2 4

#define HN  3             //第二层神经元个数

#define HN2 4

#define ON  3             //第三层神经元个数

#define IP  4             //输入数据个数

#define w   10000         //运行周期

int   p ;                 //次数计算

double u0 , alf, u ;      //步伐,S函数成分变量

double mX[3][4],D[3][3];

double tempx[9];

double  W1[IN][IP], W2[HN][IN2], W3[ON][HN2];    //1,2,3层阈值矩阵

double dW1[IN][IP],dW2[HN][IN2],dW3[ON][HN2];    //1,2,3层增量阈值矩阵

double Net1[IN],Net2[HN],Net3[ON];               //1,2,3层神经元净输入

double   F1[IN],  F2[HN],  F3[ON];               //1,2,3层神经元求导

double   d1[IN],  d2[HN],  d3[ON];               //1,2,3层神经元误差分量

double  Es1[IN], Es2[HN], Es3[ON];

double   O1[IN2],  O2[HN2],  O3[ON];             //1,2,3层神经元输出

double  Ep[w];

/*

double W1[IN][IP]={

{ 1.2 , 0.23 , 0.5 , 0.75 },

{ 0.7 , 0.22 , 0.21, 0.4},

{ 1.9 , 2.2  , 1.22, 2.34},

};

double W2[HN][IN2]={

{ 0.2 , 0.73 , 0.2  , 0.3 },

{ 0.44, 1.22 , 2.21 , 0.76},

{ 1.1 , 0.86 , 0.11 , 1.64},

};

double W3[ON][HN2]={

{ 1.3 , 0.13 , 0.4 , 0.15 },

{ 0.24, 1.82 ,0.41 , 0.36 },

{ 1.11, 0.56, 3.31 , 0.42 },

};

*/

//介绍

void abstract()

{

cout<<"///////////////////////////////////////"<

cout<<"运用BP算法(3-3-3)训练:"<

cout<<"<1>: 1 , 0 , 0"<

cout<<"<2>: 0 , 1 , 0"<

cout<<"<3>: 0 , 0 , 1"<

cout<<"使网络正确识别上述三组数"<

cout<<"///////////////////////////////////////"<

}

//初始化数据

void ini()

{

int i , j , X=0 , Y=100 ;

time_t t;                                   //随机生成0~1的常量 所需

srand((unsigned) time(&t));                 //随机生成0~1的常量 所需

p=1;

u0=0.25;

alf=0.5 ;

u=0 ;

for( i=0;i<3;i++ )

{for( j=0;j<4;j++ )

//随机生成0~1的常量,需调用#include#include

{    W1[i][j]=0.01*( rand()%(Y-X+1)+X );

dW1[i][j]=0;

W2[i][j]=0.01*( rand()%(Y-X+1)+X );

dW2[i][j]=0;

W3[i][j]=0.01*( rand()%(Y-X+1)+X );

dW3[i][j]=0;

}

}

for( i=0;i

{    O1[i]=1;    }

for( i=0;i

{    O2[i]=1;    }

for( i=0;i

{    O3[i]=1;    }

for( i=0;i

{    Net1[i]=0;

F1[i]=0;

d1[i]=0;

Es1[i]=0;    }

for( i=0;i

{    Net2[i]=0;

F2[i]=0;

d2[i]=0;

Es2[i]=0;    }

for( i=0;i

{    Net3[i]=0;

F3[i]=0;

d3[i]=0;

Es3[i]=0; }

for( i=0;i

{    tempx[i]=0;    }

}

//计算各层误差变量

void errorCompo( double temp_D[])

{

int i , j ;

double m=0;

for(i=0;i

{

Es3[i]=temp_D[i]-O3[i] ;

d3[i]=Es3[i]*F3[i];

Ep[w] += Es3[i]*Es3[i];

}

for(i=0;i

{

m=0;

for(j=0;j

{m += W3[j][i]*d3[j];}

d2[i] = m*F2[i] ;

}

for(i=0;i

{

m=0;

for(j=0;j

{m += W2[j][i]*d2[j];}

d1[i] = m*F1[i] ;

}

}

//显示数据

void show()

{

int i ,j ;

for(i=0;i<3;i++)

{

for(j=0;j<4;j++)

{

cout<

}

cout<

}

cout<<"=================================================="<

for(i=0;i<3;i++)

{

for(j=0;j<4;j++)

{

cout<

}

cout<

}

cout<<"=================================================="<

for(i=0;i<3;i++)

{

for(j=0;j<4;j++)

{

cout<

}

cout<

}

}

//计算增量阈值矩阵

void addW()

{

int i , j ;

for(i=0;i<3;i++)

{for(j=0;j<4;j++)

{    dW3[i][j] += alf*d3[i]*O2[j];    }

}

for(i=0;i<3;i++)

{for(j=0;j<4;j++)

{    dW2[i][j] += alf*d2[i]*O1[j];    }

}

for(i=0;i<3;i++)

{for(j=0;j<4;j++)

{    dW1[i][j] += alf*d1[i]*tempx[j];}

}

}

//更新阈值矩阵

void newW()

{

int i , j ;

for( i=0;i<3;i++ )

{for( j=0;j<4;j++ )

{    W1[i][j]+=dW1[i][j];    }

}

for( i=0;i<3;i++ )

{for( j=0;j<4;j++ )

{    W2[i][j]+=dW2[i][j];    }

}

for( i=0;i<3;i++ )

{for( j=0;j<4;j++ )

{    W3[i][j]+=dW3[i][j];    }

}

}

//增量矩阵重新定义为零

void reflash()

{

int i , j ;

for( i=0;i<3;i++ )

{

for( j=0;j<4;j++ )

{    dW1[i][j]=0;

dW2[i][j]=0;

dW3[i][j]=0;

}

}

}

//第一层所有变量计算,包括“净输入”、“输出”、“S函数的求导”

void proL1( double b[] )

{

int i , j ;

double m ;

for( i=0;i

{    tempx[i] = b[i];    }

for(i=0;i

{

m=0;

for(j=0;j

{

m += (W1[i][j]*tempx[j]);

}

Net1[i] = m ;

}

for(i=0;i

{

u=exp(-Net1[i]/u0);

O1[i]=(1/(1+u));

F1[i]= u/( u0*(1+u)*(1+u) ) ;

}

}

//第二层所有变量计算,包括“净输入”、“输出”、“S函数的求导”

void proL2( )

{

int i , j  ;

double m ;

for(i=0;i

{

m=0;

for(j=0;j

{

m += W2[i][j]*O1[j];

}

Net2[i]=m;                 //net2[1]与matlab不同

}

for(i=0;i

{

u=exp(-Net2[i]/u0);

O2[i]=1/(1+u);

F2[i]= u/( u0*(1+u)*(1+u) ) ;

}

}

//第三层所有变量计算,包括“净输入”、“输出”、“S函数的求导”

void proL3()

{

int i , j  ;

double m ;

for(i=0;i

{

m=0;

for(j=0;j

{

m += W3[i][j]*O2[j];

}

Net3[i]=m;

}

for(i=0;i

{

u=exp(-Net3[i]/u0);

O3[i]=1/(1+u);

F3[i]= u/( u0*(1+u)*(1+u) ) ;

}

}

//测试

void test()

{

cout<<"--------------------测试训练效果-------------------"<

int i , j , k  ;

double y[4]={0,0,0,0};

double testmX[3][4] = {

{ 0 , 0 , 1 , 1 },

{ 0 , 1 , 0 , 1 },

{ 1 , 0 , 0 , 1 },

};

cout<<"-------------------------输入1----------------------"<

for( i=0;i<3;i++ )

{

for( j=0;j<3;j++ )

{

cout<

}

cout<

}

cout<<"-------------------------输出1----------------------"<

for( i=0;i<3;i++ )

{

for( j=0;j<4;j++ )

{    y[j] = testmX[i][j]; }

proL1( y );

proL2();

proL3();

for( k=0;k

{

cout<

}

cout<

}

}

//主函数

int main()

{

abstract();

double mX[3][4] = {

{ 1.0 , 0 , 0 , 1.0 },

{ 0 , 1.0 , 0 , 1.0 },

{ 0 , 0 , 1.0 , 1.0 },

};

double D[3][3] = {

{ 0.9 , 0.1 , 0.1 },

{ 0.1 , 0.9 , 0.1 },

{ 0.1 , 0.1 , 0.9 },

};

double x[4];

double d[3];

int i , j  ;

char stop ;

ini();

cout<<"--------------------初始阈值--------------------"<

show();

cin>>stop;

while(p

{

for( i=0;i<3;i++ )

{

for( j=0;j<4;j++ )

{    x[j] = mX[i][j]; }

for( j=0;j<3;j++ )

{    d[j] = D[i][j];    }

proL1( x );

proL2();

proL3();

errorCompo( d );

addW();

}

newW();

reflash();

p++;

}

cin>>stop;

cout<<"--------------------训练后阈值--------------------"<

show();

cin>>stop;

test();

return 0 ;

cin>>stop;

}

上一篇下一篇

猜你喜欢

热点阅读