📄 bkneuro.h
字号:
#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 + -