BP神经网络实现异或功能C++.docx
《BP神经网络实现异或功能C++.docx》由会员分享,可在线阅读,更多相关《BP神经网络实现异或功能C++.docx(15页珍藏版)》请在冰豆网上搜索。
BP神经网络实现异或功能C++
#include"iostream.h"
#include"iomanip.h"
#include"stdlib.h"
#include"math.h"
#include"stdio.h"
#include"time.h"
#include"fstream.h"
#defineN4//学习样本个数
#defineT_N4//检验样本的个数
#defineIN2//输入层神经元数目
#defineHN3//隐层神经元数目
#defineON1//输出层神经元数目
//一般化误差数组
doubledelta_ON[N][ON];
doubledelta_HN[N][HN];
//doubledelta_IN[N][IN];
//doubleP[IN];//单个样本输入数据
doubleP[N][IN];//单个样本输入数据
//doubleT[ON];//单个样本教师数据
doubleT[N][ON];//单个样本教师数据
doubleW[HN][IN];//输入层至隐层权值
doubleV[ON][HN];//隐层至输出层权值
doubleX[HN];//隐层的输入
doubleY[ON];//输出层的输入
//doubleH[HN];//隐层的输出
doubleH[N][HN];//隐层的输出
doubleO[ON];//输出层的输出
doubleYU_HN[HN];//隐层的阈值
doubleYU_ON[ON];//输出层的阈值
//doubleerr_m[N];//第m个样本的总误差
doubleerr_m[N][ON];//第m个样本的总误差
doublesum_err_m[N];
doublea1;//输出层至隐层的学习效率
doublea2;
doubleb1;//隐层至输入层学习效率
doubleb2;
ofstreamout_test_result("test_result.txt",ios:
:
out);
//定义一个放学习样本的结构
struct{
doubleinput[IN];//输入在上面定义是一个
doubleteach[ON];//输出在上面定义也是一个
}Study_Data[N];//学习样本
//定义一个放检测样本的结构
struct{
doubleinput[IN];//输入在上面定义是一个
doubleteach[ON];//输出在上面定义也是一个
}Test_Data[T_N];//检测样本
///////////////////////////
//初始化权、阈值子程序/////
///////////////////////////
initial()
{
//隐层权、阈值初始化//
srand((unsigned)time(NULL));
for(inti=0;ifor(intj=0;jW[i][j]=rand()/double(RAND_MAX);
for(intii=0;iifor(intjj=0;jjV[ii][jj]=rand()/double(RAND_MAX);
for(intk=0;kYU_HN[k]=rand()/double(RAND_MAX);
for(intkk=0;kkYU_ON[kk]=rand()/double(RAND_MAX);
return1;
}//子程序initial()结束
////////////////////////////////
////第m个学习样本输入子程序///
///////////////////////////////
Train_input_P(intm)
{
for(inti=0;iP[m][i]=Study_Data[m].input[i];
//获得第m个样本的数据
return1;
}//子程序Train_input_P(m)结束
Test_input_P(intm)
{
for(inti=0;iP[m][i]=Test_Data[m].input[i];
//获得第m个样本的数据
return1;
}//子程序Test_input_P(m)结束
/////////////////////////////
////第m个样本教师信号子程序//
/////////////////////////////
Train_input_T(intm)
{
for(intk=0;kT[m][k]=Study_Data[m].teach[k];
return1;
}//子程序Train_input_T(m)结束
Test_input_T(intm)
{
for(intk=0;kT[m][k]=Test_Data[m].teach[k];
return1;
}//子程序Test_input_T(m)结束
/////////////////////////////////
//隐层各单元输入、输出值子程序///
/////////////////////////////////
H_I_O(intm)
{
doublesigma;
for(intj=0;j{
sigma=0.0;
for(inti=0;isigma+=W[j][i]*P[m][i];//求隐层内积
X[j]=sigma-YU_HN[j];
H[m][j]=1.0/(1.0+exp(-X[j]));//求隐层输出siglon算法
}
return1;
}//子程序H_I_O()结束
///////////////////////////////////
//输出层各单元输入、输出值子程序///
///////////////////////////////////
O_I_O(intm)
{
doublesigma;
for(intk=0;k{
sigma=0.0;
for(intj=0;jsigma+=V[k][j]*H[m][j];
Y[k]=sigma-YU_ON[k];//求输出层净输入
O[k]=1.0/(1.0+exp(-Y[k]));//求输出层输出
}
return1;
}//子程序O_I_O()结束
////////////////////////////////////
//输出层至隐层的一般化误差子程序////
////////////////////////////////////
//doubled_err[ON];
Err_O_H(intm)
{
doubleabs_err[ON];//每个样本的绝对误差都是从0开始的
doublesqr_err=0;//每个样本的平方误差计算都是从0开始的
sum_err_m[m]=0.0;
for(intk=0;k{
abs_err[k]=T[m][k]-O[k];
sqr_err+=(abs_err[k])*(abs_err[k]);//求第m个样本下输出层的平方误差
delta_ON[m][k]=abs_err[k]*O[k]*(1.0-O[k]);
err_m[m][k]=sqr_err/2;
}
for(intj=0;jsum_err_m[m]+=err_m[m][j];
return1;
}//子程序Err_O_H(m)结束
////////////////////////////////////
//隐层至输入层的一般化误差子程序////
////////////////////////////////////
//doublee_err[HN];
Err_H_I(intm)
{
doublesigma;
for(intj=0;j{
sigma=0.0;
for(intk=0;ksigma+=delta_ON[m][k]*V[k][j];
delta_HN[m][j]=sigma*H[m][j]*(1-H[m][j]);
}
return1;
}//子程序Err_H_I()结束
////////////////////////////////////////////////////////
//输出层至隐层的权值调整、输出层阈值调整计算子程序//////
////////////////////////////////////////////////////////
Delta_O_H()
{
for(intk=0;k{
for(intj=0;j{
doubletemp1=0.0;
for(intm=0;mtemp1+=delta_ON[m][k]*H[m][j];
V[k][j]+=a1*temp1;
}
doubletemp2=0.0;
for(inti=0;itemp2+=delta_ON[i][k];
YU_ON[k]-=a2*temp2;//输出层至隐层的阈值调整
}
return1;
}//子程序Delta_O_H()结束
/////////////////////////////////////////////////////
//隐层至输入层的权值调整、隐层阈值调整计算子程序/////
/////////////////////////////////////////////////////
//Delta_H_I(intm)
Delta_H_I()
{
for(intj=0;j{
for(inti=0;i{
doubletemp1=0.0;
for(intm=0;mtemp1+=delta_HN[m][j]*P[m][i];
W[j][i]+=b1*temp1;
}
doubletemp2=0.0;
for(intk=0;ktemp2+=delta_HN[k][j];
YU_HN[j]-=b2*temp2;
}
return1;
}//子程序Delta_H_I()结束
/////////////////////////////////
//N个样本的全局误差计算子程序////
/////////////////////////////////
doubleErr_Sum()
{
doubletotal_err=0;
for(intm=0;mtotal_err+=sum_err_m[m];
returntotal_err;
}//子程序Err_sum()结束
GetTrainingData()
{
ifstreamGetTrainingData("训练样本.txt",ios:
:
in);
for(intm=0;m{
for(inti=0;iGetTrainingData>>Study_Data[m].input[i];//取得输入数据
for(intj=0;jGetTrainingData>>Study_Data[m].teach[j];//取得输出数据
}
GetTrainingData.close();
return1;
}
GetTestingData()
{
ifstreamGetTestingData("检测样本.txt",ios:
:
in);
for(intm=0;m{
for(inti=0;iGetTestingData>>Test_Data[m].input[i];//取得输入数据
for(intj=0;jGetTestingData>>Test_Data[m].teach[j];//取得输出数据
}
GetTestingData.close();
return1;
}
voidsavequan()
{
ofstreamoutQuanFile("权值.txt",ios:
:
out);
ofstreamoutYuFile("阈值.txt",ios:
:
out);
outQuanFile<<"A\n";
for(inti=0;i{
for(intj=0;joutQuanFile<outQuanFile<<"\n";
}
outQuanFile<<"B\n";
for(intii=0;ii{
for(intjj=0;jjoutQuanFile<outQuanFile<<"\n";
}
outYuFile<<"输出层的阈值为:
\n";
for(intk=0;koutYuFile<outYuFile<<"\n隐层的阈值为:
\n";
for(intkk=0;kkoutYuFile<outYuFile.close();
outQuanFile.close();
}
/**********************/
/**程序入口,即主程序**/
/**********************/
voidmain()
{
doublesum_err;
intstudy=0;//训练次数
a1=0.5;
a2=0.1;
b1=0.5;
b2=0.1;
doublePre_error=0.001;//预定误差
GetTrainingData();
initial();//隐层、输出层权、阈值初始化
(1)
do
{
++study;
for(intm=0;m{
Train_input_P(m);//输入第m个学习样本
(2)
Train_input_T(m);//输入第m个样本的教师信号(3)
H_I_O(m);//第m个学习样本隐层各单元输入、输出值(4)
O_I_O(m);//第m个学习样本输出层各单元输入、输出值(5)
Err_O_H(m);//第m个学习样本输出层至隐层一般化误差(6)
Err_H_I(m);//第m个学习样本隐层至输入层一般化误差(7)
}//全部样本训练完毕
Delta_O_H();
Delta_H_I();
sum_err=Err_Sum();//全部样本全局误差计算(10)
cout<<"第"<}while(sum_err>Pre_error);//while(study<2000);//while((sum_err>Pre_error)||study<2000);
cout<<"网络已经学习了"<savequan();
GetTestingData();
for(intm=0;m{
Test_input_P(m);//输入第m个检验样本
Test_input_T(m);//输入第m个样本的教师信号
H_I_O(m);//第m个检验样本隐层各单元输入、输出值
O_I_O(m);//第m个检验样本输出层各单元输入、输出值
out_test_result<";
for(inti=0;iout_test_result<out_test_result<";
for(intj=0;jout_test_result<out_test_result<<"\n";
//out_test_result.close();
}
}
(注:
文档可能无法思考全面,请浏览后下载,供参考。
可复制、编制,期待你的好评与关注)