darknet  v3
deconvolutional_kernels.cu
Go to the documentation of this file.
1 #include "cuda_runtime.h"
2 #include "curand.h"
3 #include "cublas_v2.h"
4 
5 extern "C" {
6 #include "convolutional_layer.h"
8 #include "batchnorm_layer.h"
9 #include "gemm.h"
10 #include "blas.h"
11 #include "im2col.h"
12 #include "col2im.h"
13 #include "utils.h"
14 #include "cuda.h"
15 }
16 
18 {
19  int i;
20 
21  int m = l.size*l.size*l.n;
22  int n = l.h*l.w;
23  int k = l.c;
24 
25  fill_gpu(l.outputs*l.batch, 0, l.output_gpu, 1);
26 
27  for(i = 0; i < l.batch; ++i){
28  float *a = l.weights_gpu;
29  float *b = net.input_gpu + i*l.c*l.h*l.w;
30  float *c = net.workspace;
31 
32  gemm_gpu(1,0,m,n,k,1,a,m,b,n,0,c,n);
33 
34  col2im_gpu(net.workspace, l.out_c, l.out_h, l.out_w, l.size, l.stride, l.pad, l.output_gpu+i*l.outputs);
35  }
36  if (l.batch_normalize) {
37  forward_batchnorm_layer_gpu(l, net);
38  } else {
39  add_bias_gpu(l.output_gpu, l.biases_gpu, l.batch, l.n, l.out_w*l.out_h);
40  }
41  activate_array_gpu(l.output_gpu, l.batch*l.n*l.out_w*l.out_h, l.activation);
42 }
43 
45 {
46  int i;
47 
48  //constrain_gpu(l.outputs*l.batch, 1, l.delta_gpu, 1);
49  gradient_array_gpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu);
50 
51  if(l.batch_normalize){
52  backward_batchnorm_layer_gpu(l, net);
53  } else {
54  backward_bias_gpu(l.bias_updates_gpu, l.delta_gpu, l.batch, l.n, l.out_w*l.out_h);
55  }
56 
57  //if(net.delta_gpu) memset(net.delta_gpu, 0, l.batch*l.h*l.w*l.c*sizeof(float));
58 
59  for(i = 0; i < l.batch; ++i){
60  int m = l.c;
61  int n = l.size*l.size*l.n;
62  int k = l.h*l.w;
63 
64  float *a = net.input_gpu + i*m*k;
65  float *b = net.workspace;
66  float *c = l.weight_updates_gpu;
67 
68  im2col_gpu(l.delta_gpu + i*l.outputs, l.out_c, l.out_h, l.out_w,
69  l.size, l.stride, l.pad, b);
70  gemm_gpu(0,1,m,n,k,1,a,k,b,k,1,c,n);
71 
72  if(net.delta_gpu){
73  int m = l.c;
74  int n = l.h*l.w;
75  int k = l.size*l.size*l.n;
76 
77  float *a = l.weights_gpu;
78  float *b = net.workspace;
79  float *c = net.delta_gpu + i*n*m;
80 
81  gemm_gpu(0,0,m,n,k,1,a,k,b,n,1,c,n);
82  }
83  }
84 }
85 
87 {
88  cuda_pull_array(l.weights_gpu, l.weights, l.c*l.n*l.size*l.size);
89  cuda_pull_array(l.biases_gpu, l.biases, l.n);
90  cuda_pull_array(l.weight_updates_gpu, l.weight_updates, l.c*l.n*l.size*l.size);
91  cuda_pull_array(l.bias_updates_gpu, l.bias_updates, l.n);
92  if (l.batch_normalize){
93  cuda_pull_array(l.scales_gpu, l.scales, l.n);
94  cuda_pull_array(l.rolling_mean_gpu, l.rolling_mean, l.n);
95  cuda_pull_array(l.rolling_variance_gpu, l.rolling_variance, l.n);
96  }
97 }
98 
100 {
101  cuda_push_array(l.weights_gpu, l.weights, l.c*l.n*l.size*l.size);
102  cuda_push_array(l.biases_gpu, l.biases, l.n);
103  cuda_push_array(l.weight_updates_gpu, l.weight_updates, l.c*l.n*l.size*l.size);
104  cuda_push_array(l.bias_updates_gpu, l.bias_updates, l.n);
105  if (l.batch_normalize){
106  cuda_push_array(l.scales_gpu, l.scales, l.n);
107  cuda_push_array(l.rolling_mean_gpu, l.rolling_mean, l.n);
108  cuda_push_array(l.rolling_variance_gpu, l.rolling_variance, l.n);
109  }
110 }
111 
113 {
114  float learning_rate = a.learning_rate*l.learning_rate_scale;
115  float momentum = a.momentum;
116  float decay = a.decay;
117  int batch = a.batch;
118 
119  if(a.adam){
120  adam_update_gpu(l.weights_gpu, l.weight_updates_gpu, l.m_gpu, l.v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.nweights, batch, a.t);
121  adam_update_gpu(l.biases_gpu, l.bias_updates_gpu, l.bias_m_gpu, l.bias_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.n, batch, a.t);
122  if(l.scales_gpu){
123  adam_update_gpu(l.scales_gpu, l.scale_updates_gpu, l.scale_m_gpu, l.scale_v_gpu, a.B1, a.B2, a.eps, decay, learning_rate, l.n, batch, a.t);
124  }
125  }else{
126  axpy_gpu(l.nweights, -decay*batch, l.weights_gpu, 1, l.weight_updates_gpu, 1);
127  axpy_gpu(l.nweights, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1);
128  scal_gpu(l.nweights, momentum, l.weight_updates_gpu, 1);
129 
130  axpy_gpu(l.n, learning_rate/batch, l.bias_updates_gpu, 1, l.biases_gpu, 1);
131  scal_gpu(l.n, momentum, l.bias_updates_gpu, 1);
132 
133  if(l.scales_gpu){
134  axpy_gpu(l.n, learning_rate/batch, l.scale_updates_gpu, 1, l.scales_gpu, 1);
135  scal_gpu(l.n, momentum, l.scale_updates_gpu, 1);
136  }
137  }
138 }
139 
float momentum
Definition: darknet.h:104
ACTIVATION activation
Definition: darknet.h:121
float * scales
Definition: darknet.h:239
float * biases
Definition: darknet.h:236
void add_bias_gpu(float *output, float *biases, int batch, int n, int size)
Definition: blas_kernels.cu:69
float * weight_updates
Definition: darknet.h:243
void pull_deconvolutional_layer(layer l)
int w
Definition: darknet.h:140
int pad
Definition: darknet.h:151
int n
Definition: darknet.h:142
void col2im_gpu(float *data_col, int channels, int height, int width, int ksize, int stride, int pad, float *data_im)
void backward_bias_gpu(float *bias_updates, float *delta, int batch, int n, int size)
float learning_rate
Definition: darknet.h:103
float * rolling_variance
Definition: darknet.h:259
void axpy_gpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY)
float decay
Definition: darknet.h:105
void im2col_gpu(float *im, int channels, int height, int width, int ksize, int stride, int pad, float *data_col)
int out_w
Definition: darknet.h:141
void push_deconvolutional_layer(layer l)
float B1
Definition: darknet.h:107
int nweights
Definition: darknet.h:136
int out_c
Definition: darknet.h:141
void fill_gpu(int N, float ALPHA, float *X, int INCX)
float * workspace
Definition: darknet.h:487
void backward_deconvolutional_layer_gpu(layer l, network net)
void update_deconvolutional_layer_gpu(layer l, update_args a)
int batch_normalize
Definition: darknet.h:129
int size
Definition: darknet.h:145
int batch
Definition: darknet.h:102
void scal_gpu(int N, float ALPHA, float *X, int INCX)
int h
Definition: darknet.h:140
int out_h
Definition: darknet.h:141
int adam
Definition: darknet.h:106
int batch
Definition: darknet.h:131
float * rolling_mean
Definition: darknet.h:258
float * bias_updates
Definition: darknet.h:237
float learning_rate_scale
Definition: darknet.h:168
int stride
Definition: darknet.h:147
int c
Definition: darknet.h:140
float eps
Definition: darknet.h:109
void forward_deconvolutional_layer_gpu(layer l, network net)
float B2
Definition: darknet.h:108
void activate_array_gpu(float *x, int n, ACTIVATION a)
int outputs
Definition: darknet.h:135
void adam_update_gpu(float *w, float *d, float *m, float *v, float B1, float B2, float eps, float decay, float rate, int n, int batch, int t)
void gradient_array_gpu(float *x, int n, ACTIVATION a, float *delta)
Definition: darknet.h:119
float * weights
Definition: darknet.h:242