RustX commited on
Commit
840eb45
1 Parent(s): 763ea77

Create network.js

Browse files
Files changed (1) hide show
  1. network.js +87 -0
network.js ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class NeuralNetwork{
2
+ constructor(neuronCounts){
3
+ this.levels=[];
4
+ for(let i=0;i<neuronCounts.length-1;i++){
5
+ this.levels.push(new Level(
6
+ neuronCounts[i],neuronCounts[i+1]
7
+ ));
8
+ }
9
+ }
10
+
11
+ static feedForward(givenInputs,network){
12
+ let outputs=Level.feedForward(
13
+ givenInputs,network.levels[0]);
14
+ for(let i=1;i<network.levels.length;i++){
15
+ outputs=Level.feedForward(
16
+ outputs,network.levels[i]);
17
+ }
18
+ return outputs;
19
+ }
20
+
21
+ static mutate(network,amount=1){
22
+ network.levels.forEach(level => {
23
+ for(let i=0;i<level.biases.length;i++){
24
+ level.biases[i]=lerp(
25
+ level.biases[i],
26
+ Math.random()*2-1,
27
+ amount
28
+ )
29
+ }
30
+ for(let i=0;i<level.weights.length;i++){
31
+ for(let j=0;j<level.weights[i].length;j++){
32
+ level.weights[i][j]=lerp(
33
+ level.weights[i][j],
34
+ Math.random()*2-1,
35
+ amount
36
+ )
37
+ }
38
+ }
39
+ });
40
+ }
41
+ }
42
+
43
+ class Level{
44
+ constructor(inputCount,outputCount){
45
+ this.inputs=new Array(inputCount);
46
+ this.outputs=new Array(outputCount);
47
+ this.biases=new Array(outputCount);
48
+
49
+ this.weights=[];
50
+ for(let i=0;i<inputCount;i++){
51
+ this.weights[i]=new Array(outputCount);
52
+ }
53
+
54
+ Level.#randomize(this);
55
+ }
56
+
57
+ static #randomize(level){
58
+ for(let i=0;i<level.inputs.length;i++){
59
+ for(let j=0;j<level.outputs.length;j++){
60
+ level.weights[i][j]=Math.random()*2-1;
61
+ }
62
+ }
63
+
64
+ for(let i=0;i<level.biases.length;i++){
65
+ level.biases[i]=Math.random()*2-1;
66
+ }
67
+ }
68
+
69
+ static feedForward(givenInputs,level){
70
+ level.inputs=[...givenInputs];
71
+
72
+ for(let i=0;i<level.outputs.length;i++){
73
+ let sum=0
74
+ for(let j=0;j<level.inputs.length;j++){
75
+ sum+=level.inputs[j]*level.weights[j][i];
76
+ }
77
+
78
+ if(sum>level.biases[i]){
79
+ level.outputs[i]=1;
80
+ }else{
81
+ level.outputs[i]=0;
82
+ }
83
+ }
84
+
85
+ return level.outputs;
86
+ }
87
+ }