c语言实现BP神经网络算法
利用BP网络训练加法,代码如下,我是按照书上的公式敲的代码。对于最终的实验结果,有的结果还行,有的结果误差太多了,有人能帮我看看怎么回事吗?万分感谢!ps:不要吐槽语言。我知道这是c c++杂交体。#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define DATA 800
#define IN 2
#define OUT 1
#define NEURON 45
#define TRAINC 20000
double Fx(double x)
{
return 1 / (1 + exp(-1 * x));
}
//La输入层 Lb隐藏层 Lc输出层
//样本输入
double La;
//样本输出
double Lc;
//La->Lb权重
double Wab;
//Lb->Lc权重
double Wbc;
//样本输入每个向量的最小值,最大值;输出...
double MaxIn, MaxOut, MinIn, MinOut;
//Lb层输出
double LbOut;
//Lc层输出
double LcOut;
//Lc层单元的一般化误差
double Dc;
//Lb层单元的一般化误差
double Db;
//设置样本数据
void setSample()
{
srand((unsigned)time(NULL));
int i, j;
for (i = 0; i < DATA; i++)
{
for (j = 0; j < IN; j++)
{
La = rand() % 1000 / 10.0;
}
for (j = 0; j < OUT; j++)
Lc = La + La;
}
}
//初始化BP网络:权重,阈值(隐含节点+输出节点)
void initNet()
{
srand((unsigned)time(NULL));
//两部分的权值设置随机值【-1,1】
int i, j;
for (i = 0; i < NEURON; i++)
for (j = 0; j < IN; j++)
{
Wab = rand()*2.0 / RAND_MAX - 1 ;
Wab /= 20;
}
for (i = 0; i < OUT; i++)
for (j = 0; j < NEURON; j++)
{
Wbc = rand()*2.0 / RAND_MAX - 1;
Wbc /= 20;
}
//找出每个向量最小最大值,并进行归一化
for (i = 0; i < IN; i++)
{
MinIn = MaxIn = La;
for (j = 0; j < DATA; j++)
{
if (MinIn > La)
MinIn = La;
if (MaxIn < La)
MaxIn = La;
}
}
for (i = 0; i < OUT; i++)
{
MinOut = MaxOut = Lc;
for (j = 0; j < DATA; j++)
{
if (MinOut > Lc)
MinOut = Lc;
if (MaxOut < Lc)
MaxOut = Lc;
}
}
//归一化
for (i = 0; i < IN; i++)
for (j = 0; j < DATA; j++)
La = (La - MinIn + 1) / (MaxIn - MinIn + 1);
for (i = 0; i < OUT; i++)
for (j = 0; j < DATA; j++)
Lc = (Lc - MinOut + 1) / (MaxOut - MinOut + 1);
}
void getActiveVal(int dataIndex)
{
int i, j;
double sum;
for (i = 0; i < NEURON; i++)
{
sum = 0;
for (j = 0; j < IN; j++)
sum += Wab * La;
LbOut = Fx(sum);
}
for (i = 0; i < OUT; i++)
{
sum = 0;
for (j = 0; j < NEURON; j++)
sum += Wbc * LbOut;
LcOut = Fx(sum);
}
}
void backUp(int dataIndex)
{
int i, j;
double sum = 0;
//Lc层单元的一般化误差
for (i = 0; i < OUT; i++)
Dc = LcOut * (1 - LcOut)*(Lc - LcOut);
//Lb层单元的一般化误差
for (i = 0; i < NEURON; i++)
{
sum = 0;
for (j = 0; j < OUT; j++)
{
sum += Wbc * Dc;
}
Db = LbOut * (1 - LbOut) * sum;
}
double beta1 = 0.08, beta2 = 0.1;
for (i = 0; i < OUT; i++)
for (j = 0; j < NEURON; j++)
Wbc += beta1*LbOut * Dc;
for (i = 0; i < NEURON; i++)
for (j = 0; j < IN; j++)
Wab += beta2*Db * La;
}
double result(double d1, double d2)
{
int i, j;
double sum;
d1 = (d1 - MinIn + 1) / (MaxIn - MinIn + 1);;
d2 = (d2 - MinIn + 1) / (MaxIn - MinIn + 1);
for (i = 0; i < NEURON; i++)
{
sum = 0;
sum = Wab * d1 + Wab * d2 ;
LbOut= Fx(sum);
}
sum = 0;
for (j = 0; j < NEURON; j++)
sum += Wbc * LbOut;
LcOut = Fx(sum);
return LcOut * (MaxOut - MinOut + 1) + MinOut + 1;
}
void train()
{
int i, j, no = 0;
double e = 0;
do{
e = 0;
for (i = 0; i < DATA; i++)
{
getActiveVal(i);
backUp(i);
e += 0.5*pow((LcOut - Lc), 2);
}
cout << no << " " << e << endl;
no++;
} while (no < 1000);
}
void main(int argc, char const *argv[])
{
setSample();
initNet();
train();
double a, b;
while (1)
{
cout << "print two numbers" << endl;
cin >> a >> b;
cout << "result:" << result(a, b) << endl;
}
}
页:
[1]