当前位置: 移动技术网 > IT编程>开发语言>C/C++ > RNN递归神经网络 C++实现

RNN递归神经网络 C++实现

2019年01月02日  | 移动技术网IT编程  | 我要评论

小柳树和小枣树课件,国美 苏宁 京东,薛之谦车祸

//让程序自己学会是否需要进位,从而学会加法

#include "iostream"
#include "math.h"
#include "stdlib.h"
#include "time.h"
#include "vector"
#include "assert.h"
using namespace std;

#define innode  2       //输入结点数,将输入2个加数
#define hidenode  16    //隐藏结点数,存储“携带位”
#define outnode  1      //输出结点数,将输出一个预测数字
#define alpha  0.1      //学习速率
#define binary_dim 8    //二进制数的最大长度

#define randval(high) ( (double)rand() / rand_max * high )
#define uniform_plus_minus_one ( (double)( 2.0 * rand() ) / ((double)rand_max + 1.0) - 1.0 )  //均匀随机分布


int largest_number = ( pow(2, binary_dim) );  //跟二进制最大长度对应的可以表示的最大十进制数

//激活函数
double sigmoid(double x) 
{
    return 1.0 / (1.0 + exp(-x));
}

//激活函数的导数,y为激活函数值
double dsigmoid(double y)
{
    return y * (1 - y);  
}           
//将一个10进制整数转换为2进制数
void int2binary(int n, int *arr)
{
    int i = 0;
    while(n)
    {
        arr[i++] = n % 2;
        n /= 2;
    }
    while(i < binary_dim)
        arr[i++] = 0;
}

class rnn
{
public:
    rnn();
    virtual ~rnn();
    void train();

public:
    double w[innode][hidenode];        //连接输入层与隐藏层的权值矩阵
    double w1[hidenode][outnode];      //连接隐藏层与输出层的权值矩阵
    double wh[hidenode][hidenode];     //连接前一时刻的隐含层与现在时刻的隐含层的权值矩阵

    double *layer_0;       //layer 0 输出值,由输入向量直接设定
    //double *layer_1;     //layer 1 输出值
    double *layer_2;       //layer 2 输出值
};

void winit(double w[], int n) //权值初始化
{
    for(int i=0; i layer_1_vector;      //保存隐藏层
    vector layer_2_delta;        //保存误差关于layer 2 输出值的偏导

    for(epoch=0; epoch<11000; epoch++)  //训练次数
    {
        double e = 0.0;  //误差
        for(i=0; i=0 ; p--)
        {
            layer_0[0] = a[p];
            layer_0[1] = b[p];

            layer_1 = layer_1_vector[p+1];     //当前隐藏层
            double *layer_1_pre = layer_1_vector[p];   //前一个隐藏层

            for(k=0; k=0; k--)
                cout << d[k];
            cout << endl;

            cout << "true:" ;
            for(k=binary_dim-1; k>=0; k--)
                cout << c[k];
            cout << endl;

            int out = 0;
            for(k=binary_dim-1; k>=0; k--)
                out += d[k] * pow(2, k);
            cout << a_int << " + " << b_int << " = " << out << endl << endl;
        }
    }
}


int main()
{
    srand(time(null));
    rnn rnn;
    rnn.train();
    return 0;
}

这里写图片描述

参考:

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网