Ich würde es erst mal einfach halten und nicht mit verpointerten Knoten und Kanten anfangen. Hier ein kleines NN das XOR berechnet:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct {int depth; int layer[10]; double weight[30];} NN;
const double e=2.718281828459045, temperature=0.08;
#define sigmoid(x) (1.0/(1.0+pow(e, -x/temperature)))
double* evaluate(NN &net, double cell[]) {
int Weight=0, Out=0;
for (int level = 1; level < net.depth; level++) {
int In = Out;
Out += net.layer[level-1];
for (int j = 0; j < net.layer[level]; j++) {
double s = net.weight[Weight++]; // bias
for (int i = 0; i < net.layer[level-1]; i++) s += net.weight[Weight++] * cell[In+i];
cell[Out+j] = sigmoid(s);
}
}
return &cell[Out] ;
};
void xorNN(int a, int b) {
static NN net={3, /*layer*/ {2,2,1},
{/*inner1 node2 bias=*/-0.3, /*w0=*/+0.7, /*w1=*/-0.7,
/*inner1 node3 bias=*/-0.4, /*w0=*/-0.6, /*w1=*/+0.5,
/*outer2 node4 bias=*/-0.5, /*w2=*/+1.1, /*w3=*/+1.5,}};
double cell[2+2+1]={a,b};
printf("%d xor %d -> %d\n", a, b, evaluate(net, cell)[0]<0.5?0:1 );
}
int main(int argc, char* argv[]) {
xorNN(0,0);
xorNN(0,1);
xorNN(1,0);
xorNN(1,1);
}
Liefert als Ausgabe:
Code:
0 xor 0 -> 0
0 xor 1 -> 1
1 xor 0 -> 1
1 xor 1 -> 0
Lesezeichen