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)
149 lines • 4.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const Assertable_1 = require("./utils/Assertable");
const Mat_1 = require("./Mat");
class Graph extends Assertable_1.Assertable {
constructor(needsBackprop = true) {
super();
this.needsBackprop = needsBackprop;
this.backprop = new Array();
}
backward() {
for (let i = this.backprop.length - 1; i >= 0; i--) {
this.backprop[i]();
}
}
rowPluck(m, ix) {
const out = Mat_1.Mat.rowPluck(m, ix);
this.addRowPluckToBackprop(m, ix, out);
return out;
}
addRowPluckToBackprop(m, ix, out) {
if (this.needsBackprop) {
const backward = () => {
for (let i = 0; i < m.cols; i++) {
m.dw[m.cols * ix + i] += out.dw[i];
}
};
this.backprop.push(backward);
}
}
tanh(m) {
const out = Mat_1.Mat.tanh(m);
this.addTanhToBackprop(m, out);
return out;
}
addTanhToBackprop(m, out) {
if (this.needsBackprop) {
const backward = () => {
for (let i = 0; i < m.w.length; i++) {
const mwi = out.w[i];
m.dw[i] += (1.0 - mwi * mwi) * out.dw[i];
}
};
this.backprop.push(backward);
}
}
sigmoid(m) {
const out = Mat_1.Mat.sig(m);
this.addSigmoidToBackprop(m, out);
return out;
}
addSigmoidToBackprop(m, out) {
if (this.needsBackprop) {
const backward = () => {
for (let i = 0; i < m.w.length; i++) {
const mwi = out.w[i];
m.dw[i] += mwi * (1.0 - mwi) * out.dw[i];
}
};
this.backprop.push(backward);
}
}
relu(m) {
const out = Mat_1.Mat.relu(m);
this.addReluToBackprop(m, out);
return out;
}
addReluToBackprop(m, out) {
if (this.needsBackprop) {
const backward = () => {
for (let i = 0; i < m.w.length; i++) {
m.dw[i] += m.w[i] > 0 ? out.dw[i] : 0.0;
}
};
this.backprop.push(backward);
}
}
mul(m1, m2) {
const out = Mat_1.Mat.mul(m1, m2);
this.addMultiplyToBackprop(m1, m2, out);
return out;
}
addMultiplyToBackprop(m1, m2, out) {
if (this.needsBackprop) {
const backward = () => {
for (let i = 0; i < m1.rows; i++) {
for (let j = 0; j < m2.cols; j++) {
for (let k = 0; k < m1.cols; k++) {
const b = out.dw[m2.cols * i + j];
m1.dw[m1.cols * i + k] += m2.w[m2.cols * k + j] * b;
m2.dw[m2.cols * k + j] += m1.w[m1.cols * i + k] * b;
}
}
}
};
this.backprop.push(backward);
}
}
add(m1, m2) {
const out = Mat_1.Mat.add(m1, m2);
this.addAdditionToBackprop(m1, m2, out);
return out;
}
addAdditionToBackprop(m1, m2, out) {
if (this.needsBackprop) {
const backward = () => {
for (let i = 0; i < m1.w.length; i++) {
m1.dw[i] += out.dw[i];
m2.dw[i] += out.dw[i];
}
};
this.backprop.push(backward);
}
}
dot(m1, m2) {
const out = Mat_1.Mat.dot(m1, m2);
this.addDotToBackprop(m1, m2, out);
return out;
}
addDotToBackprop(m1, m2, out) {
if (this.needsBackprop) {
const backward = () => {
for (let i = 0; i < m1.w.length; i++) {
m1.dw[i] += m2.w[i] * out.dw[0];
m2.dw[i] += m1.w[i] * out.dw[0];
}
};
this.backprop.push(backward);
}
}
eltmul(m1, m2) {
const out = Mat_1.Mat.eltmul(m1, m2);
this.addEltmulToBackprop(m1, m2, out);
return out;
}
addEltmulToBackprop(m1, m2, out) {
if (this.needsBackprop) {
const backward = () => {
for (let i = 0; i < m1.w.length; i++) {
m1.dw[i] += m2.w[i] * out.dw[i];
m2.dw[i] += m1.w[i] * out.dw[i];
}
};
this.backprop.push(backward);
}
}
}
exports.Graph = Graph;
//# sourceMappingURL=Graph.js.map