UNPKG

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
"use strict"; 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