13 static void increment_layer(
layer *l,
int steps)
31 fprintf(stderr,
"RNN Layer: %d inputs, %d outputs\n", inputs, outputs);
32 batch = batch / steps;
39 l.
state = calloc(batch*outputs,
sizeof(
float));
40 l.
prev_state = calloc(batch*outputs,
sizeof(
float));
43 fprintf(stderr,
"\t\t");
48 fprintf(stderr,
"\t\t");
53 fprintf(stderr,
"\t\t");
68 l.state_gpu = cuda_make_array(0, batch*outputs);
69 l.prev_state_gpu = cuda_make_array(0, batch*outputs);
103 for (i = 0; i < l.
steps; ++i) {
110 float *old_state = l.
state;
124 increment_layer(&input_layer, 1);
125 increment_layer(&self_layer, 1);
126 increment_layer(&output_layer, 1);
139 increment_layer(&input_layer, l.
steps-1);
140 increment_layer(&self_layer, l.
steps-1);
141 increment_layer(&output_layer, l.
steps-1);
144 for (i = l.
steps-1; i >= 0; --i) {
164 if (i == 0) s.
delta = 0;
174 increment_layer(&input_layer, -1);
175 increment_layer(&self_layer, -1);
176 increment_layer(&output_layer, -1);
182 void pull_rnn_layer(
layer l)
189 void push_rnn_layer(
layer l)
199 update_connected_layer_gpu(*(l.
self_layer), a);
221 for (i = 0; i < l.
steps; ++i) {
222 s.input_gpu = net.input_gpu;
223 forward_connected_layer_gpu(input_layer, s);
225 s.input_gpu = l.state_gpu;
226 forward_connected_layer_gpu(self_layer, s);
232 s.input_gpu = l.state_gpu;
233 forward_connected_layer_gpu(output_layer, s);
236 increment_layer(&input_layer, 1);
237 increment_layer(&self_layer, 1);
238 increment_layer(&output_layer, 1);
250 increment_layer(&input_layer, l.
steps - 1);
251 increment_layer(&self_layer, l.
steps - 1);
252 increment_layer(&output_layer, l.
steps - 1);
253 float *last_input = input_layer.output_gpu;
254 float *last_self = self_layer.output_gpu;
255 for (i = l.
steps-1; i >= 0; --i) {
260 s.input_gpu = l.state_gpu;
261 s.delta_gpu = self_layer.delta_gpu;
262 backward_connected_layer_gpu(output_layer, s);
274 s.input_gpu = l.state_gpu;
275 s.delta_gpu = (i > 0) ? self_layer.delta_gpu - l.
outputs*l.
batch : 0;
276 if (i == 0) s.delta_gpu = 0;
277 backward_connected_layer_gpu(self_layer, s);
280 if(net.delta_gpu) s.delta_gpu = net.delta_gpu + i*l.
inputs*l.
batch;
281 else s.delta_gpu = 0;
282 backward_connected_layer_gpu(input_layer, s);
284 increment_layer(&input_layer, -1);
285 increment_layer(&self_layer, -1);
286 increment_layer(&output_layer, -1);
void update_connected_layer(layer l, update_args a)
struct layer * output_layer
layer make_rnn_layer(int batch, int inputs, int outputs, int steps, ACTIVATION activation, int batch_normalize, int adam)
void(* update)(struct layer, update_args)
void(* forward_gpu)(struct layer, struct network)
void(* backward_gpu)(struct layer, struct network)
void axpy_gpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY)
void(* update_gpu)(struct layer, update_args)
void update_rnn_layer(layer l, update_args a)
void(* forward)(struct layer, struct network)
void fill_gpu(int N, float ALPHA, float *X, int INCX)
void forward_connected_layer(layer l, network net)
void fill_cpu(int N, float ALPHA, float *X, int INCX)
void forward_rnn_layer(layer l, network net)
void axpy_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY)
void(* backward)(struct layer, struct network)
struct layer * input_layer
void backward_rnn_layer(layer l, network net)
void copy_gpu(int N, float *X, int INCX, float *Y, int INCY)
void copy_cpu(int N, float *X, int INCX, float *Y, int INCY)
layer make_connected_layer(int batch, int inputs, int outputs, ACTIVATION activation, int batch_normalize, int adam)
void backward_connected_layer(layer l, network net)
struct layer * self_layer