ae2f_docs
SlpTrainAND.cc
Go to the documentation of this file.
1#include "ae2f/Float.h"
2#include "ae2f/errGlob.h"
3#include <ae2f/Ann/Slp.h>
4#include <stdio.h>
5#include <math.h>
6
7static void
8Act(ae2f_float_t* r, ae2f_float_t x) {
9 *r = 1.0 / (1.0 + exp(-x));
10}
11
12static void
13ActDeriv(ae2f_float_t* r, ae2f_float_t output) {
14 output += 1e-7;
15 *r = output * (1.0 - output);
16}
17
18/** Cross entrophy */
19static void
20LossDeriv(ae2f_float_t* r, const ae2f_float_t* output, const ae2f_float_t* target, size_t i, size_t c) {
21 ae2f_float_t epsilon = 1e-7; // Small value to prevent division by zero
22 ae2f_float_t o_i = output[i];
23 // Clip output to avoid log(0) or division by zero
24 o_i = o_i < epsilon ? epsilon : (o_i > 1.0 - epsilon ? 1.0 - epsilon : o_i);
25 *r = (o_i - target[i]) / (c * o_i * (1.0 - o_i));
26}
27
28const ae2f_float_t inp[4][2] = { 1, 1, 0, 0, 0, 1, 1, 0 };
29const ae2f_float_t goal_and[4] = {1, 0, 0, 0 };
30const ae2f_float_t goal_or[4] = {1, 0, 1, 1 };
31
33
35ae2f_AnnSlp* slp = 0;
36
37size_t i, j;
38bool mismatch = 0;
39
40#define THRESHOLD 0.01
41#define DIFF_GOOD(a, b) (((a) - (b)) * ((a) - (b))) < THRESHOLD
42
43int tryand() {
44 puts("Trial: tryand");
45 err = 0;
46
47 do {
48
49 slp = new (
50 NULL, NULL, NULL
51 , 2
52 , 1, 0
53 , Act, ActDeriv, LossDeriv
54 , 0.1, 0.1
55 , &err
56 ) ae2f_AnnSlp;
57
58 printf("Learningrate dump: %f, %f\n", slp->m_learningrate, slp->m_learningrate_bias);
59 printf("function points: %p %p %p\n", slp->m_act, slp->m_actderiv, slp->m_lossderiv);
60
61 if(err) break;
62
63 for(i = 0 ; i < 2 * 1 + 1; ++i) {
64 slp->m_weight[i] = 0.2;
65 }
66
67
68 for(i = 0; i < 1000; ++i) {
69 for(j = 0; j < sizeof(inp) / sizeof(inp[0]); ++j) {
70 slp->Train(&err, inp[j], &goal_and[j]);
71 if(err) break;
72 }
73 }
74
75 for(j = 0; j < sizeof(inp) / sizeof(inp[0]); ++j) {
76 slp->Predict(&err, inp[j], output);
77 if(err) break;
78
79 printf("Got %f\n", *output);
80 if(DIFF_GOOD(output[0], goal_and[j])) {
81 printf("Match. Expected %f\n.", goal_and[j]);
82 } else {
83 printf("Expected %f. Unexpected.\n", goal_and[j]);
84 mismatch = 1;
85 }
86 }
87 } while(0);
88
89 if(mismatch) {
91 }
92
93 if(slp) delete (slp);
94 else puts("slp is null");
95 printf("Code from tryand: %d\n", err);
96
97 return err;
98}
99
100int main() {
101 return tryand();
102}
ae2f_float ae2f_float_t
Definition Float.h:38
ae2f_float_t output[1]
ae2f_err_t err[1]
Definition MlpTrainXOR.c:40
int main()
bool mismatch
Definition SlpTrainAND.c:46
ae2f_AnnSlp * slp
Definition SlpTrainAND.c:43
#define THRESHOLD
Definition SlpTrainAND.c:48
#define DIFF_GOOD(a, b)
Definition SlpTrainAND.c:49
const ae2f_float_t goal_or[4]
int tryand()
const ae2f_float_t goal_and[4]
const ae2f_float_t inp[4][2]
#define ae2f_errGlob_NFOUND
Found some errors, but not by parameters. The operation has failed.
Definition errGlob.h:50
uint8_t ae2f_err_t
Informs that this number represents the error.
Definition errGlob.h:19