summaryrefslogtreecommitdiffstats
path: root/example/ann_xor.c
blob: a39264cb630cca01e2757ec8f64a7ba9726d0446 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// example_xor.c - Example XOR training

#define ANN_IMPLEMENTATION
#include "../include/ann.h"

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
  srand(time(0));

  ann_t *ann = ann_init(3, (uint_t[]){2, 2, 1});
  ann_set_activation(ann, SIGMOID, SIGMOID);
  ann_random(ann);

  fp_t input[4][2] = {{0, 0}, {0, 1}, {1, 0}, {1, 1}};
  fp_t output[4] = {0, 0, 0, 0};
  fp_t expected[4] = {0, 1, 1, 0};
  fp_t error = 0;

  for (int_t iteration = 0; iteration < 100000; iteration++) {
    for (int_t training = 0; training < 4; training++) {
      ann_propagation_forward(ann, (fp_t const *const)&input[training],
                              &output[training]);

      error += ann_error_total(&output[training], &expected[training],
                               ann->layer_neuron_n[ann->layer_n - 1]);

      // Train using backpropagation
      ann_propagation_backward(ann, (fp_t const *const)&input[training],
                               &output[training], &expected[training], 0.4);

      // Train using numeric integration
      // ann_train_numeric( ann, ( fp_t const * const ) &i[b], &t[b], 0.03 );
    }
  }

  ann_print_weight(ann);

  fputs("------------------------------------------------------------\n\n",
        stderr);

  for (int i = 0; i < 4; i++) {
    ann_propagation_forward(ann, (fp_t const *const)&input[i], &output[i]);
    ann_print_neuron(ann, (fp_t const *const)&input[i], &output[i]);
  }
}