1 #include "activation_layer.h"
2 #include "utils.h"
3 #include "dark_cuda.h"
4 #include "blas.h"
5 #include "gemm.h"
6 
7 #include <math.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 
make_activation_layer(int batch,int inputs,ACTIVATION activation)12 layer make_activation_layer(int batch, int inputs, ACTIVATION activation)
13 {
14     layer l = { (LAYER_TYPE)0 };
15     l.type = ACTIVE;
16 
17     l.inputs = inputs;
18     l.outputs = inputs;
19     l.batch=batch;
20 
21     l.output = (float*)xcalloc(batch * inputs, sizeof(float));
22     l.delta = (float*)xcalloc(batch * inputs, sizeof(float));
23 
24     l.forward = forward_activation_layer;
25     l.backward = backward_activation_layer;
26 #ifdef GPU
27     l.forward_gpu = forward_activation_layer_gpu;
28     l.backward_gpu = backward_activation_layer_gpu;
29 
30     l.output_gpu = cuda_make_array(l.output, inputs*batch);
31     l.delta_gpu = cuda_make_array(l.delta, inputs*batch);
32 #endif
33     l.activation = activation;
34     fprintf(stderr, "Activation Layer: %d inputs\n", inputs);
35     return l;
36 }
37 
forward_activation_layer(layer l,network_state state)38 void forward_activation_layer(layer l, network_state state)
39 {
40     copy_cpu(l.outputs*l.batch, state.input, 1, l.output, 1);
41     activate_array(l.output, l.outputs*l.batch, l.activation);
42 }
43 
backward_activation_layer(layer l,network_state state)44 void backward_activation_layer(layer l, network_state state)
45 {
46     gradient_array(l.output, l.outputs*l.batch, l.activation, l.delta);
47     copy_cpu(l.outputs*l.batch, l.delta, 1, state.delta, 1);
48 }
49 
50 #ifdef GPU
51 
forward_activation_layer_gpu(layer l,network_state state)52 void forward_activation_layer_gpu(layer l, network_state state)
53 {
54     copy_ongpu(l.outputs*l.batch, state.input, 1, l.output_gpu, 1);
55     activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation);
56 }
57 
backward_activation_layer_gpu(layer l,network_state state)58 void backward_activation_layer_gpu(layer l, network_state state)
59 {
60     gradient_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation, l.delta_gpu);
61     copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, state.delta, 1);
62 }
63 #endif
64