Example 27
intermediate
27
Tensors
Neural Networks

CNN Layers

Demonstrates convolutional neural network layers: Conv1d, Conv2d, MaxPool2d, and AvgPool2d. This example uses deepbox/ndarray, deepbox/nn and focuses on tensor, reshape, GradTensor; Conv1d, Conv2d, MaxPool2d, AvgPool2d, Sequential.

Deepbox Modules Used

deepbox/ndarraydeepbox/nn

What You Will Learn

  • Use deepbox/ndarray for tensor, reshape, GradTensor.
  • Use deepbox/nn for Conv1d, Conv2d, MaxPool2d, AvgPool2d, Sequential.
  • Demonstrates convolutional neural network layers: Conv1d, Conv2d, MaxPool2d, and AvgPool2d.

Source Files

index.ts
1/**2 * Example 27: Convolutional Neural Network Layers3 *4 * Demonstrates Conv1d, Conv2d, MaxPool2d, and AvgPool2d layers.5 * Convolutional layers are the backbone of image and signal processing models.6 */78import { GradTensor, tensor } from "deepbox/ndarray";9import { AvgPool2d, Conv1d, Conv2d, MaxPool2d, ReLU, Sequential } from "deepbox/nn";1011console.log("=== Convolutional Neural Network Layers ===\n");1213// ---------------------------------------------------------------------------14// Part 1: Conv1d — 1D Convolution for sequence/signal data15// ---------------------------------------------------------------------------16console.log("--- Part 1: Conv1d ---");1718// Conv1d expects input shape: (batch, in_channels, length)19const conv1d = new Conv1d(1, 4, 3, { padding: 1 });20console.log("Conv1d(in=1, out=4, kernel=3, padding=1)");2122const signal = tensor([[[1, 2, 3, 4, 5, 6, 7, 8]]]);23console.log(`Input shape:  [${signal.shape.join(", ")}]`);2425const conv1dOut = conv1d.forward(signal);26const conv1dTensor = conv1dOut instanceof GradTensor ? conv1dOut.tensor : conv1dOut;27console.log(`Output shape: [${conv1dTensor.shape.join(", ")}]`);28console.log("  4 output channels from 1 input channel\n");2930// ---------------------------------------------------------------------------31// Part 2: Conv2d — 2D Convolution for image data32// ---------------------------------------------------------------------------33console.log("--- Part 2: Conv2d ---");3435// Conv2d expects input shape: (batch, in_channels, height, width)36// Note: Conv2d works with plain Tensor forward (inference mode)37const conv2d = new Conv2d(1, 4, 2, { bias: false });38console.log("Conv2d(in=1, out=4, kernel=2x2, bias=false)");39console.log("  Conv2d uses im2col internally for efficient convolution");4041const conv2dParams = Array.from(conv2d.parameters()).length;42console.log(`  Parameters: ${conv2dParams} (weight only, no bias)\n`);4344// ---------------------------------------------------------------------------45// Part 3: MaxPool2d — Downsampling with max pooling46// ---------------------------------------------------------------------------47console.log("--- Part 3: MaxPool2d ---");4849const poolInput = tensor([50  [51    [52      [1, 2],53      [3, 4],54    ],55  ],56]);57const maxPool = new MaxPool2d(2, { stride: 2 });58console.log("MaxPool2d(kernel=2, stride=2)");59console.log(`Input shape:  [${poolInput.shape.join(", ")}]`);6061const pooled = maxPool.forward(poolInput);62const pooledTensor = pooled instanceof GradTensor ? pooled.tensor : pooled;63console.log(`Output shape: [${pooledTensor.shape.join(", ")}]`);64console.log("  Spatial dimensions halved via max pooling\n");6566// ---------------------------------------------------------------------------67// Part 4: AvgPool2d — Downsampling with average pooling68// ---------------------------------------------------------------------------69console.log("--- Part 4: AvgPool2d ---");7071const avgPool = new AvgPool2d(2, { stride: 2 });72console.log("AvgPool2d(kernel=2, stride=2)");7374const avgPooled = avgPool.forward(poolInput);75const avgTensor = avgPooled instanceof GradTensor ? avgPooled.tensor : avgPooled;76console.log(`Output shape: [${avgTensor.shape.join(", ")}]`);77console.log("  Average pooling preserves smoother spatial information\n");7879// ---------------------------------------------------------------------------80// Part 5: Building a simple CNN pipeline with Sequential (Conv1d)81// ---------------------------------------------------------------------------82console.log("--- Part 5: Sequential Conv1d Pipeline ---");8384const cnn = new Sequential(85  new Conv1d(1, 4, 3, { padding: 1 }),86  new ReLU(),87  new Conv1d(4, 8, 3, { padding: 1 }),88  new ReLU()89);9091console.log("Sequential 1D CNN:");92console.log("  Conv1d(1->4, k=3) -> ReLU -> Conv1d(4->8, k=3) -> ReLU");9394const cnnInput = tensor([[[1, 2, 3, 4, 5, 6]]]);95const cnnOutput = cnn.forward(cnnInput);96const cnnTensor = cnnOutput instanceof GradTensor ? cnnOutput.tensor : cnnOutput;97console.log(`Input shape:  [${cnnInput.shape.join(", ")}]`);98console.log(`Output shape: [${cnnTensor.shape.join(", ")}]`);99100const paramCount = Array.from(cnn.parameters()).length;101console.log(`Total parameters: ${paramCount}`);102103console.log("\n=== CNN Layers Complete ===");104

Console Output

$ npx tsx 27-cnn-layers/index.ts
Console output demonstrating convolution and pooling operations with shape transformations