📄 bpnet.h
字号:
#include<math.h>
#include<stdlib.h>
#include<time.h>
#define BP_LEARNING (float)(0.5)
class CBPNet
{
public:
CBPNet();
float Train(float,float,float,float,float);
float Run(float,float,float,float);
private:
float m_fWeight[4][2]; //两个神经元
float Sigmoid(float);
};
CBPNet::CBPNet()//构造函数
{
srand((unsigned)(time(NULL)));
for(int i=0; i<4; i++)
{
for(int j=0; j<2; j++)
{
m_fWeight[i][j]=(float)(rand())/(32767/2)-1;//变为float型,初始权值
}
}
}
//训练
float CBPNet::Train(float i1,float i2 ,float d,float deviator1,float deviator2)
{
float net1,net2,i3,i4;
//计算隐含层的神经元值
net1=deviator1*m_fWeight[0][0]+i1*m_fWeight[1][0]+i2*m_fWeight[2][0];
//使用S函数;
i3=Sigmoid(net1);//隐含层的输出
//计算输出层的值
net2=deviator2*m_fWeight[0][1]+i1*m_fWeight[1][1]+i2*m_fWeight[2][1]+i3*m_fWeight[3][1];
i4=Sigmoid(net2);
//计算误差,反向传播
float daltas[5];
//输出层的误差
daltas[4]=(d-i4)*i4*(1-i4)*i1;
daltas[3]=(d-i4)*i4*(1-i4)*i3;
daltas[2]=(d-i4)*i4*(1-i4)*i2;
//隐藏层的误差
daltas[1]=i1*(1-i3)*i3*(d-i4)*m_fWeight[3][1]*i4*(1-i4);
daltas[0]=i2*(1-i3)*i3*(d-i4)*m_fWeight[3][1]*i4*(1-i4);
//调整权值 BP_LEARNING
m_fWeight[3][1]+=BP_LEARNING*daltas[3];
m_fWeight[2][1]+=BP_LEARNING*daltas[2];
m_fWeight[2][0]+=BP_LEARNING*daltas[0];
m_fWeight[1][1]+=BP_LEARNING*daltas[4];
m_fWeight[1][0]+=BP_LEARNING*daltas[1];
return i4;
}
//S函数
float CBPNet::Sigmoid(float num)
{
return (float)(1/(1+exp(-num)));
}
//运行网络
float CBPNet::Run(float i1,float i2,float deviator1,float deviator2)
{
float net1,net2,i3,i4;
net1=deviator1*m_fWeight[0][0]+i1*m_fWeight[1][0]+i2*m_fWeight[2][0];
i3=Sigmoid(net1);
net2=deviator2*m_fWeight[0][1]+i1*m_fWeight[1][1]+i2*m_fWeight[2][1]+i3*m_fWeight[3][1];
i4=Sigmoid(net2);
return i4;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -