📄 bp_solve_xor.cpp
字号:
/* ========================================== *
* Filename: BP_Solve_XOR.cpp *
* Description: *
* 一个微型神经网络,使用BP来调整权值 *
* 来解决异或问题 *
* ========================================== */
#include <iostream.h>
#include <time.h>
#include "backprop.h"
#define BPM_ITER 20000 // 训练神经网络时的迭代次数
#define BP_LEARNING (float)(0.3) // 学习系数
#define BP_MOMENTUM (float)(0.3) // 动量因子
#define BP_EO (float)(0.007) //收敛时输出层误差的最大值
#define BP_EH (float)(0.007) //收敛时隐含层误差的最大值
void main()
{
BPNN *net;
int i,j,seed,Iteration;
double eo,eh; // eo:每次训练后输出层误差;eh:每次训练后隐含层误差
Iteration = 0; //算法收敛时的迭代次数,不收敛时,Iteration = 0
/* 为了给神经网络的权值赋初值(-1~1间的随机数),首先设定随机数的种子 */
seed=((unsigned)(time(NULL)));
bpnn_initialize(seed);
/* 创建一个输入层有两个神经元,隐含层有两个神经元,输出层有一个神经元的BP神经网络 */
net=bpnn_create(2,2,1);
/* 提供输入序列和期望得到的目标序列,用来训练BP网络的权值 */
for(i=0;i<BPM_ITER;i++)
{
net->input_units[1]=0;
net->input_units[2]=0;
net->target[1]=0;
bpnn_train(net,BP_LEARNING,BP_MOMENTUM,&eo,&eh);
net->input_units[1]=0;
net->input_units[2]=1;
net->target[1]=1;
bpnn_train(net,BP_LEARNING,BP_MOMENTUM,&eo,&eh);
net->input_units[1]=1;
net->input_units[2]=0;
net->target[1]=1;
bpnn_train(net,BP_LEARNING,BP_MOMENTUM,&eo,&eh);
net->input_units[1]=1;
net->input_units[2]=1;
net->target[1]=0;
bpnn_train(net,BP_LEARNING,BP_MOMENTUM,&eo,&eh);
if((eo<BP_EO)&&(eh<BP_EH))
{
Iteration = i;
break;
}
}
/* 显示训练后网络的输入层权值矩阵,隐含层权值矩阵,输出层和隐含层产生的误差 */
cout<<"Weights Metrix and errors:"<<endl;
for(i=1;i<=2;i++)
{
for(j=0;j<=2;j++)
cout<<"WI("<<j<<","<<i<<")"<<net->input_weights[j][i]<<endl;
}
for(i=1;i<=1;i++)
{
for(j=0;j<=2;j++)
cout<<"WO("<<j<<","<<i<<")"<<net->hidden_weights[j][i]<<endl;
}
cout<<"eo:"<<eo<<endl;
cout<<"eh:"<<eh<<endl;
cout<<endl;
if (Iteration == 0)
{
cout<<"Net isn't convergent."<<endl;
}
else
{
cout<<"Number of iterations is : "<<Iteration<<endl;
}
cout<<endl;
/* 利用训练好的网络来对输入序列产生响应 */
cout<<"Testing..."<<endl;
net->input_units[1]=0;
net->input_units[2]=0;
bpnn_feedforward(net);
cout<<"0,0="<<net->output_units[1]<<endl;
net->input_units[1]=0;
net->input_units[2]=1;
bpnn_feedforward(net);
cout<<"0,1="<<net->output_units[1]<<endl;
net->input_units[1]=1;
net->input_units[2]=0;
bpnn_feedforward(net);
cout<<"1,0="<<net->output_units[1]<<endl;
net->input_units[1]=1;
net->input_units[2]=1;
bpnn_feedforward(net);
cout<<"1,1="<<net->output_units[1]<<endl;
bpnn_free(net);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -