1 #include "reorg_old_layer.h"
2 #include "utils.h"
3 #include "dark_cuda.h"
4 #include "blas.h"
5 #include <stdio.h>
6 
7 
make_reorg_old_layer(int batch,int w,int h,int c,int stride,int reverse)8 layer make_reorg_old_layer(int batch, int w, int h, int c, int stride, int reverse)
9 {
10     layer l = { (LAYER_TYPE)0 };
11     l.type = REORG_OLD;
12     l.batch = batch;
13     l.stride = stride;
14     l.h = h;
15     l.w = w;
16     l.c = c;
17     if(reverse){
18         l.out_w = w*stride;
19         l.out_h = h*stride;
20         l.out_c = c/(stride*stride);
21     }else{
22         l.out_w = w/stride;
23         l.out_h = h/stride;
24         l.out_c = c*(stride*stride);
25     }
26     l.reverse = reverse;
27     fprintf(stderr, "reorg_old              /%2d  %4d x%4d x%4d   ->  %4d x%4d x%4d\n",  stride, w, h, c, l.out_w, l.out_h, l.out_c);
28     l.outputs = l.out_h * l.out_w * l.out_c;
29     l.inputs = h*w*c;
30     int output_size = l.out_h * l.out_w * l.out_c * batch;
31     l.output = (float*)xcalloc(output_size, sizeof(float));
32     l.delta = (float*)xcalloc(output_size, sizeof(float));
33 
34     l.forward = forward_reorg_old_layer;
35     l.backward = backward_reorg_old_layer;
36 #ifdef GPU
37     l.forward_gpu = forward_reorg_old_layer_gpu;
38     l.backward_gpu = backward_reorg_old_layer_gpu;
39 
40     l.output_gpu  = cuda_make_array(l.output, output_size);
41     l.delta_gpu   = cuda_make_array(l.delta, output_size);
42 #endif
43     return l;
44 }
45 
resize_reorg_old_layer(layer * l,int w,int h)46 void resize_reorg_old_layer(layer *l, int w, int h)
47 {
48     int stride = l->stride;
49     int c = l->c;
50 
51     l->h = h;
52     l->w = w;
53 
54     if(l->reverse){
55         l->out_w = w*stride;
56         l->out_h = h*stride;
57         l->out_c = c/(stride*stride);
58     }else{
59         l->out_w = w/stride;
60         l->out_h = h/stride;
61         l->out_c = c*(stride*stride);
62     }
63 
64     l->outputs = l->out_h * l->out_w * l->out_c;
65     l->inputs = l->outputs;
66     int output_size = l->outputs * l->batch;
67 
68     l->output = (float*)xrealloc(l->output, output_size * sizeof(float));
69     l->delta = (float*)xrealloc(l->delta, output_size * sizeof(float));
70 
71 #ifdef GPU
72     cuda_free(l->output_gpu);
73     cuda_free(l->delta_gpu);
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 
forward_reorg_old_layer(const layer l,network_state state)79 void forward_reorg_old_layer(const layer l, network_state state)
80 {
81     if (l.reverse) {
82         reorg_cpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output);
83     }
84     else {
85         reorg_cpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 0, l.output);
86     }
87 }
88 
backward_reorg_old_layer(const layer l,network_state state)89 void backward_reorg_old_layer(const layer l, network_state state)
90 {
91     if (l.reverse) {
92         reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 0, state.delta);
93     }
94     else {
95         reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 1, state.delta);
96     }
97 }
98 
99 #ifdef GPU
forward_reorg_old_layer_gpu(layer l,network_state state)100 void forward_reorg_old_layer_gpu(layer l, network_state state)
101 {
102     if (l.reverse) {
103         reorg_ongpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output_gpu);
104     }
105     else {
106         reorg_ongpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 0, l.output_gpu);
107     }
108 }
109 
backward_reorg_old_layer_gpu(layer l,network_state state)110 void backward_reorg_old_layer_gpu(layer l, network_state state)
111 {
112     if (l.reverse) {
113         reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, state.delta);
114     }
115     else {
116         reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, state.delta);
117     }
118 }
119 #endif
120