ANN  0.1.1.5
A library containing multiple neural network models written in C
backprop.c
Go to the documentation of this file.
1 #include <stdlib.h>
5 
7 
8 
9 ANN_INLINE void PCFNN_LAYER_backward_hidden(struct PCFNN_LAYER *l, double eta, double alpha)
10 {
11  if (l == NULL) return;
12  for(size_t i = 0; i < l->size; ++i)
13  {
14  l->neurons[i]->delta = l->neurons[i]->f_act_de(l->neurons[i]->activation)
15  * l->neurons[i]->dsum; // calculate delta
16 
17  for (size_t w = 0; w < l->neurons[i]->size; ++w)
18  l->neurons[i]->inputs[w]->dsum += l->neurons[i]->delta * l->neurons[i]->weights[w]; // propagate delta
19 
20  // update weights/bias delta
21  for(size_t w = 0; w < l->neurons[i]->size; ++w)
22  {
23  double dw = -eta * l->neurons[i]->delta * l->neurons[i]->inputs[w]->output + alpha * l->neurons[i]->lastdw[w];
24  l->neurons[i]->lastdw[w] = dw;
25  l->neurons[i]->wdelta[w] += dw;
26  }
27  l->neurons[i]->bdelta += -eta * l->neurons[i]->delta;
28  }
29 }
30 
31 ANN_INLINE void PCFNN_LAYER_backward_output(struct PCFNN_LAYER *l, double *target, double(*f_cost)(double, double), double eta, double alpha)
32 {
33  if (l == NULL || target == NULL) return;
34  for(size_t i = 0; i < l->size; ++i)
35  {
36  l->neurons[i]->delta = l->neurons[i]->f_act_de(l->neurons[i]->activation)
37  * f_cost(l->neurons[i]->output, target[i]); // calculate delta
38 
39  for (size_t w = 0; w < l->neurons[i]->size; ++w)
40  l->neurons[i]->inputs[w]->dsum += l->neurons[i]->delta * l->neurons[i]->weights[w]; // propagate delta
41 
42  // update weights/bias delta
43  for(size_t w = 0; w < l->neurons[i]->size; ++w)
44  {
45  double dw = -eta * l->neurons[i]->delta * l->neurons[i]->inputs[w]->output + alpha * l->neurons[i]->lastdw[w];
46  l->neurons[i]->lastdw[w] = dw;
47  l->neurons[i]->wdelta[w] += dw;
48  }
49  l->neurons[i]->bdelta += -eta * l->neurons[i]->delta;
50  }
51 }
52 
53 ANN_INLINE void PCFNN_NETWORK_backward(struct PCFNN_NETWORK *net, double *target, double(*f_cost)(double, double), double eta, double alpha)
54 {
55  PCFNN_LAYER_backward_output(net->outputl, target, f_cost, eta, alpha);
56  for(size_t i = net->size - 1; i > 0; --i)
57  {
58  if (net->layers[i]->type == PCFNN_LAYER_HIDDEN)
59  PCFNN_LAYER_backward_hidden(net->layers[i], eta, alpha);
60  }
61 }
62 
63 
64 void PCFNN_NETWORK_backprop(struct PCFNN_NETWORK *net, double *target, double eta, double alpha, double(*f_cost)(double, double))
65 {
66  if (net == NULL || target == NULL || f_cost == NULL) return;
67  PCFNN_NETWORK_backward(net, target, f_cost, eta, alpha);
68 }
69 
70 
71 ANN_INLINE void PCFNN_LAYER_apply_delta(struct PCFNN_LAYER *l)
72 {
73  if (l == NULL) return;
74  for (size_t i = 0; i < l->size; ++i)
75  {
76  if (l->neurons[i]->state == PCFNN_NEURON_LOCK) continue;
77  l->neurons[i]->bias += l->neurons[i]->bdelta;
78  for(size_t j = 0; j < l->neurons[i]->size; ++j)
79  l->neurons[i]->weights[j] += l->neurons[i]->wdelta[j];
81  }
82 }
83 
84 
86 {
87  if (net == NULL) return;
88  for(size_t i = net->size - 1; i > 0; --i)
90 }
91 
double delta
Definition: neuron.h:40
double dsum
Definition: neuron.h:40
double bdelta
Definition: neuron.h:40
Layer unit.
Definition: layer.h:53
PCFNN_LAYER.
double activation
Definition: neuron.h:40
ANN_INLINE void PCFNN_LAYER_backward_output(struct PCFNN_LAYER *l, double *target, double(*f_cost)(double, double), double eta, double alpha)
Definition: backprop.c:31
void PCFNN_NEURON_clear(struct PCFNN_NEURON *n)
Clear a PCFNN_NEURON.
Definition: neuron.c:21
void PCFNN_NETWORK_backprop(struct PCFNN_NETWORK *net, double *target, double eta, double alpha, double(*f_cost)(double, double))
Run the Backpropagation Algorithm on the network net.
Definition: backprop.c:64
struct PCFNN_LAYER ** layers
Definition: network.h:29
ANN_INLINE void PCFNN_NETWORK_backward(struct PCFNN_NETWORK *net, double *target, double(*f_cost)(double, double), double eta, double alpha)
Definition: backprop.c:53
size_t size
Definition: layer.h:55
struct PCFNN_LAYER * outputl
Definition: network.h:30
struct PCFNN_NEURON ** inputs
Definition: neuron.h:42
size_t size
Definition: network.h:28
PCFNN_NEURON.
ANN_INLINE void PCFNN_LAYER_apply_delta(struct PCFNN_LAYER *l)
Definition: backprop.c:71
double output
Definition: neuron.h:38
double(* f_act_de)(double)
Definition: neuron.h:45
PCFNN_BACKPROP.
void PCFNN_NETWORK_apply_delta(struct PCFNN_NETWORK *net)
Apply all delta calculated by PCFNN_NETWORK_backprop on the network net.
Definition: backprop.c:85
PCFNN_NETWORK.
double * lastdw
Definition: neuron.h:41
struct PCFNN_NEURON ** neurons
Definition: layer.h:56
double bias
Definition: neuron.h:38
ANN_INLINE void PCFNN_LAYER_backward_hidden(struct PCFNN_LAYER *l, double eta, double alpha)
Definition: backprop.c:9
double * weights
Definition: neuron.h:37
double * wdelta
Definition: neuron.h:41
enum PCFNN_LAYER_TYPE type
Definition: layer.h:62
Network unit.
Definition: network.h:27
enum PCFNN_NEURON_LOCK_STATE state
Definition: neuron.h:46
size_t size
Definition: neuron.h:36