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