Guest User

Untitled

a guest
Jul 31st, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function sigmoid(x) {
  2.   return 1 / (1 + Math.exp(-x));
  3. }
  4.  
  5. function dsigmoid(y) {
  6.   //return sigmoid(x) * (1 - sigmoid(x));
  7.   return y * (1 - y);
  8. }
  9.  
  10. class NeuralNetwork {
  11.  
  12.   // hiddenLayersConfiguration is an object =
  13.   // {numberOfLayers: number, nodesPerLayer: number}
  14.   constructor(inputNodes, hiddenLayers, outputNodes, learningRate) {
  15.     this.inputNodes = inputNodes;
  16.     this.hiddenLayers = hiddenLayers;
  17.     this.outputNodes = outputNodes;
  18.  
  19.     this.weights = this.setupWeights();
  20.     this.biases = this.setupBiases();
  21.     this.learningRate = learningRate;
  22.   }
  23.  
  24.   setupWeights() {
  25.     let weights = new Array();
  26.     weights.push(new Matrix(this.hiddenLayers.nodesPerLayer, this.inputNodes));
  27.  
  28.     for (let i = 0; i < this.hiddenLayers.numberOfLayers - 1; i++) {
  29.       weights.push(new Matrix(this.hiddenLayers.nodesPerLayer, this.hiddenLayers.nodesPerLayer));
  30.     }
  31.  
  32.     weights.push(new Matrix(this.outputNodes, this.hiddenLayers.nodesPerLayer));
  33.  
  34.     for (let i = 0; i < weights.length; i++) {
  35.       weights[i].randomize();
  36.     }
  37.  
  38.     return weights;
  39.   }
  40.  
  41.   setupBiases() {
  42.     let biases = new Array();
  43.     biases.push(new Matrix(this.hiddenLayers.nodesPerLayer, 1));
  44.  
  45.     for (let i = 0; i < this.hiddenLayers.numberOfLayers - 1; i++) {      
  46.       biases.push(new Matrix(this.hiddenLayers.nodesPerLayer, 1));
  47.     }
  48.  
  49.     biases.push(new Matrix(this.outputNodes, 1));
  50.  
  51.     for (let i = 0; i < biases.length; i++) {
  52.       biases[i].randomize();
  53.     }
  54.  
  55.     return biases;
  56.   }
  57.  
  58.   guess(inputArray) {
  59.     let current = Matrix.fromArray(inputArray);
  60.     for (let i = 0; i < this.weights.length; i++) {
  61.       current = Matrix.multiply(this.weights[i], current);
  62.       current.add(this.biases[i]);
  63.       current.map(sigmoid);
  64.     }
  65.  
  66.     return current.toArray();
  67.   }
  68.  
  69.   feedFoward(inputArray) {
  70.     let steps = new Array();
  71.     let current = Matrix.fromArray(inputArray);
  72.     steps.push(current);
  73.     for (let i = 0; i < this.weights.length; i++) {
  74.       current = Matrix.multiply(this.weights[i], current);
  75.       current.add(this.biases[i]);
  76.       current.map(sigmoid);
  77.       steps.push(current);
  78.     }
  79.  
  80.     return steps;
  81.   }
  82.  
  83.   train(inputArray, targetArray) {
  84.     let steps = this.feedFoward(inputArray);
  85.     let targets = Matrix.fromArray(targetArray);
  86.     let errors = null;
  87.     let gradient = null;
  88.     let deltas = null;
  89.  
  90.     for (let i = steps.length - 1 ; i >= 1; i--) {
  91.       // Calculates error
  92.       if (i != steps.length - 1) {
  93.         targets = Matrix.transpose(this.weights[i]);
  94.         errors = Matrix.multiply(targets, errors);
  95.       } else {
  96.         errors = Matrix.subtract(targets, steps[i]);
  97.       }      
  98.  
  99.       // Calculates gradient
  100.       gradient = Matrix.map(steps[i], dsigmoid);
  101.       gradient.multiply(errors);
  102.       gradient.multiply(this.learningRate);
  103.  
  104.       // Calculate deltas
  105.       let transposed = Matrix.transpose(steps[i - 1]);
  106.       deltas = Matrix.multiply(gradient, transposed);
  107.  
  108.       // Adjust weights
  109.       this.weights[i - 1].add(deltas);
  110.       this.biases[i - 1].add(gradient);
  111.     }
  112.   }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment