recurrent-js-gpu
Version:
GPU-accelerated Deep Recurrent Neural Networks and LSTMs in Typescript. Ported, object-oriented and refactored version of Andrej Karpathy's recurrent-js (https://github.com/karpathy/recurrentjs)
46 lines • 2.13 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const RandMat_1 = require("./RandMat");
const Mat_1 = require("./Mat");
const NNModel_1 = require("./NNModel");
class RNN extends NNModel_1.NNModel {
constructor(inputSize, hiddenSizes, outputSize, needsBackProp = true) {
super(needsBackProp);
this.hiddenSizes = hiddenSizes;
let hiddenSize;
for (let d = 0; d < this.hiddenSizes.length; d++) {
const previousSize = d === 0 ? inputSize : this.hiddenSizes[d - 1];
hiddenSize = this.hiddenSizes[d];
this.model.hiddenWx[d] = new RandMat_1.RandMat(hiddenSize, previousSize, 0, 0.08);
this.model.hiddenWh[d] = new RandMat_1.RandMat(hiddenSize, hiddenSize, 0, 0.08);
this.model.hiddenbh[d] = new Mat_1.Mat(hiddenSize, 1);
}
this.model.decoderWh = new RandMat_1.RandMat(outputSize, hiddenSize, 0, 0.08);
this.model.decoderbd = new Mat_1.Mat(outputSize, 1);
}
forward(observations, previousOutput, graph = this.graph) {
let hiddenPrevs;
if (typeof previousOutput.h === 'undefined') {
hiddenPrevs = [];
for (let d = 0; d < this.hiddenSizes.length; d++) {
hiddenPrevs.push(new Mat_1.Mat(this.hiddenSizes[d], 1));
}
}
else {
hiddenPrevs = previousOutput.h;
}
const hidden = new Array();
for (let d = 0; d < this.hiddenSizes.length; d++) {
const inputVector = d === 0 ? observations : hidden[d - 1];
const hiddenPrev = hiddenPrevs[d];
const h0 = graph.mul(this.model.hiddenWx[d], inputVector);
const h1 = graph.mul(this.model.hiddenWh[d], hiddenPrev);
const hiddenD = graph.relu(graph.add(graph.add(h0, h1), this.model.hiddenbh[d]));
hidden.push(hiddenD);
}
const output = graph.add(graph.mul(this.model.decoderWh, hidden[hidden.length - 1]), this.model.decoderbd);
return { 'h': hidden, 'o': output, 'c': null };
}
}
exports.RNN = RNN;
//# sourceMappingURL=RNN.js.map