Skip to content

deepbox

Quick Start

Four short programs that cover tensors and autograd, training a network, classical machine learning and DataFrames. Each one runs as written.

Tensors and autograd

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.

tensors.ts
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); // false

Train a neural network

Training 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.

train.ts
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());}

Classical machine learning

Estimators follow the scikit-learn pattern: fit, predict and score.

classify.ts
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)));

DataFrames

dataframe.ts
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());

Next steps