-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathneuralNet.c
81 lines (74 loc) · 1.59 KB
/
neuralNet.c
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# include <stdlib.h>
#include "layer.h"
#include "neuron.h"
#include "neuralNet.h"
struct neuralNet *initNeuralNet(int *layersizes, int size)
{
struct neuralNet *R = malloc(sizeof(struct neuralNet));
R->size = size;
R->layers = malloc(size * sizeof(struct layer));
int i = 0;
for (;i < size; ++i)
{
if (i == 0)
{
R->layers[i] = *initLayer(layersizes[i], 0);
}
else
{
R->layers[i] = *initLayer(layersizes[i], layersizes[i - 1]);
}
}
R->lastLayer = R->layers[i - 1].N;
R->lSize = R->layers[i - 1].size;
return R;
}
void forward(struct neuralNet *R)
{
for (int i = 1; i < R->size;++i)
{
updateSum(&R->layers[i], &R->layers[i - 1]);
}
}
double *result(struct neuralNet *R, double *input)
{
for (int i = 0; i < R->layers[0].size;++i)
{
R->layers[0].N[i].out = input[i];
}
forward(R);
double *returnValue = malloc(R->lSize * sizeof(double));
for (int i = 0; i < R->lSize; ++i)
{
returnValue[i] = R->lastLayer[i].out;
}
return returnValue;
}
void backPropagation(struct neuralNet *R, double *target)
{
for (int i = 0; i < R->lSize;++i)
{
R->lastLayer[i].delta = calcError(&R->lastLayer[i], target[i]);
}
for (int i = R->size - 1; i > 0; --i)
{
updateError(&R->layers[i - 1], &R->layers[i]);
}
for (int i = 0; i < R->size - 1; ++i)
{
updateWeights(&R->layers[i + 1], &R->layers[i]);
}
}
double calcError(struct neuron *N, double target)
{
return (target - N->out);
}
void learn(struct neuralNet *R, double *input, double *target)
{
for (int i = 0; i < R->layers[0].size;++i)
{
R->layers[0].N[i].out = input[i];
}
forward(R);
backPropagation(R, target);
}