UNPKG

name-undecided

Version:
92 lines (91 loc) 4.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.NeuralNetwork = void 0; var Matrix_1 = require("./Matrix"); // Declare map functions function random(_x) { return Math.random(); } function dsigmoid(x) { return x * (1 - x); } function sigmoid(x) { return 1 / (1 + Math.exp(-x)); } function relu(x) { return x > 0 ? x : 0; } function squared(x) { return x * x; } var NeuralNetwork = /** @class */ (function () { function NeuralNetwork(inNum, hidNum, outNum, lr) { this.inputNum = inNum; this.hiddenNum = hidNum; this.outputNum = outNum; this.weightsIH = new Matrix_1.Matrix(this.hiddenNum, this.inputNum); this.weightsIH.map(random); this.weightsHO = new Matrix_1.Matrix(this.outputNum, this.hiddenNum); this.weightsHO.map(random); this.biasIH = new Matrix_1.Matrix(this.hiddenNum, 1); this.biasIH.map(random); this.biasHO = new Matrix_1.Matrix(this.outputNum, 1); this.biasHO.map(random); this.lr = lr; } NeuralNetwork.prototype.feedForward = function (inputs) { // Convert inputs into a Matrix object var inputsMatrix = Matrix_1.Matrix.fromArray(inputs, this.inputNum, 1); // Calculate the hidden layer output var hiddenInputs = Matrix_1.Matrix.mult(this.weightsIH, inputsMatrix); var hiddenOutputs = Matrix_1.Matrix.addMatrix(hiddenInputs, this.biasIH); var hiddenOutputsSigmoid = Matrix_1.Matrix.map(hiddenOutputs, sigmoid); // Calculate the output layer output var outputInputs = Matrix_1.Matrix.mult(this.weightsHO, hiddenOutputsSigmoid); var outputOutputs = Matrix_1.Matrix.addMatrix(outputInputs, this.biasHO); var outputOutputsSigmoid = Matrix_1.Matrix.map(outputOutputs, sigmoid); return outputOutputsSigmoid.toArray().reduce(function (accumulator, value) { return accumulator.concat(value); }, []); }; NeuralNetwork.prototype.train = function (inputs, targetsArr) { // Convert inputs into a Matrix object var inputsMatrix = Matrix_1.Matrix.fromArray(inputs, this.inputNum, 1); // Calculate the hidden layer output var hiddenInputs = Matrix_1.Matrix.mult(this.weightsIH, inputsMatrix); var hiddenOutputs = Matrix_1.Matrix.addMatrix(hiddenInputs, this.biasIH); var hiddenOutputsSigmoid = Matrix_1.Matrix.map(hiddenOutputs, sigmoid); // Calculate the output layer output var outputInputs = Matrix_1.Matrix.mult(this.weightsHO, hiddenOutputsSigmoid); var outputOutputs = Matrix_1.Matrix.addMatrix(outputInputs, this.biasHO); var outputOutputsSigmoid = Matrix_1.Matrix.map(outputOutputs, sigmoid); // Convert arrays to Matrix objects var outputs = outputOutputsSigmoid; var targets = Matrix_1.Matrix.fromArray(targetsArr, this.outputNum, 1); // Calculate the output errors var outputErrors = Matrix_1.Matrix.subMatrix(targets, outputs); // Calculate the gradient of the output errors var gradients = Matrix_1.Matrix.map(outputs, dsigmoid); gradients.hadamard(outputErrors); gradients.scale(this.lr); var hiddenTransposed = Matrix_1.Matrix.transpose(hiddenOutputsSigmoid); var weightsHODeltas = Matrix_1.Matrix.mult(gradients, hiddenTransposed); // Update the weights of the output layer this.weightsHO.addMatrix(weightsHODeltas); // Update the biases of the outpu layer this.biasHO.addMatrix(gradients); // Calculate the hidden errors var weightsHOTransposed = Matrix_1.Matrix.transpose(this.weightsHO); var hiddenErrors = Matrix_1.Matrix.mult(weightsHOTransposed, outputErrors); // Calculate the gradient of the hidden errors var hiddenGradients = Matrix_1.Matrix.map(hiddenOutputsSigmoid, dsigmoid); hiddenGradients.hadamard(hiddenErrors); hiddenGradients.scale(this.lr); var inputsTransposed = Matrix_1.Matrix.transpose(inputsMatrix); var weightsIHDeltas = Matrix_1.Matrix.mult(hiddenGradients, inputsTransposed); // Update the weights of the hidden layer this.weightsIH.addMatrix(weightsIHDeltas); // Update the biases of the hidden layer this.biasIH.addMatrix(hiddenGradients); }; return NeuralNetwork; }()); exports.NeuralNetwork = NeuralNetwork;