darknet  v3
route_layer.c
Go to the documentation of this file.
1 #include "route_layer.h"
2 #include "cuda.h"
3 #include "blas.h"
4 
5 #include <stdio.h>
6 
7 route_layer make_route_layer(int batch, int n, int *input_layers, int *input_sizes)
8 {
9  fprintf(stderr,"route ");
10  route_layer l = {0};
11  l.type = ROUTE;
12  l.batch = batch;
13  l.n = n;
14  l.input_layers = input_layers;
15  l.input_sizes = input_sizes;
16  int i;
17  int outputs = 0;
18  for(i = 0; i < n; ++i){
19  fprintf(stderr," %d", input_layers[i]);
20  outputs += input_sizes[i];
21  }
22  fprintf(stderr, "\n");
23  l.outputs = outputs;
24  l.inputs = outputs;
25  l.delta = calloc(outputs*batch, sizeof(float));
26  l.output = calloc(outputs*batch, sizeof(float));;
27 
30  #ifdef GPU
31  l.forward_gpu = forward_route_layer_gpu;
32  l.backward_gpu = backward_route_layer_gpu;
33 
34  l.delta_gpu = cuda_make_array(l.delta, outputs*batch);
35  l.output_gpu = cuda_make_array(l.output, outputs*batch);
36  #endif
37  return l;
38 }
39 
41 {
42  int i;
43  layer first = net->layers[l->input_layers[0]];
44  l->out_w = first.out_w;
45  l->out_h = first.out_h;
46  l->out_c = first.out_c;
47  l->outputs = first.outputs;
48  l->input_sizes[0] = first.outputs;
49  for(i = 1; i < l->n; ++i){
50  int index = l->input_layers[i];
51  layer next = net->layers[index];
52  l->outputs += next.outputs;
53  l->input_sizes[i] = next.outputs;
54  if(next.out_w == first.out_w && next.out_h == first.out_h){
55  l->out_c += next.out_c;
56  }else{
57  printf("%d %d, %d %d\n", next.out_w, next.out_h, first.out_w, first.out_h);
58  l->out_h = l->out_w = l->out_c = 0;
59  }
60  }
61  l->inputs = l->outputs;
62  l->delta = realloc(l->delta, l->outputs*l->batch*sizeof(float));
63  l->output = realloc(l->output, l->outputs*l->batch*sizeof(float));
64 
65 #ifdef GPU
66  cuda_free(l->output_gpu);
67  cuda_free(l->delta_gpu);
68  l->output_gpu = cuda_make_array(l->output, l->outputs*l->batch);
69  l->delta_gpu = cuda_make_array(l->delta, l->outputs*l->batch);
70 #endif
71 
72 }
73 
75 {
76  int i, j;
77  int offset = 0;
78  for(i = 0; i < l.n; ++i){
79  int index = l.input_layers[i];
80  float *input = net.layers[index].output;
81  int input_size = l.input_sizes[i];
82  for(j = 0; j < l.batch; ++j){
83  copy_cpu(input_size, input + j*input_size, 1, l.output + offset + j*l.outputs, 1);
84  }
85  offset += input_size;
86  }
87 }
88 
90 {
91  int i, j;
92  int offset = 0;
93  for(i = 0; i < l.n; ++i){
94  int index = l.input_layers[i];
95  float *delta = net.layers[index].delta;
96  int input_size = l.input_sizes[i];
97  for(j = 0; j < l.batch; ++j){
98  axpy_cpu(input_size, 1, l.delta + offset + j*l.outputs, 1, delta + j*input_size, 1);
99  }
100  offset += input_size;
101  }
102 }
103 
104 #ifdef GPU
105 void forward_route_layer_gpu(const route_layer l, network net)
106 {
107  int i, j;
108  int offset = 0;
109  for(i = 0; i < l.n; ++i){
110  int index = l.input_layers[i];
111  float *input = net.layers[index].output_gpu;
112  int input_size = l.input_sizes[i];
113  for(j = 0; j < l.batch; ++j){
114  copy_gpu(input_size, input + j*input_size, 1, l.output_gpu + offset + j*l.outputs, 1);
115  }
116  offset += input_size;
117  }
118 }
119 
120 void backward_route_layer_gpu(const route_layer l, network net)
121 {
122  int i, j;
123  int offset = 0;
124  for(i = 0; i < l.n; ++i){
125  int index = l.input_layers[i];
126  float *delta = net.layers[index].delta_gpu;
127  int input_size = l.input_sizes[i];
128  for(j = 0; j < l.batch; ++j){
129  axpy_gpu(input_size, 1, l.delta_gpu + offset + j*l.outputs, 1, delta + j*input_size, 1);
130  }
131  offset += input_size;
132  }
133 }
134 #endif
void backward_route_layer(const route_layer l, network net)
Definition: route_layer.c:89
int n
Definition: darknet.h:142
void(* forward_gpu)(struct layer, struct network)
Definition: darknet.h:126
Definition: darknet.h:73
void(* backward_gpu)(struct layer, struct network)
Definition: darknet.h:127
void axpy_gpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY)
void(* forward)(struct layer, struct network)
Definition: darknet.h:123
int out_w
Definition: darknet.h:141
int out_c
Definition: darknet.h:141
layer * layers
Definition: darknet.h:441
int * input_layers
Definition: darknet.h:216
float * delta
Definition: darknet.h:245
int out_h
Definition: darknet.h:141
int inputs
Definition: darknet.h:134
void axpy_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY)
Definition: blas.c:178
void(* backward)(struct layer, struct network)
Definition: darknet.h:124
int * input_sizes
Definition: darknet.h:217
int batch
Definition: darknet.h:131
float * output
Definition: darknet.h:246
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)
Definition: blas.c:226
LAYER_TYPE type
Definition: darknet.h:120
void forward_route_layer(const route_layer l, network net)
Definition: route_layer.c:74
int outputs
Definition: darknet.h:135
route_layer make_route_layer(int batch, int n, int *input_layers, int *input_sizes)
Definition: route_layer.c:7
void resize_route_layer(route_layer *l, network *net)
Definition: route_layer.c:40
Definition: darknet.h:119