UNPKG

layerganza

Version:

A feed-forward neural network with injectable layers, activation functions, and optimizers.

61 lines (60 loc) 2.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); class Network { constructor(layers) { this.learningTimeStep = 0; if (layers.length !== 3) { throw new Error('Having more or less than 1 hidden layer is not yet supported.'); } this.inputLayer = layers[0]; this.hiddenLayer = layers[1]; this.hiddenLayer.setInputLayer(this.inputLayer); this.outputLayer = layers[2]; this.outputLayer.setInputLayer(this.hiddenLayer); this.hiddenLayer.setOutputLayer(this.outputLayer); } invoke(inputs) { // for (let i = 0, len = inputs.length; i < len; i++) { // if (!isFinite(inputs[i])) { // throw new Error('Neural network input is not a finite number.'); // } // } this.inputLayer.feedForward(inputs); this.hiddenLayer.feedForward(); let outputs = this.outputLayer.feedForward(); //@TODO disable or put in debug mode for (let i = 0, len = outputs.length; i < len; i++) { if (!isFinite(outputs[i])) { throw new Error('Neural network output is not a finite number.'); } } return outputs; } learn(targetOutputs) { this.learningTimeStep++; this.outputLayer.backPropagateCalculateErrorGradient(targetOutputs); this.hiddenLayer.backPropagateCalculateErrorGradient(); this.outputLayer.backPropagateOptimize(this.learningTimeStep); this.hiddenLayer.backPropagateOptimize(this.learningTimeStep); } loadFromJson(json) { let weights = json.layers[1].weights; for (let i = 0; i < weights.length; i++) { //@TODO do this inside the layers this.hiddenLayer.weights[i] = weights[i]; } weights = json.layers[2].weights; for (let i = 0; i < weights.length; i++) { //@TODO do this inside the layers this.outputLayer.weights[i] = weights[i]; } } saveToJson() { return { layers: [ {}, { weights: Array.from(this.hiddenLayer.weights) }, { weights: Array.from(this.outputLayer.weights) } //@TODO do this inside the layers ] }; //@TODO do this inside the layers } } exports.default = Network;