darknet  v3
maxpool_layer.c
Go to the documentation of this file.
1 #include "maxpool_layer.h"
2 #include "cuda.h"
3 #include <stdio.h>
4 
6 {
7  int h = l.out_h;
8  int w = l.out_w;
9  int c = l.c;
10  return float_to_image(w,h,c,l.output);
11 }
12 
14 {
15  int h = l.out_h;
16  int w = l.out_w;
17  int c = l.c;
18  return float_to_image(w,h,c,l.delta);
19 }
20 
21 maxpool_layer make_maxpool_layer(int batch, int h, int w, int c, int size, int stride, int padding)
22 {
23  maxpool_layer l = {0};
24  l.type = MAXPOOL;
25  l.batch = batch;
26  l.h = h;
27  l.w = w;
28  l.c = c;
29  l.pad = padding;
30  l.out_w = (w + padding - size)/stride + 1;
31  l.out_h = (h + padding - size)/stride + 1;
32  l.out_c = c;
33  l.outputs = l.out_h * l.out_w * l.out_c;
34  l.inputs = h*w*c;
35  l.size = size;
36  l.stride = stride;
37  int output_size = l.out_h * l.out_w * l.out_c * batch;
38  l.indexes = calloc(output_size, sizeof(int));
39  l.output = calloc(output_size, sizeof(float));
40  l.delta = calloc(output_size, sizeof(float));
43  #ifdef GPU
46  l.indexes_gpu = cuda_make_int_array(0, output_size);
47  l.output_gpu = cuda_make_array(l.output, output_size);
48  l.delta_gpu = cuda_make_array(l.delta, output_size);
49  #endif
50  fprintf(stderr, "max %d x %d / %d %4d x%4d x%4d -> %4d x%4d x%4d\n", size, size, stride, w, h, c, l.out_w, l.out_h, l.out_c);
51  return l;
52 }
53 
54 void resize_maxpool_layer(maxpool_layer *l, int w, int h)
55 {
56  l->h = h;
57  l->w = w;
58  l->inputs = h*w*l->c;
59 
60  l->out_w = (w + l->pad - l->size)/l->stride + 1;
61  l->out_h = (h + l->pad - l->size)/l->stride + 1;
62  l->outputs = l->out_w * l->out_h * l->c;
63  int output_size = l->outputs * l->batch;
64 
65  l->indexes = realloc(l->indexes, output_size * sizeof(int));
66  l->output = realloc(l->output, output_size * sizeof(float));
67  l->delta = realloc(l->delta, output_size * sizeof(float));
68 
69  #ifdef GPU
70  cuda_free((float *)l->indexes_gpu);
71  cuda_free(l->output_gpu);
72  cuda_free(l->delta_gpu);
73  l->indexes_gpu = cuda_make_int_array(0, output_size);
74  l->output_gpu = cuda_make_array(l->output, output_size);
75  l->delta_gpu = cuda_make_array(l->delta, output_size);
76  #endif
77 }
78 
80 {
81  int b,i,j,k,m,n;
82  int w_offset = -l.pad/2;
83  int h_offset = -l.pad/2;
84 
85  int h = l.out_h;
86  int w = l.out_w;
87  int c = l.c;
88 
89  for(b = 0; b < l.batch; ++b){
90  for(k = 0; k < c; ++k){
91  for(i = 0; i < h; ++i){
92  for(j = 0; j < w; ++j){
93  int out_index = j + w*(i + h*(k + c*b));
94  float max = -FLT_MAX;
95  int max_i = -1;
96  for(n = 0; n < l.size; ++n){
97  for(m = 0; m < l.size; ++m){
98  int cur_h = h_offset + i*l.stride + n;
99  int cur_w = w_offset + j*l.stride + m;
100  int index = cur_w + l.w*(cur_h + l.h*(k + b*l.c));
101  int valid = (cur_h >= 0 && cur_h < l.h &&
102  cur_w >= 0 && cur_w < l.w);
103  float val = (valid != 0) ? net.input[index] : -FLT_MAX;
104  max_i = (val > max) ? index : max_i;
105  max = (val > max) ? val : max;
106  }
107  }
108  l.output[out_index] = max;
109  l.indexes[out_index] = max_i;
110  }
111  }
112  }
113  }
114 }
115 
117 {
118  int i;
119  int h = l.out_h;
120  int w = l.out_w;
121  int c = l.c;
122  for(i = 0; i < h*w*c*l.batch; ++i){
123  int index = l.indexes[i];
124  net.delta[index] += l.delta[i];
125  }
126 }
127 
int w
Definition: darknet.h:140
int pad
Definition: darknet.h:151
void(* forward_gpu)(struct layer, struct network)
Definition: darknet.h:126
void(* backward_gpu)(struct layer, struct network)
Definition: darknet.h:127
Definition: darknet.h:512
void(* forward)(struct layer, struct network)
Definition: darknet.h:123
int out_w
Definition: darknet.h:141
image float_to_image(int w, int h, int c, float *data)
Definition: image.c:774
float * delta
Definition: darknet.h:486
int out_c
Definition: darknet.h:141
void backward_maxpool_layer(const maxpool_layer l, network net)
int size
Definition: darknet.h:145
int h
Definition: darknet.h:140
float * delta
Definition: darknet.h:245
int out_h
Definition: darknet.h:141
void resize_maxpool_layer(maxpool_layer *l, int w, int h)
Definition: maxpool_layer.c:54
int inputs
Definition: darknet.h:134
void(* backward)(struct layer, struct network)
Definition: darknet.h:124
int batch
Definition: darknet.h:131
float * output
Definition: darknet.h:246
image get_maxpool_image(maxpool_layer l)
Definition: maxpool_layer.c:5
void forward_maxpool_layer_gpu(maxpool_layer layer, network net)
image get_maxpool_delta(maxpool_layer l)
Definition: maxpool_layer.c:13
int stride
Definition: darknet.h:147
void forward_maxpool_layer(const maxpool_layer l, network net)
Definition: maxpool_layer.c:79
int c
Definition: darknet.h:140
void backward_maxpool_layer_gpu(maxpool_layer layer, network net)
int * indexes
Definition: darknet.h:215
LAYER_TYPE type
Definition: darknet.h:120
float * input
Definition: darknet.h:484
maxpool_layer make_maxpool_layer(int batch, int h, int w, int c, int size, int stride, int padding)
Definition: maxpool_layer.c:21
int outputs
Definition: darknet.h:135
Definition: darknet.h:119