name-undecided
Version:
A toy Neural Network library.
92 lines (91 loc) • 4.43 kB
JavaScript
"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;