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

📄 cpp1.cpp

📁 一个用BP网络实现同或的源代码!很适合初学者了解神经网络算法原理~!值得推荐哦
💻 CPP
字号:
/*================================================================*
 * Filename  bpnet.h                                              *
 * Description:                                                   *
 * 一个微型神经网络,使用BP来调整权值                             *
 *================================================================*/

#include <math.h>
#include <stdlib.h>
#include <time.h>

#define BP_LEARNING  (float)(0.5)   //学习系数

class CBPNet
{
public:
	CBPNet();
	~CBPNet();
	float Train(float,float,float);
	float Run(float,float);
	
protected:
private:
	float m_fWeights[3][3];  //三个神经元
	float Sigmoid(float);    //S形函数
};

CBPNet::CBPNet()
{
	srand((unsigned)(time(NULL)));

	for(int i=0;i<3;i++)
	{
		for(int j=0;j<3;j++)
		{
			//由于一些原因,微软提供的rand()函数产生的随机数是
			//整数,所以需要将之做适当的变换,变为-1~1之间
			m_fWeights[i][j]=(float)(rand())/(32767/2)-1;
		}
	}
}

CBPNet::~CBPNet()
{
}

//训练网络

float CBPNet::Train(float i1,float i2,float d)
{
	//变量
	float net1, net2, i3, i4, out;

	//计算隐含层的神经元值
	net1 = 1 * m_fWeights[0][0] + i1 * m_fWeights[1][0] +
		    i2 * m_fWeights[2][0];
	net2 = 1 * m_fWeights[0][1] + i1 * m_fWeights[1][1] +
             i2 * m_fWeights[2][1];
	
	//使用S函数
	i3 = Sigmoid(net1);
	i4 = Sigmoid(net2);

	//计算输出层的值
	net1 = 1 * m_fWeights[0][2] + i3 * m_fWeights[1][2] +
		    i4 * m_fWeights[2][2];
	out = Sigmoid(net1);
	
	//计算误差,反向传播
	float deltas[3];

	deltas[2] = out*(1-out)*(d-out);
	deltas[1] = i4*(1-i4)*(m_fWeights[2][2])*(deltas[2]);
	deltas[0] = i3*(1-i3)*(m_fWeights[1][2])*(deltas[2]);
	
	//调整权值
	float v1=i1, v2=i2;
	for(int i=0; i<3; i++)
	{
		//如果有必要,改变输出层的值
		if (i==2)
		{
			v1=i3;
			v2=i4;
		}
		m_fWeights[0][i]+=BP_LEARNING*1*deltas[i];
		m_fWeights[1][i]+=BP_LEARNING*v1*deltas[i];
		m_fWeights[2][i]+=BP_LEARNING*v2*deltas[i];
	}
	return out;
}


//s函数
float CBPNet::Sigmoid(float num)
{
	return (float)(1/(1+exp(-num)));
}

//运行网络
float CBPNet::Run(float i1,float i2)
{
	float net1,net2,i3,i4;
	net1 = 1 * m_fWeights[0][0] + i1 * m_fWeights[1][0] +
		i2 * m_fWeights[2][0];
	net2 = 1 * m_fWeights[0][1] + i1 * m_fWeights[1][1] +
		i2 * m_fWeights[2][1];
	i3 = Sigmoid(net1);
	i4 = Sigmoid(net2);
	net1 = 1 * m_fWeights[0][2] + i3 * m_fWeights[1][2] +
		    i4 * m_fWeights[2][2];
	return Sigmoid(net1);
}




⌨️ 快捷键说明

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