bp神经网络,初试

刚入门,很多东西都是第一次写,望指教。。。

就两部分

double* forward(double *out,int outlength)前向传播。

 double* backward(double* e, int elength)后向遍历。

整体以cell为对象处理一个输入输出矩阵。

当然,我也是从不加sigmoid开始的。

直接前向[w1*x+w2*y]反向[w+或-e*out]

               [.................]

比较懒。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<iostream>
using namespace std;
double sig(double x)
{
    return 1 / (1 + exp(-x));
}
class cell
{
public:
    int insig_row, out_columu; double v;
    double* out;
    double** w;
    double* insig;
    double* back_e;
    cell()
    {
        int i, j;
        printf("矩阵输入输出:");
        scanf("%d%d", &this->out_columu, &this->insig_row);
        v = 1;
        this->out = new double[out_columu];
        this->w = new double* [insig_row];
        for (i = 0; i < insig_row; i++)
            this->w[i] = new double[out_columu];
        srand(time(NULL));
        for (i = 0; i < insig_row; i++)
            for (j = 0; j < out_columu; j++)
                this->w[i][j] = ((double)rand() / ((RAND_MAX - 1) / 2)) - 1;
        this->insig = new double[insig_row];
        this->back_e = new double[out_columu];
    }
    ~cell()
    {
        delete this->out;
        for (int i = 0; i < insig_row; i++)
        {
            delete (this->w[i]);
        }
        delete w;
        delete this->insig;
        delete this->back_e;
        printf("delete ok!");
    }
    double* forward(double *out,int outlength)
    {
        int i, j; double sum = 0;
        for (j = 0; j < insig_row; j++)
        {
            sum = 0;
            for (i = 0; i < out_columu && i < outlength; i++)
            {
                this->out[i] = out[i];
                sum += this->out[i] * w[j][i];
            }
            insig[j] = sig(sum);
            //insig[j] = sum;
        }                   
        return insig;
    }
    double* backward(double* e, int elength)
    {
        int i, j, k;double sum=0;
        for (i = 0; i < out_columu; i++)
        {
            sum = 0;
            for (j = 0; j < insig_row; j++)
                sum += insig[j] * (1 - insig[j]) * w[j][i];
            back_e[i] = sum;
        }
        for (j = 0; j < insig_row; j++)
            for (i = 0; i < out_columu; i++)
                w[j][i] = w[j][i] + e[j] * insig[j] * (1 - insig[j]) * out[i]*v;
                //w[j][i] = w[j][i] + e[j] *out[i];
        return back_e;
    }
    void adjust_v(double* e, int elength)
    {
        double sum=0;
        for (int i = 0; i < elength; i++)
            sum += e[i];
        this->v = 1 * (sum / elength);
    }
    void print(void)
    {
        int i, j;
        printf("矩阵:\n");
        for (i = 0; i < insig_row; i++)
        {
            for (j = 0; j < out_columu; j++)
                printf("%+9.4lf ", this->w[i][j]);
            printf("\n");
        }
    }
};
void printeroror(double* e,int elength )
{
    double sum=0;
    printf("误差:");
    for (int i = 0; i < elength; i++)
    {
        printf("%-9.6lf ", e[i]);
        //sum += e[i];
    }
    //printf("总误差:%lf", sum);
    printf("\n");
}
void printout(double* out, int i)
{
    printf("输出:");
    for (int i = 0; i < 3; i++)
    {
        printf("%-9.4lf ", out[i]);
    }
    printf("\n");
}

int main()
{
    cell trainstart, trainend; 
    double target[3] = { 0.5,0.5,0.5 }, e[3] = { 0 }, in[3] = { 0.985,0.156,0.680 }, *out;
    for (int times = 0; times < 1000000; times++) {
        out = trainstart.forward(in, 3);
        out = trainend.forward(out, 3);
        e[0] = target[0] - out[0];
        e[1] = target[1] - out[1];
        e[2] = target[2] - out[2];
        printeroror(e, 3);
        out = trainend.backward(e, 3);
        out = trainstart.backward(out, 3);
    }
    trainstart.print();
    trainend.print();
    printeroror(e, 3);
    /*cell t; double target[3] = { 0.5,0.5,0.5 }, e[3] = { 0 }, in[3] = { 0.9,0.4,0.1 }, * out;
    for (int i = 0; i < 10000; i++)
    {
        t.print();
        out = t.forward(in, 3);
        e[0] = target[0] - out[0];
        e[1] = target[1] - out[1];
        e[2] = target[2] - out[2];
        out = t.backward(e, 3);
        printeroror(e, 3);
    }*/
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值