📄 sum in 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 + -