darknet  v3
l2norm_layer.c
Go to the documentation of this file.
1 #include "l2norm_layer.h"
2 #include "activations.h"
3 #include "blas.h"
4 #include "cuda.h"
5 
6 #include <float.h>
7 #include <math.h>
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <assert.h>
11 
12 layer make_l2norm_layer(int batch, int inputs)
13 {
14  fprintf(stderr, "l2norm %4d\n", inputs);
15  layer l = {0};
16  l.type = L2NORM;
17  l.batch = batch;
18  l.inputs = inputs;
19  l.outputs = inputs;
20  l.output = calloc(inputs*batch, sizeof(float));
21  l.scales = calloc(inputs*batch, sizeof(float));
22  l.delta = calloc(inputs*batch, sizeof(float));
23 
26  #ifdef GPU
27  l.forward_gpu = forward_l2norm_layer_gpu;
28  l.backward_gpu = backward_l2norm_layer_gpu;
29 
30  l.output_gpu = cuda_make_array(l.output, inputs*batch);
31  l.scales_gpu = cuda_make_array(l.output, inputs*batch);
32  l.delta_gpu = cuda_make_array(l.delta, inputs*batch);
33  #endif
34  return l;
35 }
36 
38 {
39  copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1);
41 }
42 
44 {
45  //axpy_cpu(l.inputs*l.batch, 1, l.scales, 1, l.delta, 1);
46  axpy_cpu(l.inputs*l.batch, 1, l.delta, 1, net.delta, 1);
47 }
48 
49 #ifdef GPU
50 
51 void forward_l2norm_layer_gpu(const layer l, network net)
52 {
53  copy_gpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1);
54  l2normalize_gpu(l.output_gpu, l.scales_gpu, l.batch, l.out_c, l.out_w*l.out_h);
55 }
56 
57 void backward_l2norm_layer_gpu(const layer l, network net)
58 {
59  axpy_gpu(l.batch*l.inputs, 1, l.scales_gpu, 1, l.delta_gpu, 1);
60  axpy_gpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1);
61 }
62 
63 #endif
float * scales
Definition: darknet.h:239
void l2normalize_cpu(float *x, float *dx, int batch, int filters, int spatial)
Definition: blas.c:126
void(* forward_gpu)(struct layer, struct network)
Definition: darknet.h:126
void l2normalize_gpu(float *x, float *dx, int batch, int filters, int spatial)
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
float * delta
Definition: darknet.h:486
int out_c
Definition: darknet.h:141
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
layer make_l2norm_layer(int batch, int inputs)
Definition: l2norm_layer.c:12
void(* backward)(struct layer, struct network)
Definition: darknet.h:124
void forward_l2norm_layer(const layer l, network net)
Definition: l2norm_layer.c:37
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
void backward_l2norm_layer(const layer l, network net)
Definition: l2norm_layer.c:43
LAYER_TYPE type
Definition: darknet.h:120
float * input
Definition: darknet.h:484
Definition: darknet.h:93
int outputs
Definition: darknet.h:135
Definition: darknet.h:119