📄 bpnet.h
字号:
#define P 30
#define Q 0.6
#include "iostream.h"
#include <math.h>
class BPNet
{
public:
int nLayNumb;
int nUnitNumb[4];
double w[4][6][6];
double OutPut[4][6],InPut[16][2];
int bSuccess;
public:
BPNet();
~BPNet();
void TestFunc();
};
BPNet::BPNet()
{
int sum=0;
cout<<"输入网络层数: ";
cin>>nLayNumb;
cout<<'\n';
cout<<"输入各层神经元数: ";
for (int i=0;i<nLayNumb;i++)
{
cin>>nUnitNumb[i];
}
cout<<'\n';
for (int l=0;l<nLayNumb-1;l++)
{
for (int m=0;m<nUnitNumb[l];m++)
{
for (int n=0;n<nUnitNumb[l+1];n++)
{
sum++;
}
}
}
cout<<"输入"<<sum<<"个初始权值: ";
for (l=1;l<nLayNumb;l++)
{
for (int m=0;m<nUnitNumb[l];m++)
{
for (int n=0;n<nUnitNumb[l-1];n++)
{
cin>>w[l][m][n];
}
}
}
cout<<'\n';
}
BPNet::~BPNet()
{
}
void BPNet::TestFunc()
{
double dData[P][2]=
{ 1.0,0.8,
0.2,0.0,
1.0,1.0,
0.9,0.1,
1.0,0.8,
1.0,1.0,
0.1,0.2,
1.0,0.9,
0.0,1.0,
0.8,0.2,
0.0,0.0,
0.2,0.9,
0.9,0.9,
0.0,0.0,
0.8,0.1,
0.0,0.0,
0.1,0.2,
0.9,0.8,
0.0,0.9,
1.0,0.0,
0.9,0.8,
0.0,0.9,
1.0,0.8,
1.0,0.0,
0.9,0.9,
0.9,0.9,
0.0,1.0,
1.0,0.0,
0.9,0.8,
0.0,1.0
};
//double t[P]={1,0,1,0,1,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,1,0,1,1,0,0,1,0};//与
double t[P]={0,0,0,1,0,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,1,1,0,1}; //异或
//double t[P]={1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1};//或
double dError[P][4][6],finalerror[P];
int i,j,l,p,k;
double sum=0,sum1=0;
double wOffset[4][6][6];
for (k=0;k<200000;k++)
{
for (p=0;p<P;p++)
{
for (j=0;j<nUnitNumb[0];j++)
{
OutPut[0][j]=dData[p][j]; //第p层各神经元的输出
}
for (l=1;l<nLayNumb;l++)
{
for (j=0;j<nUnitNumb[l];j++)
{
sum=0;
for (i=0;i<nUnitNumb[l-1];i++)
{
sum+=w[l][j][i]*OutPut[l-1][i];
}
OutPut[l][j]=1/(1+exp(-sum));
}
}
dError[p][nLayNumb-1][nUnitNumb[nLayNumb-1]-1]=
(t[p]-OutPut[nLayNumb-1][nUnitNumb[nLayNumb-1]-1])*OutPut[nLayNumb-1][nUnitNumb[nLayNumb-1]-1]*(1-OutPut[nLayNumb-1][nUnitNumb[nLayNumb-1]-1]);
finalerror[p]=t[p]-OutPut[nLayNumb-1][nUnitNumb[nLayNumb-1]-1];
if (fabs(finalerror[p])<0.2)
{
continue;
}
for (l=nLayNumb-2;l>=0;l--)
{
for (j=0;j<nUnitNumb[l];j++)
{
sum1=0;
for (i=0;i<nUnitNumb[l+1];i++)
{
sum1+=w[l][j][i]*dError[p][l+1][i];
}
dError[p][l][j]=OutPut[l][j]*(1-OutPut[l][j])*sum1;
}
}
for (l=1;l<nLayNumb;l++)
{
for (j=0;j<nUnitNumb[l];j++)
{
for (i=0;i<nUnitNumb[l-1];i++)
{
wOffset[l][j][i]=Q*dError[p][l][j]*OutPut[l-1][i];
w[l][j][i]+=wOffset[l][j][i];
}
}
}
}
int errorToatl=0;
for (i=0;i<P;i++)
{
if (fabs(finalerror[i])<0.2)
{
errorToatl+=1;
}
}
if (errorToatl==P)
{
cout<<"样本学习结束!\n迭代次数:"<<k;
cout<<'\n';
bSuccess=1;
break;
}
else
{
bSuccess=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -