Nework added
This commit is contained in:
parent
ffb8305617
commit
0d06d9e158
51
m.ts
51
m.ts
@ -1,15 +1,18 @@
|
|||||||
export type V = Array<number>;
|
export namespace Cloud
|
||||||
export type M = Array<V>;
|
{
|
||||||
export type HandleLoop = (indexComponent:number, indexRow:number, array:Array<number>) => number;
|
export type V = Array<number>
|
||||||
export type HandleEdit = (component:number, index:number, array:Array<number>) => number;
|
export type M = Array<Array<number>>
|
||||||
|
export type HandleLoop = (indexComponent:number, indexRow:number, array:Array<number>) => number
|
||||||
|
export type HandleEdit = (component:number, index:number, array:Array<number>) => number
|
||||||
|
};
|
||||||
|
|
||||||
const Methods = {
|
const Methods = {
|
||||||
Iterate:
|
Iterate:
|
||||||
{
|
{
|
||||||
Loop: (inDimensions:number, inCount:number, inFunction:HandleLoop):M =>
|
Loop: (inDimensions:number, inCount:number, inFunction:Cloud.HandleLoop):Cloud.M =>
|
||||||
{
|
{
|
||||||
let i:number, j:number, outputVector:V;
|
let i:number, j:number, outputVector:Cloud.V;
|
||||||
const outputCloud:M = [];
|
const outputCloud:Cloud.M = [];
|
||||||
for(i=0; i<inCount; i++)
|
for(i=0; i<inCount; i++)
|
||||||
{
|
{
|
||||||
outputVector = [];
|
outputVector = [];
|
||||||
@ -21,35 +24,37 @@ const Methods = {
|
|||||||
}
|
}
|
||||||
return outputCloud;
|
return outputCloud;
|
||||||
},
|
},
|
||||||
Edit: (inCloud:M, inFunction:HandleEdit):M=> inCloud.map((row:V):V=>row.map(inFunction))
|
Edit: (inCloud:Cloud.M, inFunction:Cloud.HandleEdit):Cloud.M=> inCloud.map((row:Cloud.V):Cloud.V=>row.map(inFunction))
|
||||||
},
|
},
|
||||||
Create:
|
Create:
|
||||||
{
|
{
|
||||||
Box: (inV1:V, inV2:V, inCount:number):M=> Methods.Iterate.Loop(inV1.length, inCount, i=> inV1[i]+(inV2[i]-inV1[i])*Math.random()),
|
Box: (inV1:Cloud.V, inV2:Cloud.V, inCount:number):Cloud.M=> Methods.Iterate.Loop(inV1.length, inCount, i=> inV1[i]+(inV2[i]-inV1[i])*Math.random()),
|
||||||
Transpose: (inCloud:M):M=> Methods.Iterate.Loop(inCloud.length, inCloud[0].length, (i, row)=> inCloud[i][row]),
|
Transpose: (inCloud:Cloud.M):Cloud.M=> Methods.Iterate.Loop(inCloud.length, inCloud[0].length, (i, row)=> inCloud[i][row]),
|
||||||
Outer: (inV1:V, inV2:V):M=> Methods.Iterate.Loop(inV1.length, inV2.length, (i, row)=> inV1[i]*inV2[row]),
|
Outer: (inV1:Cloud.V, inV2:Cloud.V):Cloud.M=> Methods.Iterate.Loop(inV1.length, inV2.length, (i, row)=> inV1[i]*inV2[row]),
|
||||||
Clone: (inCloud:M):M=> Methods.Iterate.Edit(inCloud, i=> i)
|
Clone: (inCloud:Cloud.M):Cloud.M=> Methods.Iterate.Edit(inCloud, i=> i)
|
||||||
},
|
},
|
||||||
Mutate:
|
Mutate:
|
||||||
{
|
{
|
||||||
Pad: (inCloud:M):void=> inCloud.forEach(row=> row.push(1)),
|
Pad: (inCloud:Cloud.M):Cloud.M=> {inCloud.forEach((row:Cloud.V)=> row.push(1)); return inCloud; },
|
||||||
Unpad: (inCloud:M):void=> inCloud.forEach(row=> row.pop())
|
Unpad: (inCloud:Cloud.M):Cloud.M=> {inCloud.forEach((row:Cloud.V)=> row.pop()); return inCloud; }
|
||||||
},
|
},
|
||||||
Single:
|
Single:
|
||||||
{
|
{
|
||||||
Subtract: (inV1:V, inV2:V):V=> inV1.map((component, i)=> component-inV2[i]),
|
Subtract: (inV1:Cloud.V, inV2:Cloud.V):Cloud.V=> inV1.map((component, i)=> component-inV2[i]),
|
||||||
Multiply: (inV1:V, inV2:V):V=> inV1.map((component, i)=> component*inV2[i]),
|
Multiply: (inV1:Cloud.V, inV2:Cloud.V):Cloud.V=> inV1.map((component, i)=> component*inV2[i]),
|
||||||
Affine: (inV:V, inMatrix:M):V=> inMatrix.map(row=> row.reduce((sum, current, index)=> sum + current*inV[index]))
|
Affine: (inV:Cloud.V, inMatrix:Cloud.M):Cloud.V=> inMatrix.map((row:Cloud.V)=> row.reduce((sum, current, index)=> sum + current*inV[index]))
|
||||||
},
|
},
|
||||||
Batch:
|
Batch:
|
||||||
{
|
{
|
||||||
Subtract: (inCloud1:M, inCloud2:M):M=> inCloud1.map((row, rowIndex)=> Methods.Single.Subtract(row, inCloud2[rowIndex])),
|
Subtract: (inCloud1:Cloud.M, inCloud2:Cloud.M):Cloud.M=> inCloud1.map((row:Cloud.V, rowIndex:number)=> Methods.Single.Subtract(row, inCloud2[rowIndex])),
|
||||||
Multiply: (inCloud1:M, inCloud2:M):M=> inCloud1.map((row, rowIndex)=> Methods.Single.Multiply(row, inCloud2[rowIndex])),
|
Multiply: (inCloud1:Cloud.M, inCloud2:Cloud.M):Cloud.M=> inCloud1.map((row:Cloud.V, rowIndex:number)=> Methods.Single.Multiply(row, inCloud2[rowIndex])),
|
||||||
Affine: (inCloud:M, inMatrix:M):M=> inCloud.map(row=> Methods.Single.Affine(row, inMatrix)),
|
Affine: (inCloud1:Cloud.M, inCloud2:Cloud.M):Cloud.M=> inCloud1.map((row:Cloud.V)=> Methods.Single.Affine(row, inCloud2)),
|
||||||
Sigmoid: (inCloud:M):M=> Methods.Iterate.Edit(inCloud, i=>1/(1+Math.pow(Math.E, -i))),
|
Sigmoid: (inCloud:Cloud.M):Cloud.M=> Methods.Iterate.Edit(inCloud, i=>1/(1+Math.pow(Math.E, -i))),
|
||||||
Derivative: (inCloud:M):M=> Methods.Iterate.Edit(inCloud, i=>i*(1-i)),
|
Derivative: (inCloud:Cloud.M):Cloud.M=> Methods.Iterate.Edit(inCloud, i=>i*(1-i)),
|
||||||
Scale: (inCloud:M, inScalar:number):M=> Methods.Iterate.Edit(inCloud, i=>i*inScalar)
|
Scale: (inCloud:Cloud.M, inScalar:number):Cloud.M=> Methods.Iterate.Edit(inCloud, i=>i*inScalar)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export default Methods;
|
export default Methods;
|
14
nn.test.js
Normal file
14
nn.test.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import { assert, assertEquals } from "https://deno.land/std@0.102.0/testing/asserts.ts";
|
||||||
|
import * as NN from "./nn.ts";
|
||||||
|
|
||||||
|
Deno.test("NN.Observe", ()=>
|
||||||
|
{
|
||||||
|
console.log(NN.Observe([[[1, 2, 3]]], [[[0.4, 0.5, 0.6]]]));
|
||||||
|
});
|
||||||
|
Deno.test("NN.Train", ()=>
|
||||||
|
{
|
||||||
|
const stages = [[[1, 2, 3]]];
|
||||||
|
const layers = [[[0.4, 0.5, 0.6]]];
|
||||||
|
|
||||||
|
console.log(NN.Train(stages, layers, [[0, 0, 1]], 0.1));
|
||||||
|
});
|
36
nn.ts
Normal file
36
nn.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import { default as M, Cloud } from "./m.ts";
|
||||||
|
|
||||||
|
const Observe = (inStages:Array<Cloud.M>, inLayers:Array<Cloud.M>):Cloud.M =>
|
||||||
|
{
|
||||||
|
let i:number;
|
||||||
|
let process = (index:number):Cloud.M => M.Batch.Sigmoid(M.Batch.Affine(inStages[index], inLayers[index]));
|
||||||
|
|
||||||
|
for(i=0; i<inLayers.length-1; i++)
|
||||||
|
{
|
||||||
|
inStages[i+1] = M.Mutate.Pad(process(i));
|
||||||
|
}
|
||||||
|
inStages[i+1] = process(i);
|
||||||
|
return inStages[i+1];
|
||||||
|
};
|
||||||
|
const Train = (inStages:Array<Cloud.M>, inLayers:Array<Cloud.M>, inGoals:Cloud.M, inRate:number):void =>
|
||||||
|
{
|
||||||
|
let i:number;
|
||||||
|
let errorBack:Cloud.M = M.Batch.Subtract(Observe(inStages, inLayers), inGoals);
|
||||||
|
|
||||||
|
for(i=inLayers.length-1; i>=0; i++)
|
||||||
|
{
|
||||||
|
let layerMatrix:Cloud.M = inLayers[i];
|
||||||
|
let layerInput:Cloud.M = inStages[i];
|
||||||
|
let layerOutput:Cloud.M = inStages[i+1];
|
||||||
|
let errorScaled:Cloud.M = M.Batch.Multiply(errorBack, M.Batch.Derivative(layerOutput));
|
||||||
|
|
||||||
|
errorBack = M.Batch.Affine(errorScaled, M.Create.Transpose(layerMatrix));
|
||||||
|
errorScaled.forEach((inScaledError:Cloud.V, inIndex:number)=> {
|
||||||
|
const deltas = M.Batch.Scale(M.Create.Outer(layerInput[inIndex], inScaledError), inRate);
|
||||||
|
layerMatrix = M.Batch.Subtract(layerMatrix, deltas);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export { Observe, Train };
|
||||||
|
export type { Cloud };
|
Loading…
Reference in New Issue
Block a user