Portfolio
CNN·Digits numpy-trained, runs live
MNIST test acc Source ↗

1 Draw a digit

Brush
draw a single digit (0–9) with your mouse or finger · C clear · it’s centred & scaled like MNIST before the net sees it

2 Inside the convolutional net

input 28×28
conv1 · 8 maps 28×28 · ReLU
conv2 · 16 maps 14×14 → pool 7×7
Each map is a learned filter’s response — bright = the filter fired there. Early maps catch strokes & edges; deeper maps catch corners & loops. The 16×7×7 = 784 deep activations feed one dense softmax layer that votes on the digit.

3 Prediction

·
draw something to start

ƒ Equation & training loss

architecture x → [conv 3×3 → ReLU → maxpool]×2 → flatten → dense → softmax
prediction · softmax head ŷⱼ = softmax(z)ⱼ = e^{zⱼ} / Σᵢ e^{zᵢ}
loss · cross-entropy (NLL of true class) J = −(1/m) Σ ln ŷ₍ₜᵣᵤₑ₎
training loss · pure numpy
epoch 0… 3
pure-numpy training loss · 60k MNIST · test acc 96.6% → 97.2% → 97.9% per epoch → 98.4% final
A 2-conv CNN — conv3×3(1→8) → ReLU → maxpool → conv3×3(8→16) → ReLU → maxpool → dense(784→10) → softmax — trained from scratch in pure numpy (no PyTorch/TensorFlow) on the 60k-image MNIST training set, reaching on the 10k test set. The learned weights ship as a 76 KB JSON and the entire forward pass runs in vanilla JS in your browser — nothing is sent anywhere. view the numpy trainer ↗