1#define ae2f_NEED_CLASS 0
3#include <ae2f/Ann/Act.h>
4#include <ae2f/Ann/Mlp.h>
5#include <ae2f/Ann/Slp.h>
13static void Act(
ae2f_float* r,
const ae2f_float_t* x, size_t i, size_t c) {
14 *r = 1.0 / (1.0 + exp(-x[i]));
17static void ActDeriv(ae2f_float_t* r,
const ae2f_float_t* output, size_t i, size_t c) {
18 *r = output[i] * (1.0 - output[i]);
21static void LossDeriv(ae2f_float_t* r,
const ae2f_float_t* output,
const ae2f_float_t* target, size_t i, size_t c) {
22 *r = ((output[i] - target[i]) / c);
25const ae2f_float_t prm_inp[4][2] = {
32const ae2f_float_t goal_xor[4] = {0, 1, 1, 0};
34ae2f_float_t output[1] = { 0 };
60ae2f_AnnActFFN_t* mlp_acts[
MLP_DEPTH - 1] = { Act, Act };
61ae2f_AnnActFFN_t* mlp_actderivs[
MLP_DEPTH - 1] = { ActDeriv, ActDeriv };
66 ae2f_AnnMlpPredictStream_t m_predictsteam;
67 ae2f_AnnSlpFetchDelta_t m_fetch;
68 ae2f_AnnMlpBwdAll_t m_Bwd;
72 puts(
"MlpTrainXOR-Primal start");
74 puts(
"Configuring mlp");
78 puts(
"Configuring last slp");
84 puts(
"Initializing weights randomly with correct memory layout");
88 for (i = 0; i < mlp_szv[1]; i++) {
89 for (k = 0; k < mlp_szv[0]; k++) {
90 mlp_weights[weight_base_l0 + i * mlp_szv[0] + k] = ((
double)rand() / RAND_MAX) - 0.5;
92 mlp_bias[bias_base_l0 + i] = ((
double)rand() / RAND_MAX) - 0.5;
98 for (i = 0; i < mlp_szv[2]; i++) {
99 for (k = 0; k < mlp_szv[1]; k++) {
100 mlp_weights[weight_base_l1 + i * mlp_szv[1] + k] = ((
double)rand() / RAND_MAX) - 0.5;
102 mlp_bias[bias_base_l1 + i] = ((
double)rand() / RAND_MAX) - 0.5;
105 puts(
"See first output (before training)");
106 for(i = 0; i < 4; ++i) {
108 __test_stack.m_predictsteam, mlp, prm_inp[i], output, mlp_szv,
109 mlp_weights, mlp_bias, mlp_outstream, mlp_acts
111 printf(
"Initial Output for [%d, %d]: %f (goal: %d)\n"
112 , (
int)prm_inp[i][0], (
int)prm_inp[i][1], output[0], (
int)goal_xor[i]);
116 for(j = 0; j < 9000; ++j) {
117 for(i = 0; i < 4; ++i) {
119 __test_stack.m_predictsteam, mlp, prm_inp[i], output, mlp_szv,
120 mlp_weights, mlp_bias, mlp_outstream, mlp_acts
124 __test_stack.m_fetch, slplast
131 __test_stack.m_Bwd, mlp, prm_inp[i]
133 mlp_szv, mlp_outstream, mlp_deltastream,
134 mlp_weights, mlp_bias,
140 puts(
"Training complete.");
142 puts(
"See last output after training");
143 for(i = 0; i < 4; ++i) {
145 __test_stack.m_predictsteam, mlp, prm_inp[i], output, mlp_szv,
146 mlp_weights, mlp_bias, mlp_outstream, mlp_acts
148 printf(
"Final Output for [%d, %d]: %f (goal: %d)\n"
149 , (
int)prm_inp[i][0], (
int)prm_inp[i][1], output[0], (
int)goal_xor[i]
#define MLP_WEIGHT_STRIDE
#define __ae2f_AnnMlpPredictStream_imp(v_predict, mlp, inp, out, sz, weight, bias, outcache, act_opt)
#define __ae2f_AnnMlpFollow_imp(v_follow, mlp, inp, delta, lenv, outstream, deltacache, weight, bias, lr_w, lr_b, actderiv)
#define __ae2f_AnnSlpFetchDelta_imp(tmp_delta, prm_slp, pprm_out, pprm_out_desired, fn_actderiv, fn_lossderiv, pret_delta)