network #1
36
index.html
36
index.html
@ -614,7 +614,7 @@ NN.Network.Create = function()
|
|||||||
var i;
|
var i;
|
||||||
|
|
||||||
obj.Layers = [];
|
obj.Layers = [];
|
||||||
obj.LearningRate = 0.8;
|
obj.LearningRate = 0.1;
|
||||||
obj.Error = [];
|
obj.Error = [];
|
||||||
|
|
||||||
for(i=0; i<arguments.length-1; i++)
|
for(i=0; i<arguments.length-1; i++)
|
||||||
@ -688,31 +688,33 @@ NN.Network.Stochastic = function(inNetwork, inTrainingSet, inIterations)
|
|||||||
];
|
];
|
||||||
|
|
||||||
let matrix2 = [
|
let matrix2 = [
|
||||||
[0.5793881115472015, 0.9732593374796092, 0.15207639877016987, -0.5356575655337803]
|
[0.7098703863463034, 0.35485944251238033, 0.7642849892333241, 0.03046174288491077],
|
||||||
|
[-0.30655426258144347, 0.45509633551425077, -0.5013795222004322, -0.3421292736637427]
|
||||||
];
|
];
|
||||||
|
|
||||||
let typeA = [
|
let input = [
|
||||||
[ 0.1, 0.05],
|
[ 0.1, 0.05],
|
||||||
[ 0.0, -0.06]
|
[ 0.0, -0.06],
|
||||||
];
|
|
||||||
let typeB = [
|
|
||||||
[ 0.99, 0.85],
|
[ 0.99, 0.85],
|
||||||
[ 1.2, 1.05]
|
[ 1.2, 1.05]
|
||||||
];
|
];
|
||||||
let goals = [
|
let output = [
|
||||||
[1, 1, 0],
|
[1, 0],
|
||||||
[0, 0, 1]
|
[1, 0],
|
||||||
|
[0, 1],
|
||||||
|
[0, 1]
|
||||||
];
|
];
|
||||||
|
|
||||||
var layer1 = NN.Layer.Create(1, 1);
|
let nn1 = NN.Network.Create(2, 3, 2);
|
||||||
layer1.Forward.Matrix = matrix1;
|
nn1.Layers[0].Forward.Matrix = matrix1;
|
||||||
|
nn1.Layers[1].Forward.Matrix = matrix2;
|
||||||
|
|
||||||
let stage1 = NN.Layer.Forward(layer1, typeA);
|
let logLayers = inNN => inNN.Layers.forEach(L=>console.log(L.Forward.Matrix));
|
||||||
let stage1Error = NN.Layer.Error(layer1, goals);
|
|
||||||
let stage1Back = NN.Layer.Backward(layer1, stage1Error);
|
|
||||||
|
|
||||||
console.log("matrix before", layer1.Forward.Matrix);
|
logLayers(nn1);
|
||||||
NN.Layer.Adjust(layer1, 0.1);
|
|
||||||
console.log("matrix after", layer1.Forward.Matrix);
|
NN.Network.Batch(nn1, {Input:input, Output:output}, 100);
|
||||||
|
|
||||||
|
logLayers(nn1);
|
||||||
|
|
||||||
</script>
|
</script>
|
65
nn.test.js
65
nn.test.js
@ -26,48 +26,62 @@ Deno.test("check.forward", ()=>
|
|||||||
];
|
];
|
||||||
|
|
||||||
let matrix2 = [
|
let matrix2 = [
|
||||||
[0.5793881115472015, 0.9732593374796092, 0.15207639877016987, -0.5356575655337803]
|
[0.7098703863463034, 0.35485944251238033, 0.7642849892333241, 0.03046174288491077],
|
||||||
|
[-0.30655426258144347, 0.45509633551425077, -0.5013795222004322, -0.3421292736637427]
|
||||||
];
|
];
|
||||||
|
|
||||||
let typeA = [
|
let input = [
|
||||||
[ 0.1, 0.05],
|
[ 0.1, 0.05],
|
||||||
[ 0.0, -0.06]
|
[ 0.0, -0.06],
|
||||||
];
|
|
||||||
let typeB = [
|
|
||||||
[ 0.99, 0.85],
|
[ 0.99, 0.85],
|
||||||
[ 1.2, 1.05]
|
[ 1.2, 1.05]
|
||||||
];
|
];
|
||||||
let goals = [
|
let output = [
|
||||||
[1, 1, 0],
|
[1, 0],
|
||||||
[0, 0, 1]
|
[1, 0],
|
||||||
|
[0, 1],
|
||||||
|
[0, 1]
|
||||||
];
|
];
|
||||||
|
|
||||||
let layers = [matrix1];
|
let layers = [matrix1, matrix2];
|
||||||
let stages = Forward(Methods.Mutate.Pad(typeA), layers);
|
console.log("BEFORE", layers);
|
||||||
Backward(stages, layers, goals, 0.1);
|
for(let i=0; i<100; i++)
|
||||||
|
{
|
||||||
|
let stages = Forward(Methods.Mutate.Pad(input), layers);
|
||||||
|
Backward(stages, layers, output, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("AFTER", layers);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Deno.test("NN.Label", ()=>
|
Deno.test("NN.Label", ()=>
|
||||||
{
|
{
|
||||||
Label(training, typeA, [1]);
|
Label(training, typeA, [1, 0]);
|
||||||
Label(training, typeB, [0]);
|
Label(training, typeB, [0, 1]);
|
||||||
stages.push(training[0]);
|
|
||||||
console.log(training);
|
|
||||||
assertEquals(training.length, 2, "input and output sets created");
|
assertEquals(training.length, 2, "input and output sets created");
|
||||||
assertEquals(training[0].length, training[1].length, "both sets have same length");
|
assertEquals(training[0].length, training[1].length, "both sets have same length");
|
||||||
assertEquals(training[0][0].length, 3, "padded input component");
|
assertEquals(training[0][0].length, 3, "padded input component");
|
||||||
assertEquals(training[1][0].length, 1, "unchanged label vector");
|
assertEquals(training[1][0].length, 2, "unchanged label vector");
|
||||||
|
});
|
||||||
|
|
||||||
|
Deno.test("NN.Forward", ()=>
|
||||||
|
{
|
||||||
|
let layer1 = M.Create.Box([-1, -1, -1], [1, 1, 1], 2);
|
||||||
|
let layer2 = M.Create.Box([-1, -1, -1], [1, 1, 1], 1);
|
||||||
|
layers.push(layer1);
|
||||||
|
layers.push(layer2);
|
||||||
|
|
||||||
|
console.log(training[0]);
|
||||||
|
stages = Forward(training[0], layers);
|
||||||
|
console.log(stages);
|
||||||
});
|
});
|
||||||
|
|
||||||
Deno.test("NN.Backward", ()=>
|
Deno.test("NN.Backward", ()=>
|
||||||
{
|
{
|
||||||
let layer1 = M.Create.Box([-1, -1, -1], [1, 1, 1], 2);
|
let copy1 = M.Create.Clone(layers[0]);
|
||||||
let layer2 = M.Create.Box([-1, -1, -1], [1, 1, 1], 1);
|
let copy2 = M.Create.Clone(layers[1]);
|
||||||
let copy1 = M.Create.Clone(layer1);
|
|
||||||
let copy2 = M.Create.Clone(layer2);
|
|
||||||
layers.push(layer1);
|
|
||||||
layers.push(layer2);
|
|
||||||
|
|
||||||
for(let i=0; i<100; i++)
|
for(let i=0; i<100; i++)
|
||||||
{
|
{
|
||||||
@ -79,11 +93,10 @@ Deno.test("NN.Backward", ()=>
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
Deno.test("NN.Forward", ()=>
|
Deno.test("NN.Label", ()=>
|
||||||
{
|
{
|
||||||
console.log(Forward(stages, layers));
|
let stages = Forward(training[0], layers);
|
||||||
console.log(training[1]);
|
console.log(stages[stages.length-1]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
3
nn.ts
3
nn.ts
@ -41,15 +41,12 @@ const Backward = (inStages:N, inLayers:N, inGoals:Cloud.M, inRate:number):N =>
|
|||||||
let errorScaled:Cloud.M = M.Batch.Multiply(errorBack, M.Batch.Derivative(layerOutput));
|
let errorScaled:Cloud.M = M.Batch.Multiply(errorBack, M.Batch.Derivative(layerOutput));
|
||||||
|
|
||||||
errorBack = M.Batch.Affine(errorScaled, M.Create.Transpose(inLayers[i]));
|
errorBack = M.Batch.Affine(errorScaled, M.Create.Transpose(inLayers[i]));
|
||||||
console.log("matrix before:", inLayers[i]);
|
|
||||||
|
|
||||||
errorScaled.forEach((inScaledError:Cloud.V, inIndex:number)=> {
|
errorScaled.forEach((inScaledError:Cloud.V, inIndex:number)=> {
|
||||||
const deltas = M.Batch.Scale(M.Create.Outer(layerInput[inIndex], inScaledError), inRate);
|
const deltas = M.Batch.Scale(M.Create.Outer(layerInput[inIndex], inScaledError), inRate);
|
||||||
inLayers[i] = M.Batch.Subtract(inLayers[i], deltas);
|
inLayers[i] = M.Batch.Subtract(inLayers[i], deltas);
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("matrix after:", inLayers[i]);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return inLayers;
|
return inLayers;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user