deepbox
Quick Start
Four short programs that cover tensors and autograd, training a network, classical machine learning and DataFrames. Each one runs as written.
Tensor and GradTensor share one method surface, so operations chain the way they do in PyTorch. The functional form, such as add(a, b), still works. tensor() creates float32 data by default.
import { noGrad, parameter, tensor } from "deepbox/ndarray"; const t = tensor([ [1, 2], [3, 4],]);console.log(t.add(1).mul(2).sum().item()); // 28console.log(t.T.toString());console.log(t.argmax(1).toString()); // int32 indicesconsole.log(t.mean().item()); // 2.5 // parameter() creates a tensor that records operations for backward().const x = parameter([ [1, 2], [3, 4],]);const w = parameter([[0.5], [0.25]]);const y = x.matmul(w).sum();y.backward();console.log(x.grad?.toString());console.log(w.grad?.toString()); // noGrad() turns tracking off for everything computed inside it.const pred = noGrad(() => x.matmul(w));console.log(pred.requiresGrad); // falseTraining data stays in plain tensors. When gradient tracking is on and a module has trainable parameters, model.forward(x) returns a GradTensor that tracks the weights. Calling loss.backward() then fills the gradients the optimizer reads, and loss.item() returns the loss as a number.
import { tensor } from "deepbox/ndarray";import { Linear, mseLoss, ReLU, Sequential } from "deepbox/nn";import { Adam } from "deepbox/optim";import { setSeed } from "deepbox/random"; setSeed(42); // Learn y = x1 + 2 * x2 from four points.const X = tensor([ [0, 0], [0, 1], [1, 0], [1, 1],]);const y = tensor([[0], [2], [1], [3]]); const model = new Sequential(new Linear(2, 16), new ReLU(), new Linear(16, 1));const optimizer = new Adam(model.parameters(), { lr: 0.01 }); for (let epoch = 0; epoch < 200; epoch++) { optimizer.zeroGrad(); const loss = mseLoss(model.forward(X), y); loss.backward(); optimizer.step(); if (epoch % 50 === 0 || epoch === 199) console.log(epoch, loss.item());}Estimators follow the scikit-learn pattern: fit, predict and score.
import { loadIris } from "deepbox/datasets";import { accuracy } from "deepbox/metrics";import { RandomForestClassifier } from "deepbox/ml";import { trainTestSplit } from "deepbox/preprocess"; const { data, target } = loadIris();const [XTrain, XTest, yTrain, yTest] = trainTestSplit(data, target, { testSize: 0.25, randomState: 42,}); const model = new RandomForestClassifier({ nEstimators: 50, randomState: 42 });model.fit(XTrain, yTrain); console.log(accuracy(yTest, model.predict(XTest)));import { DataFrame } from "deepbox/dataframe"; const df = new DataFrame({ name: ["Alice", "Bob", "Charlie"], team: ["A", "A", "B"], score: [91, 84, 96],}); console.log(df.groupBy("team").mean().toString());console.log(df.filter((row) => Number(row.score) > 90).toString());Found a mistake? Open an issue.