• 大小: 286KB
    文件类型: .rar
    金币: 2
    下载: 2 次
    发布日期: 2021-06-15
  • 语言: C/C++
  • 标签: LSTM  C++  RNN  

资源简介

https://blog.csdn.net/u012465304/article/details/82656803 我的博客上的LSTM例程,用c++写的,由于找我私聊要的人太多了,就上传到这个上面,大家可自行下载

资源截图

代码片段和文件信息

/*
Neal 2018-04-09
我自己修改的LSTM
*/

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

#define innode  1       //输入结点数,将输入2个加数
#define hidenode  26    //隐藏结点数,存储“携带位”
#define outnode  1      //输出结点数,将输出一个预测数字



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



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

//激活函数的导数,y为激活函数值
double dsigmoid(double y)
{
    return y * (1.0 - y);
}

//tanh的导数,y为tanh值
double dtanh(double y)
{
    y = tanh(y);
    return 1.0 - y * y;
}


class RNN
{
public:
    RNN(int batchsizeint timestep);
    virtual ~RNN();
    void train(int **x_batch int **y_batch int loop_timeint alpha);

public:
    double W_I[innode][hidenode];     //连接输入与隐含层单元中输入门的权值矩阵
    double U_I[hidenode][hidenode];   //连接上一隐层输出与本隐含层单元中输入门的权值矩阵
    double W_F[innode][hidenode];     //连接输入与隐含层单元中遗忘门的权值矩阵
    double U_F[hidenode][hidenode];   //连接上一隐含层与本隐含层单元中遗忘门的权值矩阵
    double W_O[innode][hidenode];     //连接输入与隐含层单元中遗忘门的权值矩阵
    double U_O[hidenode][hidenode];   //连接上一隐含层与现在时刻的隐含层的权值矩阵
    double W_G[innode][hidenode];     //用于产生新记忆的权值矩阵
    double U_G[hidenode][hidenode];   //用于产生新记忆的权值矩阵
    double W_out[hidenode][outnode];  //连接隐层与输出层的权值矩阵

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

    int time_step;    //当前位的数据跟之前多少位的数据有关 训练数据有多少列
    int batch_size;  // 训练数据有多少行
};

void winit(double w[] int n) //权值初始化
{
    for(int i=0; i        w[i] = uniform_plus_minus_one;  //均匀随机分布
}

RNN::RNN(int batchsizeint timestep = 7)
{
    batch_size = batchsize;
    time_step = timestep;

    x = new double[innode];
    y = new double[outnode];
    winit((double*)W_I innode * hidenode);
    winit((double*)U_I hidenode * hidenode);
    winit((double*)W_F innode * hidenode);
    winit((double*)U_F hidenode * hidenode);
    winit((double*)W_O innode * hidenode);
    winit((double*)U_O hidenode * hidenode);
    winit((double*)W_G innode * hidenode);
    winit((double*)U_G hidenode * hidenode);
    winit((double*)W_out hidenode * outnode);
}

RNN::~RNN()
{
    delete x;
    delete y;
}
/*
x是x时间轴的数据,二维数据,由timestep结合数据多少来定大小

*/
void RNN::train(int **x_batch int **y_batch int loop_time=1100 int alpha=0.1)
{
    int epoch i j k m p batch_count;
    batch_count = 0;
    vector I_vector;      //输入门
    vector F_vector;      //遗忘门
    vector O_vector;      //输出门
    vector G_vector;      //新记忆
    vector S_vector;      //状态值
    vector h_vector;      //输出值
    vector y_delta;        //保存误差关于输出层的偏导

    for(epoch = 0; epoch < loop_time; epoch++)

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件    1150165  2018-07-27 16:04  MyLSTM\bin\Debug\MyLSTM.exe

     文件      14053  2018-07-27 16:01  MyLSTM\main.cpp

     文件       1070  2018-07-27 16:00  MyLSTM\MyLSTM.cbp

     文件        174  2018-07-27 16:00  MyLSTM\MyLSTM.depend

     文件        322  2018-09-25 09:48  MyLSTM\MyLSTM.layout

     文件     145389  2018-07-27 16:03  MyLSTM\obj\Debug\main.o

     目录          0  2018-07-27 16:04  MyLSTM\bin\Debug

     目录          0  2018-07-27 16:03  MyLSTM\obj\Debug

     目录          0  2018-07-27 16:03  MyLSTM\bin

     目录          0  2018-07-27 16:02  MyLSTM\obj

     目录          0  2018-09-25 09:48  MyLSTM

----------- ---------  ---------- -----  ----

              1311173                    11


评论

共有 条评论