13 static void increment_layer(
layer *l,
int steps)
31 fprintf(stderr,
"CRNN Layer: %d x %d x %d image, %d filters\n", h,w,c,output_filters);
32 batch = batch / steps;
42 l.
out_c = output_filters;
44 l.
hidden = h * w * hidden_filters;
47 l.
state = calloc(l.
hidden*batch*(steps+1),
sizeof(
float));
50 fprintf(stderr,
"\t\t");
51 *(l.
input_layer) =
make_convolutional_layer(batch*steps, h, w, c, hidden_filters, 1, 3, 1, 1, activation, batch_normalize, 0, 0, 0);
55 fprintf(stderr,
"\t\t");
56 *(l.
self_layer) =
make_convolutional_layer(batch*steps, h, w, hidden_filters, hidden_filters, 1, 3, 1, 1, activation, batch_normalize, 0, 0, 0);
60 fprintf(stderr,
"\t\t");
61 *(l.
output_layer) =
make_convolutional_layer(batch*steps, h, w, hidden_filters, output_filters, 1, 3, 1, 1, activation, batch_normalize, 0, 0, 0);
76 l.state_gpu = cuda_make_array(l.
state, l.
hidden*batch*(steps+1));
105 for (i = 0; i < l.
steps; ++i) {
112 float *old_state = l.
state;
126 increment_layer(&input_layer, 1);
127 increment_layer(&self_layer, 1);
128 increment_layer(&output_layer, 1);
140 increment_layer(&input_layer, l.
steps-1);
141 increment_layer(&self_layer, l.
steps-1);
142 increment_layer(&output_layer, l.
steps-1);
145 for (i = l.
steps-1; i >= 0; --i) {
165 if (i == 0) s.
delta = 0;
175 increment_layer(&input_layer, -1);
176 increment_layer(&self_layer, -1);
177 increment_layer(&output_layer, -1);
183 void pull_crnn_layer(
layer l)
190 void push_crnn_layer(
layer l)
217 for (i = 0; i < l.
steps; ++i) {
218 s.input_gpu = net.input_gpu;
221 s.input_gpu = l.state_gpu;
224 float *old_state = l.state_gpu;
234 s.input_gpu = l.state_gpu;
238 increment_layer(&input_layer, 1);
239 increment_layer(&self_layer, 1);
240 increment_layer(&output_layer, 1);
252 increment_layer(&input_layer, l.
steps - 1);
253 increment_layer(&self_layer, l.
steps - 1);
254 increment_layer(&output_layer, l.
steps - 1);
256 for (i = l.
steps-1; i >= 0; --i) {
260 s.input_gpu = l.state_gpu;
261 s.delta_gpu = self_layer.delta_gpu;
266 s.input_gpu = l.state_gpu;
267 s.delta_gpu = self_layer.delta_gpu - l.
hidden*l.
batch;
268 if (i == 0) s.delta_gpu = 0;
274 if(net.delta_gpu) s.delta_gpu = net.delta_gpu + i*l.
inputs*l.
batch;
275 else s.delta_gpu = 0;
278 increment_layer(&input_layer, -1);
279 increment_layer(&self_layer, -1);
280 increment_layer(&output_layer, -1);
void forward_convolutional_layer_gpu(convolutional_layer l, network net)
struct layer * output_layer
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 pull_convolutional_layer(layer l)
void(* forward)(struct layer, struct network)
convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int n, int groups, int size, int stride, int padding, ACTIVATION activation, int batch_normalize, int binary, int xnor, int adam)
void fill_gpu(int N, float ALPHA, float *X, int INCX)
layer make_crnn_layer(int batch, int h, int w, int c, int hidden_filters, int output_filters, int steps, ACTIVATION activation, int batch_normalize)
void fill_cpu(int N, float ALPHA, float *X, int INCX)
void axpy_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY)
void(* backward)(struct layer, struct network)
void backward_convolutional_layer_gpu(convolutional_layer l, network net)
void forward_convolutional_layer(convolutional_layer l, network net)
struct layer * input_layer
void backward_convolutional_layer(convolutional_layer l, network net)
void forward_crnn_layer(layer l, network net)
void copy_gpu(int N, float *X, int INCX, float *Y, int INCY)
void update_crnn_layer(layer l, update_args a)
void push_convolutional_layer(layer l)
void copy_cpu(int N, float *X, int INCX, float *Y, int INCY)
void update_convolutional_layer(convolutional_layer l, update_args a)
void update_convolutional_layer_gpu(layer l, update_args a)
void backward_crnn_layer(layer l, network net)
struct layer * self_layer