darknet  v3
softmax_layer.c
Go to the documentation of this file.
1 #include "softmax_layer.h"
2 #include "blas.h"
3 #include "cuda.h"
4 
5 #include <float.h>
6 #include <math.h>
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <assert.h>
10 
11 softmax_layer make_softmax_layer(int batch, int inputs, int groups)
12 {
13  assert(inputs%groups == 0);
14  fprintf(stderr, "softmax %4d\n", inputs);
15  softmax_layer l = {0};
16  l.type = SOFTMAX;
17  l.batch = batch;
18  l.groups = groups;
19  l.inputs = inputs;
20  l.outputs = inputs;
21  l.loss = calloc(inputs*batch, sizeof(float));
22  l.output = calloc(inputs*batch, sizeof(float));
23  l.delta = calloc(inputs*batch, sizeof(float));
24  l.cost = calloc(1, sizeof(float));
25 
28  #ifdef GPU
29  l.forward_gpu = forward_softmax_layer_gpu;
30  l.backward_gpu = backward_softmax_layer_gpu;
31 
32  l.output_gpu = cuda_make_array(l.output, inputs*batch);
33  l.loss_gpu = cuda_make_array(l.loss, inputs*batch);
34  l.delta_gpu = cuda_make_array(l.delta, inputs*batch);
35  #endif
36  return l;
37 }
38 
40 {
41  if(l.softmax_tree){
42  int i;
43  int count = 0;
44  for (i = 0; i < l.softmax_tree->groups; ++i) {
45  int group_size = l.softmax_tree->group_size[i];
46  softmax_cpu(net.input + count, group_size, l.batch, l.inputs, 1, 0, 1, l.temperature, l.output + count);
47  count += group_size;
48  }
49  } else {
50  softmax_cpu(net.input, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output);
51  }
52 
53  if(net.truth && !l.noloss){
54  softmax_x_ent_cpu(l.batch*l.inputs, l.output, net.truth, l.delta, l.loss);
55  l.cost[0] = sum_array(l.loss, l.batch*l.inputs);
56  }
57 }
58 
60 {
61  axpy_cpu(l.inputs*l.batch, 1, l.delta, 1, net.delta, 1);
62 }
63 
64 #ifdef GPU
65 
66 void pull_softmax_layer_output(const softmax_layer layer)
67 {
68  cuda_pull_array(layer.output_gpu, layer.output, layer.inputs*layer.batch);
69 }
70 
71 void forward_softmax_layer_gpu(const softmax_layer l, network net)
72 {
73  if(l.softmax_tree){
74  softmax_tree(net.input_gpu, 1, l.batch, l.inputs, l.temperature, l.output_gpu, *l.softmax_tree);
75  /*
76  int i;
77  int count = 0;
78  for (i = 0; i < l.softmax_tree->groups; ++i) {
79  int group_size = l.softmax_tree->group_size[i];
80  softmax_gpu(net.input_gpu + count, group_size, l.batch, l.inputs, 1, 0, 1, l.temperature, l.output_gpu + count);
81  count += group_size;
82  }
83  */
84  } else {
85  if(l.spatial){
86  softmax_gpu(net.input_gpu, l.c, l.batch*l.c, l.inputs/l.c, l.w*l.h, 1, l.w*l.h, 1, l.output_gpu);
87  }else{
88  softmax_gpu(net.input_gpu, l.inputs/l.groups, l.batch, l.inputs, l.groups, l.inputs/l.groups, 1, l.temperature, l.output_gpu);
89  }
90  }
91  if(net.truth && !l.noloss){
92  softmax_x_ent_gpu(l.batch*l.inputs, l.output_gpu, net.truth_gpu, l.delta_gpu, l.loss_gpu);
93  if(l.softmax_tree){
94  mask_gpu(l.batch*l.inputs, l.delta_gpu, SECRET_NUM, net.truth_gpu, 0);
95  mask_gpu(l.batch*l.inputs, l.loss_gpu, SECRET_NUM, net.truth_gpu, 0);
96  }
97  cuda_pull_array(l.loss_gpu, l.loss, l.batch*l.inputs);
98  l.cost[0] = sum_array(l.loss, l.batch*l.inputs);
99  }
100 }
101 
102 void backward_softmax_layer_gpu(const softmax_layer layer, network net)
103 {
104  axpy_gpu(layer.batch*layer.inputs, 1, layer.delta_gpu, 1, net.delta_gpu, 1);
105 }
106 
107 #endif
float temperature
Definition: darknet.h:210
int noloss
Definition: darknet.h:170
int w
Definition: darknet.h:140
void(* forward_gpu)(struct layer, struct network)
Definition: darknet.h:126
int spatial
Definition: darknet.h:150
float * truth
Definition: darknet.h:485
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 backward_softmax_layer(const softmax_layer l, network net)
Definition: softmax_layer.c:59
void(* forward)(struct layer, struct network)
Definition: darknet.h:123
float * delta
Definition: darknet.h:486
void softmax_x_ent_cpu(int n, float *pred, float *truth, float *delta, float *error)
Definition: blas.c:265
void softmax_x_ent_gpu(int n, float *pred, float *truth, float *delta, float *error)
int groups
Definition: darknet.h:50
void forward_softmax_layer(const softmax_layer l, network net)
Definition: softmax_layer.c:39
void softmax_cpu(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output)
Definition: blas.c:324
int h
Definition: darknet.h:140
float * delta
Definition: darknet.h:245
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
void(* backward)(struct layer, struct network)
Definition: darknet.h:124
int batch
Definition: darknet.h:131
float * output
Definition: darknet.h:246
float sum_array(float *a, int n)
Definition: utils.c:479
int * group_size
Definition: darknet.h:51
int groups
Definition: darknet.h:144
softmax_layer make_softmax_layer(int batch, int inputs, int groups)
Definition: softmax_layer.c:11
void mask_gpu(int N, float *X, float mask_num, float *mask, float val)
float * loss
Definition: darknet.h:247
void softmax_gpu(float *input, int n, int batch, int batch_offset, int groups, int group_offset, int stride, float temp, float *output)
int c
Definition: darknet.h:140
void softmax_tree(float *input, int spatial, int batch, int stride, float temp, float *output, tree hier)
LAYER_TYPE type
Definition: darknet.h:120
#define SECRET_NUM
Definition: darknet.h:8
float * input
Definition: darknet.h:484
tree * softmax_tree
Definition: darknet.h:334
int outputs
Definition: darknet.h:135
float * cost
Definition: darknet.h:222
Definition: darknet.h:119