⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bpnet.cpp

📁 BP人工神经网络的程序
💻 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 + -