Skip to content

Commit f942f62

Browse files
committed
add relu activation 3 layer neural network with learn by gradient
1 parent 11a0846 commit f942f62

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

MLTests/NSteerLightReluTests.cs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
using Numpy;
2+
using NUnit.Framework;
3+
4+
namespace MLTests
5+
{
6+
public class NSteerLightReluTests
7+
{
8+
private NDarray Relu(NDarray layer)
9+
{
10+
var shape = layer.shape;
11+
var data = layer.GetData<double>();
12+
var result = data.Select(num => num < 0f ? 0f : (float) num).ToArray();
13+
return np.array(result).reshape(shape);
14+
}
15+
16+
private NDarray ReluToDerivative(NDarray layer)
17+
{
18+
var shape = layer.shape;
19+
return np.array(layer.GetData<float>().Select(num => num > 0f ? 1f : 0f).ToArray()).reshape(shape);
20+
}
21+
22+
[Test]
23+
public void ShouldLearnOnNoncorrelationData()
24+
{
25+
26+
var streetLights = np.array(new float[,] {
27+
{1f, 0f, 1f},
28+
{0f, 1f, 1f},
29+
{0f, 0f, 1f},
30+
{1f, 1f, 1f},
31+
});
32+
var stayOrWalk = np.array(new float[,] { { 1f, 1f, 0f, 0f } }).T;
33+
var alpha = 0.2f;
34+
var inputLayerSize = 3;
35+
var hiddenLayerSize = 4;
36+
var outputLayerSize = 1;
37+
38+
var weights01 = 2 * np.random.rand(inputLayerSize, hiddenLayerSize) - 1;
39+
var weights12 = 2 * np.random.rand(hiddenLayerSize, outputLayerSize) - 1;
40+
41+
/*
42+
var layer0 = streetLights[0];
43+
var layer1 = Relu(np.dot(layer0, weights01));
44+
var layer2 = np.dot(layer1, weights12);
45+
*/
46+
/*
47+
var prediction = weight*input
48+
var delta = prediction - predictionGoal;
49+
result = result + delta * alpha * input;
50+
*/
51+
52+
var iterations = 60;
53+
for (var iteration = 0; iteration < iterations; iteration++)
54+
{
55+
for (var sampleId = 0; sampleId < streetLights.len; sampleId++)
56+
{
57+
var layer0 = streetLights[$"{sampleId}:{sampleId + 1}"];
58+
var layer1 = Relu(np.dot(layer0, weights01));
59+
var layer2 = np.dot(layer1, weights12);
60+
61+
var layer2Delta = stayOrWalk[$"{sampleId}:{sampleId + 1}"] - layer2;
62+
var layer1Delta = layer2Delta.dot(weights12.T) * ReluToDerivative(layer1);
63+
64+
weights12 = weights12 + alpha * layer1.T.dot(layer2Delta);
65+
weights01 = weights01 + alpha * layer0.T.dot(layer1Delta);
66+
67+
//weights12 += alpha * layer1.T.dot();
68+
}
69+
}
70+
71+
var resLayer0 = streetLights[$"{2}:{2 + 1}"];
72+
var resLayer1 = Relu(np.dot(resLayer0, weights01));
73+
var resLayer2 = np.dot(resLayer1, weights12);
74+
}
75+
}
76+
}

0 commit comments

Comments
 (0)