syj52417 发表于 2015-4-24 18:21

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]
查看完整版本: c语言实现BP神经网络算法