30
Tensors
Neural Networks
Normalization & Dropout Layers
Demonstrates BatchNorm1d, LayerNorm, and Dropout for training stability and regularization. This example uses deepbox/ndarray, deepbox/nn and focuses on tensor, GradTensor; BatchNorm1d, LayerNorm, Dropout.
Deepbox Modules Used
deepbox/ndarraydeepbox/nnWhat You Will Learn
- Use deepbox/ndarray for tensor, GradTensor.
- Use deepbox/nn for BatchNorm1d, LayerNorm, Dropout.
- Demonstrates BatchNorm1d, LayerNorm, and Dropout for training stability and regularization.
Source Files
index.ts
1/**2 * Example 30: Normalization & Dropout Layers3 *4 * Demonstrates BatchNorm1d, LayerNorm, and Dropout for training stability5 * and regularization. These layers are essential for deep network training.6 */78import { GradTensor, tensor } from "deepbox/ndarray";9import { BatchNorm1d, Dropout, LayerNorm } from "deepbox/nn";1011console.log("=== Normalization & Dropout Layers ===\n");1213// ---------------------------------------------------------------------------14// Part 1: BatchNorm1d — Normalize over the batch dimension15// ---------------------------------------------------------------------------16console.log("--- Part 1: BatchNorm1d ---");1718// BatchNorm1d(numFeatures) — normalizes each feature across the batch19const bn = new BatchNorm1d(3);20console.log("BatchNorm1d(numFeatures=3)");21console.log(" Formula: y = (x - E[x]) / sqrt(Var[x] + eps) * gamma + beta\n");2223// Input shape: (batch, features)24const bnInput = tensor([25 [10, 20, 30],26 [11, 22, 28],27 [9, 18, 32],28 [12, 21, 29],29]);30console.log(`Input shape: [${bnInput.shape.join(", ")}]`);31console.log(`Input:\n${bnInput.toString()}`);3233// Training mode: uses batch statistics34bn.train();35const bnOut = bn.forward(bnInput);36const bnTensor = bnOut instanceof GradTensor ? bnOut.tensor : bnOut;37console.log(`\nOutput (training mode): shape [${bnTensor.shape.join(", ")}]`);38console.log(" Uses batch mean/variance, updates running statistics\n");3940// Eval mode: uses running statistics41bn.eval();42const bnEvalOut = bn.forward(bnInput);43const bnEvalTensor = bnEvalOut instanceof GradTensor ? bnEvalOut.tensor : bnEvalOut;44console.log(`Output (eval mode): shape [${bnEvalTensor.shape.join(", ")}]`);45console.log(" Uses accumulated running mean/variance\n");4647// ---------------------------------------------------------------------------48// Part 2: LayerNorm — Normalize over the feature dimension49// ---------------------------------------------------------------------------50console.log("--- Part 2: LayerNorm ---");5152// LayerNorm normalizes over the last dimension(s)53const ln = new LayerNorm(3);54console.log("LayerNorm(normalizedShape=3)");55console.log(" Normalizes each sample independently across features\n");5657const lnOut = ln.forward(bnInput);58const lnTensor = lnOut instanceof GradTensor ? lnOut.tensor : lnOut;59console.log(`Input shape: [${bnInput.shape.join(", ")}]`);60console.log(`Output shape: [${lnTensor.shape.join(", ")}]`);61console.log(" LayerNorm is batch-size independent (used in Transformers)\n");6263// ---------------------------------------------------------------------------64// Part 3: Dropout — Regularization by random zeroing65// ---------------------------------------------------------------------------66console.log("--- Part 3: Dropout ---");6768const dropout = new Dropout(0.5);69console.log("Dropout(p=0.5) — drops 50% of elements during training");7071const dropInput = tensor([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]);7273// Training mode: randomly zeros elements74dropout.train();75console.log("\nTraining mode:");76const dropOut1 = dropout.forward(dropInput);77const drop1 = dropOut1 instanceof GradTensor ? dropOut1.tensor : dropOut1;78console.log(` Output: ${drop1.toString()}`);79console.log(" Surviving elements are scaled by 1/(1-p) = 2.0");8081// Eval mode: passes input unchanged82dropout.eval();83const dropOut2 = dropout.forward(dropInput);84const drop2 = dropOut2 instanceof GradTensor ? dropOut2.tensor : dropOut2;85console.log("\nEval mode:");86console.log(` Output: ${drop2.toString()}`);87console.log(" Input passed through unchanged\n");8889// ---------------------------------------------------------------------------90// Part 4: Parameter counts91// ---------------------------------------------------------------------------92console.log("--- Part 4: Parameter Counts ---");93const bnParams = Array.from(bn.parameters()).length;94const lnParams = Array.from(ln.parameters()).length;95const dropParams = Array.from(dropout.parameters()).length;96console.log(`BatchNorm1d(3) params: ${bnParams} (gamma + beta)`);97console.log(`LayerNorm(3) params: ${lnParams} (weight + bias)`);98console.log(`Dropout(0.5) params: ${dropParams} (no learnable params)`);99100console.log("\n=== Normalization & Dropout Complete ===");101Console Output
$ npx tsx 30-normalization-dropout/index.ts
Console output demonstrating normalization behavior in train vs eval modes
Dropout masking and inverted scaling during training