darknet  v3
logistic_layer.c
Go to the documentation of this file.
1 #include "logistic_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_logistic_layer(int batch, int inputs)
13 {
14  fprintf(stderr, "logistic x entropy %4d\n", inputs);
15  layer l = {0};
16  l.type = LOGXENT;
17  l.batch = batch;
18  l.inputs = inputs;
19  l.outputs = inputs;
20  l.loss = calloc(inputs*batch, sizeof(float));
21  l.output = calloc(inputs*batch, sizeof(float));
22  l.delta = calloc(inputs*batch, sizeof(float));
23  l.cost = calloc(1, sizeof(float));
24 
27  #ifdef GPU
28  l.forward_gpu = forward_logistic_layer_gpu;
29  l.backward_gpu = backward_logistic_layer_gpu;
30 
31  l.output_gpu = cuda_make_array(l.output, inputs*batch);
32  l.loss_gpu = cuda_make_array(l.loss, inputs*batch);
33  l.delta_gpu = cuda_make_array(l.delta, inputs*batch);
34  #endif
35  return l;
36 }
37 
39 {
40  copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1);
42  if(net.truth){
44  l.cost[0] = sum_array(l.loss, l.batch*l.inputs);
45  }
46 }
47 
49 {
50  axpy_cpu(l.inputs*l.batch, 1, l.delta, 1, net.delta, 1);
51 }
52 
53 #ifdef GPU
54 
55 void forward_logistic_layer_gpu(const layer l, network net)
56 {
57  copy_gpu(l.outputs*l.batch, net.input_gpu, 1, l.output_gpu, 1);
58  activate_array_gpu(l.output_gpu, l.outputs*l.batch, LOGISTIC);
59  if(net.truth){
60  logistic_x_ent_gpu(l.batch*l.inputs, l.output_gpu, net.truth_gpu, l.delta_gpu, l.loss_gpu);
61  cuda_pull_array(l.loss_gpu, l.loss, l.batch*l.inputs);
62  l.cost[0] = sum_array(l.loss, l.batch*l.inputs);
63  }
64 }
65 
66 void backward_logistic_layer_gpu(const layer l, network net)
67 {
68  axpy_gpu(l.batch*l.inputs, 1, l.delta_gpu, 1, net.delta_gpu, 1);
69 }
70 
71 #endif
void(* forward_gpu)(struct layer, struct network)
Definition: darknet.h:126
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)
layer make_logistic_layer(int batch, int inputs)
void(* forward)(struct layer, struct network)
Definition: darknet.h:123
void backward_logistic_layer(const layer l, network net)
float * delta
Definition: darknet.h:486
void logistic_x_ent_cpu(int n, float *pred, float *truth, float *delta, float *error)
Definition: blas.c:276
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
void logistic_x_ent_gpu(int n, float *pred, float *truth, float *delta, float *error)
void copy_gpu(int N, float *X, int INCX, float *Y, int INCY)
void forward_logistic_layer(const layer l, network net)
float * loss
Definition: darknet.h:247
void activate_array(float *x, const int n, const ACTIVATION a)
Definition: activations.c:100
void copy_cpu(int N, float *X, int INCX, float *Y, int INCY)
Definition: blas.c:226
LAYER_TYPE type
Definition: darknet.h:120
float * input
Definition: darknet.h:484
void activate_array_gpu(float *x, int n, ACTIVATION a)
int outputs
Definition: darknet.h:135
float * cost
Definition: darknet.h:222
Definition: darknet.h:119