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

📄 bkneuro.h

📁 類神經網路的BK演算法
💻 H
📖 第 1 页 / 共 2 页
字号:
#if !defined(BKNEURO_H)

#include "array.h"

#include "randgen.h"

#include <math.h>

#include <time.h>

#include <iomanip.h>

#include <fstream.h>



class BKNeuroNet

{

protected:

//	Nombres de neurones pour chaque couche

	int nb_dim;

	int nb_out;

	int nb_hid;

// Poids de connextion au seins du R.N.

	f2D poid_xh, poid_hy;

	f2D dPoid_xh, dPoid_hy;

	f1D theta_h, theta_y;

	f1D dTheta_h, dTheta_y;

	f1D x, hid, y;

	f1D desire_y;

	f1D delta_h, delta_y;

    f1D max,min,scaling;

//	Parametres d'apprentissage

	double eta,eta_rate,eta_min;

	double alpha,alpha_rate,alpha_min;

//	Initialisation des poids de connextion

	void MemoryAlloc();

	void MemoryFree();

// Autres

	float sum;

// Batch data

	f2D input,output;

	int nb_record;

   bool vide;

public:

//	vecteurs de normalisation

	BKNeuroNet(){nb_dim=0;nb_hid=0;nb_out=0;vide=true;}

	void Initialize(int n1, int n2, int n3);

  	void Initialize(int nn_hidden);

	void Initialize(char* Filename);

	void Initialize(ifstream& in);

   void Finish(){MemoryFree();}

	~BKNeuroNet();

	void SetRandomPoid();

	void SetRandomPoid(unsigned long seed);

	void SetNbOfHidden(int nn){nb_hid=nn;}

	void SetupPara(double& e1,double& e2,double& e3,double& r1,double& r2,double& r3);

	void GetPara(double& e1,double& e2,double& e3,double& r1,double& r2,double& r3);

	void AutoSetPara(int nb_example, int nb_cycle);

	void AutoSetPara(int nb){AutoSetPara(nb_record, nb);}

	void ModifyPara();

	void LoadTrainingData(ifstream& in);

	void LoadTrainingData(int n1,int n2,int n3, f2D& XV, f2D& YV);

	void ApplyToTestingData(ifstream& in, ofstream& out);

	void ApplyToTestingData(ifstream& in, f2D& observed, f2D& infered);

	void ApplyToData(f2D& Input, f2D& Output);

	void Save(char *FileName);

	void Save(ofstream& out);

	void SetData(f1D &xi, f1D &s){x=xi;desire_y=s;}

	void SetData(f1D &xi){x=xi;}

	float Learning();

	float Learning(f1D &xi, f1D &s);

	float LearningFromBatchData();

	f1D& Using();

	f1D& Using(f1D &xi);

	int Get_nb_dim(){return nb_dim;}

	int Get_nb_out(){return nb_out;}

	f2D TransDependantTable();

};



void BKNeuroNet::MemoryAlloc()

{

	poid_xh.Initialize(nb_dim,nb_hid);

	poid_hy.Initialize(nb_hid,nb_out);

	dPoid_xh.Initialize(nb_dim,nb_hid);

	dPoid_hy.Initialize(nb_hid,nb_out);

	theta_h.Initialize(nb_hid);

	theta_y.Initialize(nb_out);

	dTheta_h.Initialize(nb_hid);

	dTheta_y.Initialize(nb_out);

	x.Initialize(nb_dim);

	hid.Initialize(nb_hid);

	y.Initialize(nb_out);

	desire_y.Initialize(nb_out);

	delta_h.Initialize(nb_hid);

	delta_y.Initialize(nb_out);

	max.Initialize(nb_dim+nb_out);

	min.Initialize(nb_dim+nb_out);

	scaling.Initialize(nb_dim+nb_out);

   vide=false;

}



void BKNeuroNet::MemoryFree()

{

	poid_xh.Finish();

	poid_hy.Finish();

	dPoid_xh.Finish();

	dPoid_hy.Finish();

	theta_h.Finish();

	theta_y.Finish();

	dTheta_h.Finish();

	dTheta_y.Finish();

	x.Finish();

	hid.Finish();

	y.Finish();

	desire_y.Finish();

	delta_h.Finish();

	delta_y.Finish();

	max.Finish();

	min.Finish();

	scaling.Finish();

   vide=true;

}



void BKNeuroNet::Initialize(int n1, int n2, int n3)

{

	nb_dim=n1;

	nb_hid=n2;

	nb_out=n3;

	MemoryAlloc();

	SetRandomPoid();

	eta=5.0;eta_rate=0.9999;eta_min=0.00001;

	alpha=1.0;alpha_rate=0.9998;alpha_min=0.00001;

}



void BKNeuroNet::Initialize(char* FileName)

{

	ifstream f2(FileName);

	Initialize(f2);

}



void BKNeuroNet::Initialize(ifstream& f2)

{

	int h,i,j;

	f2>>ws>>setw(10)>>nb_dim>>setw(10)>>nb_hid>>setw(10)>>nb_out;

	MemoryAlloc();

	for(h=0;h<nb_hid;h++)for(i=0;i<nb_dim;i++)

		f2>>ws>>setw(12)>>setprecision(6)>>poid_xh.m[i][h];

	for(j=0;j<nb_out;j++)for(h=0;h<nb_hid;h++)

		f2>>ws>>setw(12)>>setprecision(6)>>poid_hy.m[h][j];

	for(h=0;h<nb_hid;h++)

		f2>>ws>>setw(12)>>setprecision(6)>>theta_h.m[h];

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

		f2>>ws>>setw(12)>>setprecision(6)>>theta_y.m[j];

	for(j=0;j<nb_dim+nb_out;j++)

		f2>>ws>>setw(12)>>setprecision(6)>>max.m[j];

	for(j=0;j<nb_dim+nb_out;j++)

		f2>>ws>>setw(12)>>setprecision(6)>>min.m[j];

	for(j=0;j<nb_dim+nb_out;j++)

		f2>>ws>>setw(12)>>setprecision(6)>>scaling.m[j];

	eta=5.0;eta_rate=0.99999;eta_min=0.0001;

	alpha=1.0;alpha_rate=0.99998;alpha_min=0.0001;

}



//	Destructeur

BKNeuroNet::~BKNeuroNet()

{

}



//	fonction membre BKNeuroNet::SetPoid

void BKNeuroNet::SetRandomPoid()

{

	int h,i,j;

	unsigned long seed = (unsigned long)time(0);

	fRan32 *rg=new fRan32(seed);

	for(h=0;h<nb_hid;h++)for(i=0;i<nb_dim;i++)poid_xh.m[i][h]=rg->Next(0.0,1.0);

	for(j=0;j<nb_out;j++)for(h=0;h<nb_hid;h++)poid_hy.m[h][j]=rg->Next(0.0,1.0);

	for(h=0;h<nb_hid;h++)theta_h.m[h]=rg->Next(0.0,1.0);

	for(j=0;j<nb_out;j++)theta_y.m[j]=rg->Next(0.0,1.0);

	delete rg;

}



//	fonction membre BKNeuroNet::SetPoid

void BKNeuroNet::SetRandomPoid(unsigned long seed)

{

	int h,i,j;

	fRan32 *rg=new fRan32(seed);

	for(h=0;h<nb_hid;h++)for(i=0;i<nb_dim;i++)poid_xh.m[i][h]=rg->Next(0.0,1.0);

	for(j=0;j<nb_out;j++)for(h=0;h<nb_hid;h++)poid_hy.m[h][j]=rg->Next(0.0,1.0);

	for(h=0;h<nb_hid;h++)theta_h.m[h]=rg->Next(0.0,1.0);

	for(j=0;j<nb_out;j++)theta_y.m[j]=rg->Next(0.0,1.0);

	delete rg;

}

//	Fonction membre BKNeuroNet::Save

void BKNeuroNet::Save(char* FileName)

{

	ofstream out(FileName);

	Save(out);

}



void BKNeuroNet::Save(ofstream& out)

{

	int h,i,j;

	out<<setw(10)<<nb_dim<<setw(10)<<nb_hid<<setw(10)<<nb_out<<endl;

	for(h=0;h<nb_hid;h++){for(i=0;i<nb_dim;i++){

		out<<setw(12)<<setprecision(6)<<poid_xh.m[i][h];}out<<endl;}

	for(j=0;j<nb_out;j++){for(h=0;h<nb_hid;h++){

		out<<setw(12)<<setprecision(6)<<poid_hy.m[h][j];}out<<endl;}

	for(h=0;h<nb_hid;h++){

		out<<setw(12)<<setprecision(6)<<theta_h.m[h];}out<<endl;

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

		out<<setw(12)<<setprecision(6)<<theta_y.m[j];}out<<endl;

	for(j=0;j<nb_dim+nb_out;j++){

		out<<setw(12)<<setprecision(6)<<max.m[j];}out<<endl;

  	for(j=0;j<nb_dim+nb_out;j++){

		out<<setw(12)<<setprecision(6)<<min.m[j];}out<<endl;

	for(j=0;j<nb_dim+nb_out;j++){

		out<<setw(12)<<setprecision(6)<<scaling.m[j];}out<<endl;

}



//	Fonction membre BKNeuroNet::SetupPara

void BKNeuroNet::SetupPara(double& e1,double& e2,double& e3,double& r1,double& r2,double& r3)

{

	eta=e1;

	eta_rate=e2;

	eta_min=e3;

	alpha=r1;

	alpha_rate=r2;

	alpha_min=r3;

}



//	Fonction membre BKNeuroNet::GetPara

void BKNeuroNet::GetPara(double& e1,double& e2,double& e3,double& r1,double& r2,double& r3)

{

	e1=eta;

	e2=eta_rate;

	e3=eta_min;

	r1=alpha;

	r2=alpha_rate;

	r3=alpha_min;

}



void BKNeuroNet::AutoSetPara(int nb_example, int nb_cycle)

{

	eta=8.0;eta_rate=0.99999;eta_min=0.001;

	alpha=1.5;alpha_rate=0.99997;alpha_min=0.001;

	float n=1.0/float(nb_cycle);

	eta_rate=pow(eta_min/eta,n);

	alpha_rate=pow(alpha_min/alpha,n);

}



//	Fonction membre BKNeuroNet::Learning

float BKNeuroNet::Learning()

{

	int h,i,j;

	for(h=0; h<nb_hid;h++)

	{

		sum=0.0;

		for(i=0;i<nb_dim;i++)sum=sum+x.m[i]*poid_xh.m[i][h];

		hid.m[h]=1.0/(1.0+exp(-(sum-theta_h.m[h])));

	}

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

	{

		sum=0.0;

		for(h=0;h<nb_hid;h++)sum=sum+hid.m[h]*poid_hy.m[h][j];

		y.m[j]=1.0/(1.0+exp(-(sum-theta_y.m[j])));

	}

	for(j=0;j<nb_out;j++)delta_y.m[j]=y.m[j]*(1.0-y.m[j])*(desire_y.m[j]-y.m[j]);

	for(h=0;h<nb_hid;h++)

	{

		sum=0.0;

		for(j=0;j<nb_out;j++)sum=sum+poid_hy.m[h][j]*delta_y.m[j];

		delta_h.m[h]=hid.m[h]*(1.0-hid.m[h])*sum;

	}

	for(j=0;j<nb_out;j++)for(h=0;h<nb_hid;h++)dPoid_hy.m[h][j]=0.0;

	for(h=0;h<nb_hid;h++)for(i=0;i<nb_dim;i++)dPoid_xh.m[i][h]=0.0;

	for(j=0;j<nb_out;j++)dTheta_y.m[j]=0.0;

	for(h=0;h<nb_hid;h++)dTheta_h.m[h]=0.0;

	for(j=0;j<nb_out;j++){for(h=0;h<nb_hid;h++)

		{dPoid_hy.m[h][j]=eta*delta_y.m[j]*hid.m[h]+alpha*dPoid_hy.m[h][j];}}

	for(j=0;j<nb_out;j++)dTheta_y.m[j]=-eta*delta_y.m[j]+alpha*dTheta_y.m[j];

	for(h=0;h<nb_hid;h++){for(i=0;i<nb_dim;i++)

		{dPoid_xh.m[i][h]=eta*delta_h.m[h]*x.m[i]+alpha*dPoid_xh.m[i][h];}}

	for(h=0;h<nb_hid;h++)dTheta_h.m[h]=-eta*delta_h.m[h]+alpha*dTheta_h.m[h];

	for(j=0;j<nb_out;j++){for(h=0;h<nb_hid;h++)

		{poid_hy.m[h][j]=poid_hy.m[h][j]+dPoid_hy.m[h][j];}}

	for(j=0;j<nb_out;j++)theta_y.m[j]=theta_y.m[j]+dTheta_y.m[j];

	for(h=0;h<nb_hid;h++){for(i=0;i<nb_dim;i++)

		{poid_xh.m[i][h]=poid_xh.m[i][h]+dPoid_xh.m[i][h];}}

	for(h=0;h<nb_hid;h++)theta_h.m[h]=theta_h.m[h]+dTheta_h.m[h];

	alpha=alpha*alpha_rate;

	if(alpha<alpha_min)alpha=alpha_min;

	eta=eta*eta_rate;

	if(eta<eta_min)eta=eta_min;

	float err=0.0;

    for(j=0;j<nb_out;j++)err+=fabs(desire_y.m[j]-y.m[j]);

	return err/nb_out;

}



//	Fonction membre BKNeuroNet::Learning

float BKNeuroNet::Learning(f1D &xi, f1D &s)

{

	int h,i,j;

	for(i=0;i<nb_dim;i++)x.m[i]=(xi.m[i]-min.m[i])*scaling.m[i];

	for(j=0;j<nb_out;j++)desire_y.m[j]=(s.m[j]-min.m[j+nb_dim])*scaling.m[j+nb_dim];

	for(h=0; h<nb_hid;h++)

	{

		sum=0.0;

		for(i=0;i<nb_dim;i++)sum=sum+x.m[i]*poid_xh.m[i][h];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -