-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathlstm-gpu.h
135 lines (96 loc) · 4.83 KB
/
lstm-gpu.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#ifndef LSTM_GPU_H
#define LSTM_GPU_H
#include "la/la-gpu.h"
#include "autodiff/autodiff-gpu.h"
#include "nn/lstm.h"
namespace lstm {
namespace gpu {
struct lstm_feat_param_t {
la::gpu::matrix<double> hidden_input;
la::gpu::matrix<double> hidden_output;
la::gpu::vector<double> hidden_bias;
la::gpu::matrix<double> input_input;
la::gpu::matrix<double> input_output;
la::gpu::vector<double> input_peep;
la::gpu::vector<double> input_bias;
la::gpu::matrix<double> output_input;
la::gpu::matrix<double> output_output;
la::gpu::vector<double> output_peep;
la::gpu::vector<double> output_bias;
la::gpu::matrix<double> forget_input;
la::gpu::matrix<double> forget_output;
la::gpu::vector<double> forget_peep;
la::gpu::vector<double> forget_bias;
};
lstm::lstm_feat_param_t to_host(lstm_feat_param_t const& param);
lstm_feat_param_t to_device(lstm::lstm_feat_param_t const& param);
void resize_as(lstm_feat_param_t& a, lstm_feat_param_t const& b);
void zero(lstm_feat_param_t& p);
void adagrad_update(lstm_feat_param_t& p, lstm_feat_param_t const& grad,
lstm_feat_param_t& opt_data, double step_size);
void const_step_update_momentum(lstm_feat_param_t& p, lstm_feat_param_t const& grad,
lstm_feat_param_t& opt_data, double momentum, double step_size);
lstm::lstm_feat_nn_t make_forward_lstm_feat_nn(autodiff::computation_graph& g,
autodiff::gpu::memory_pool<double>& mem,
lstm_feat_param_t& p,
std::vector<std::shared_ptr<autodiff::op_t>> const& inputs);
lstm::lstm_feat_nn_t make_backward_lstm_feat_nn(autodiff::computation_graph& g,
autodiff::gpu::memory_pool<double>& mem,
lstm_feat_param_t& p,
std::vector<std::shared_ptr<autodiff::op_t>> const& inputs);
void attach_grad(lstm_feat_param_t& grad, lstm::lstm_feat_nn_t const& nn);
struct blstm_feat_param_t {
lstm_feat_param_t forward_param;
lstm_feat_param_t backward_param;
la::gpu::matrix<double> forward_output_weight;
la::gpu::matrix<double> backward_output_weight;
la::gpu::vector<double> output_bias;
};
lstm::blstm_feat_param_t to_host(blstm_feat_param_t const& param);
blstm_feat_param_t to_host(lstm::blstm_feat_param_t const& param);
void resize_as(blstm_feat_param_t& a, blstm_feat_param_t const& b);
void zero(blstm_feat_param_t& p);
void adagrad_update(blstm_feat_param_t& p, blstm_feat_param_t const& grad,
blstm_feat_param_t& opt_data, double step_size);
void const_step_update_momentum(blstm_feat_param_t& p, blstm_feat_param_t const& grad,
blstm_feat_param_t& opt_data, double momentum, double step_size);
lstm::blstm_feat_nn_t make_blstm_feat_nn(autodiff::computation_graph& g,
autodiff::gpu::memory_pool<double>& mem,
blstm_feat_param_t& p,
std::vector<std::shared_ptr<autodiff::op_t>> const& inputs);
void attach_grad(dblstm_param_t& grad, lstm::blstm_feat_nn_t const& nn);
struct dblstm_param_t {
std::vector<blstm_feat_param_t> layer;
la::gpu::matrix<double> softmax_weight;
la::gpu::vector<double> softmax_bias;
};
lstm::dblstm_param_t to_host(dblstm_param_t const& param);
dblstm_param_t to_device(lstm::dblstm_param_t const& param);
void resize_as(dblstm_param_t& a, dblstm_param_t const& b);
void zero(dblstm_param_t& p);
void adagrad_update(dblstm_param_t& p, dblstm_param_t const& grad,
dblstm_param_t& opt_data, double step_size);
void const_step_update_momentum(dblstm_param_t& p, dblstm_param_t const& grad,
dblstm_param_t& opt_data, double momentum, double step_size);
struct dblstm_nn_t {
autodiff::computation_graph graph;
autodiff::gpu::memory_pool<double> *mem;
std::vector<blstm_feat_nn_t> layer;
std::shared_ptr<autodiff::op_t> softmax_weight;
std::shared_ptr<autodiff::op_t> softmax_bias;
std::vector<std::shared_ptr<autodiff::op_t>> logprob;
};
dblstm_nn_t make_dblstm_nn(dblstm_param_t& p,
autodiff::gpu::memory_pool<double>& mem,
std::vector<std::vector<double>> const& frames);
void attach_grad(dblstm_param_t& grad, dblstm_nn_t const& nn);
void eval(dblstm_nn_t const& nn);
void grad(dblstm_nn_t const& nn);
struct log_loss {
la::gpu::weak_vector<double> gold;
la::gpu::weak_vector<double> pred;
double loss();
};
}
}
#endif