📄 bpnet.cpp
字号:
// ********************************
// *** annstudy.cpp *************
// ********************************
#include "bpnet.h"
CBPNet::CBPNet()
{
m_InputNumber=2; //输入层神经元个数初始化
m_HidenNumber=2; //中间层神经元个数初始化
m_OutputNumber=1; //输出层神经元个数初始化
}
/******************************************************/
//初始化各连接权值及各层阈值,赋予(-2,+2)或(-1,+1)之间的
//随机数
//
/******************************************************/
void CBPNet::InitAnnData()
{
ofstream oss("InitWeig.dat");
for(int j=0;j<m_HidenNumber;j++)
{
for(int i=0;i<m_InputNumber;i++)
{
Weight_In_Hd[j*m_InputNumber+i]=
(double)(3*rand()/32767.0-1.618); //(-2,+2)间随机数
// (double)(2*rand()/32767.0-1.0); //(-1,+1)间随机数
oss<<Weight_In_Hd[j*m_InputNumber+i]<<" ";
}
oss<<endl;
}
oss<<endl<<endl<<endl;
for(int t=0;t<m_OutputNumber;t++)
{
for(int j=0;j<m_HidenNumber;j++)
{
Weight_Hd_Ot[t*m_HidenNumber+j]=
(double)(3*rand()/32767.0-1.618);
oss<<Weight_Hd_Ot[t*m_HidenNumber+j]<<" ";
}
oss<<endl;
}
oss<<endl<<endl<<endl;
for(j=0;j<m_HidenNumber;j++)
{
Sita[j]=(double)(3*rand()/32767.0-1.618);
oss<<Sita[j]<<" ";
if(j%5==0) oss<<endl;
}
oss<<endl<<endl<<endl;
for(t=0;t<m_OutputNumber;t++)
{
Gama[t]=(double)(3*rand()/32767.0-1.618);
oss<<Gama[t]<<" ";
if(t%5==0) oss<<endl;
}
oss.close();
}
void CBPNet::LearnInit(int nSample,double a,double b,double Error,
char* ReadStudyFile,char* SaveAnnDataFile)
{
m_nSample=nSample;
alpha=a;
beta=b;
ErrorLimit=Error;
strcpy(StudyFile,ReadStudyFile);
strcpy(AnnDataFile,SaveAnnDataFile);
Weight_In_Hd=new double[m_InputNumber*m_HidenNumber];
Weight_Hd_Ot=new double[m_HidenNumber*m_OutputNumber];
Sita=new double[m_HidenNumber];
Gama=new double[m_OutputNumber];
StudyModel=new double[m_nSample*m_InputNumber];
TeacherModel=new double[m_nSample*m_OutputNumber];
OutputOfHd=new double[m_HidenNumber];
OutputOfOt=new double[m_OutputNumber];
Delt_Hd=new double[m_HidenNumber];
Delt_Ot=new double[m_OutputNumber];
}
void CBPNet::ReadAnnData( )
{
long FilePosition;
ifstream input("InitWeig.dat");
for(int j=0;j<m_HidenNumber;j++)
for(int i=0;i<m_InputNumber;i++)
input>>Weight_In_Hd[j*m_InputNumber+i];
FilePosition=input.tellg();
for(int t=0;t<m_OutputNumber;t++)
for(j=0;j<m_HidenNumber;j++)
input>>Weight_Hd_Ot[t*m_HidenNumber+j];
FilePosition=input.tellg();
for(j=0;j<m_HidenNumber;j++)
input>>Sita[j];
FilePosition=input.tellg();
for(t=0;t<m_OutputNumber;t++)
input>>Gama[t];
input.close();
}
void CBPNet::ReadSample( )
{
long FilePosition;
ifstream iss(StudyFile);
for(int i=0;i<m_nSample;i++)
for(int j=0;j<m_InputNumber;j++)
iss>>StudyModel[i*m_InputNumber+j];
FilePosition=iss.tellg();
for(i=0;i<m_nSample;i++)
for(int t=0;t<m_OutputNumber;t++)
iss>>TeacherModel[i*m_OutputNumber+t];
iss.close();
}
void CBPNet::Forward(int NumSample)
{
double inival;
// Input and Output of Hiden Layer nodes
for(int j=0;j<m_HidenNumber;j++)
{
inival=0.0;
for(int i=0;i<m_InputNumber;i++)
inival+=(Weight_In_Hd[j*m_InputNumber+i]*
StudyModel[NumSample*m_InputNumber+i]);
inival+=Sita[j];
OutputOfHd[j]=sigmf(inival);
}
// Input and Output of Out layer nodes
for(int t=0;t<m_OutputNumber;t++)
{
inival=0.0;
for(int j=0;j<m_HidenNumber;j++)
inival+=Weight_Hd_Ot[t*m_HidenNumber+j]*OutputOfHd[j];
inival+=Gama[t];
OutputOfOt[t]=sigmf(inival);
}
}
void CBPNet::SampleLearning()
{
double error,wk,wkb,inival,GlobalError;
double temp;
int loop=0;
InitAnnData();
ReadAnnData();
ReadSample();
do
{
temp=0.0;
error=0.0;
GlobalError=0.0;
loop+=1;
for(int n=0;n<m_nSample;n++)
{
Forward(n);
/* Calculating Error of out layer */
for(int t=0;t<m_OutputNumber;t++)
{
wk=OutputOfOt[t];
wkb=TeacherModel[n*m_OutputNumber+t]-wk;
Delt_Ot[t]=wkb*wk*(1-wk);
error+=wkb*wkb/2;
}
/* Calculating error of hidden layer */
for(int j=0;j<m_HidenNumber;j++)
{
inival=0.0;
for(int t=0;t<m_OutputNumber;t++)
inival+=(Delt_Ot[t]*Weight_Hd_Ot[t*m_HidenNumber+j]);
wk=OutputOfHd[j];
Delt_Hd[j]=inival*wk*(1.0-wk);
}
/* Updating weight from H layer to Out layer */
for(t=0;t<m_OutputNumber;t++)
{
for(int j=0;j<m_HidenNumber;j++)
Weight_Hd_Ot[t*m_HidenNumber+j]+=(alpha*Delt_Ot[t]*OutputOfHd[j]);
Gama[t]+=beta*Delt_Ot[t];
}
/* Updating weight from I layer to H layer */
for(j=0;j<m_HidenNumber;j++)
{
for(int i=0;i<m_InputNumber;i++)
Weight_In_Hd[j*m_InputNumber+i]+=(alpha*Delt_Hd[j]*StudyModel[n*m_InputNumber+i]);
Sita[j]+=beta*Delt_Hd[j];
}
GlobalError+=error;
}
loop+=1;
printf("Study times GlobalError\n");
printf("%d %8.7f\n",loop,GlobalError);
} while(GlobalError>ErrorLimit);
/* Studying end */
SaveAnnData();
}
void CBPNet::SaveAnnData()
{
ofstream oss(AnnDataFile);
for(int j=0;j<m_HidenNumber;j++)
{
for(int i=0;i<m_InputNumber;i++)
oss<<Weight_In_Hd[j*m_InputNumber+i]<<" ";
oss<<endl;
}
oss<<endl<<endl<<endl;
for(int t=0;t<m_OutputNumber;t++)
{
for(int j=0;j<m_HidenNumber;j++)
oss<<Weight_Hd_Ot[t*m_HidenNumber+j]<<" ";
oss<<endl;
}
oss<<endl<<endl<<endl;
for(j=0;j<m_HidenNumber;j++)
oss<<Sita[j]<<" ";
oss<<endl<<endl;
for(t=0;t<m_OutputNumber;t++)
oss<<Gama[t]<<" ";
oss.close();
delete []OutputOfHd;
delete []OutputOfOt;
delete []Delt_Hd;
delete []Delt_Ot;
delete []StudyModel;
delete []TeacherModel;
delete []Weight_In_Hd;
delete []Weight_Hd_Ot;
delete []Sita;
delete []Gama;
}
void CBPNet::TestInit(int mTest,char* ReadTestFile)
{
m_nTest=mTest;
strcpy(TestDataFile,ReadTestFile);
Weight_In_Hd=new double[m_InputNumber*m_HidenNumber];
Weight_Hd_Ot=new double[m_HidenNumber*m_OutputNumber];
Sita=new double[m_HidenNumber];
Gama=new double[m_OutputNumber];
TOutputOfHd=new double[m_nTest*m_HidenNumber];
TOutputOfOt=new double[m_nTest*m_OutputNumber];
TestModel=new double[m_nTest*m_InputNumber];
}
void CBPNet::ReadLearnedData()
{
long FilePosition;
ifstream input("trained.dat");
for(int j=0;j<m_HidenNumber;j++)
for(int i=0;i<m_InputNumber;i++)
input>>Weight_In_Hd[j*m_InputNumber+i];
FilePosition=input.tellg();
for(int t=0;t<m_OutputNumber;t++)
for(j=0;j<m_HidenNumber;j++)
input>>Weight_Hd_Ot[t*m_HidenNumber+j];
FilePosition=input.tellg();
for(j=0;j<m_HidenNumber;j++)
input>>Sita[j];
FilePosition=input.tellg();
for(t=0;t<m_OutputNumber;t++)
input>>Gama[t];
input.close();
}
void CBPNet::ReadTestData()
{
ifstream iss(TestDataFile);
for(int n=0;n<m_nTest;n++)
for(int i=0;i<m_InputNumber;i++)
iss>>TestModel[n*m_InputNumber+i];
iss.close();
}
void CBPNet::Test()
{
FILE* test=0;
test=fopen("测试结果.dat","wt");
ReadLearnedData();
ReadTestData();
for(int n=0;n<m_nTest;n++)
{
for(int j=0;j<m_HidenNumber;j++)
{
double inival=0.0;
for(int i=0;i<m_InputNumber;i++)
inival+=(Weight_In_Hd[j*m_InputNumber+i]*
TestModel[n*m_InputNumber+i]);
inival+=Sita[j];
TOutputOfHd[n*m_HidenNumber+j]=sigmf(inival);
}
// Input and Output of Out layer nodes
for(int t=0;t<m_OutputNumber;t++)
{
double inival=0.0;
for(int j=0;j<m_HidenNumber;j++)
inival+=Weight_Hd_Ot[t*m_HidenNumber+j]*TOutputOfHd[n*m_HidenNumber+j];
inival+=Gama[t];
TOutputOfOt[n*m_OutputNumber+t]=sigmf(inival);
fprintf(test,"%4.3f ",TOutputOfOt[n*m_OutputNumber+t]);
}
fprintf(test,"\n");
if((n+1)%5==0) fprintf(test,"\n");
}
delete []TOutputOfHd;
delete []TOutputOfOt;
delete []TestModel;
delete []Weight_In_Hd;
delete []Weight_Hd_Ot;
delete []Sita;
delete []Gama;
fclose(test);
}
CBPNet::~CBPNet()
{
}
void main()
{
int choice;
CBPNet ann;
cout<<"Number 1 Stands the ANN is going to learn"<<endl;
cout<<"Number 2 Stands the Trained ANN is to be tested"<<endl;
cout<<"Please input you choice:"<<endl;
cin>>choice;
if(choice==1)
{
ann.LearnInit(4,0.5,0.6,0.01,"study.dat","trained.dat");
ann.SampleLearning();
}
else if(choice==2)
{
ann.TestInit(3,"测试文件.dat");
ann.Test();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -