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

📄 sum in ann.cpp

📁 利用ANN带后向传送的人工神经网络实现加法。
💻 CPP
字号:
// Sum in ANN.cpp : 定义控制台应用程序的入口点。
//
/////////////////////////////////////////////////////////////////////////////
//Sum in ANN
//用ANN模拟加法运算,主要采用BP网络
//For practice only

#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"
#include "time.h"
#include "stdlib.h"
#include <iostream>

#define BP_LEARNING (float)(0.5) //定义学习系数
#define BPM_ITER 2000 //迭代次数
using namespace std;

class CBPNET
{
public:
	CBPNET();
	//~CBPNET();

	float Train(float,float,float);
	float Run(float,float);
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()%3)-1;
		}
	}
}

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);
}

int _tmain(int argc, _TCHAR* argv[])
{
	CBPNET bp;

	float count=0;

	for(int i = 0;i < BPM_ITER;i++)
	{
		bp.Train(1,1,0);
		bp.Train(1,0,1);
		bp.Train(0,1,1);
		bp.Train(1,1,0);
	}
	count = 100;
	printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b已经完成 %f %",count);
	printf("1+1= %f , %f",bp.Run(0,0),bp.Train(1,1,1));
	_getch();
	return 0;
}

⌨️ 快捷键说明

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