From 73423bd3161482ca4e858c9da5df59bf294ceae0 Mon Sep 17 00:00:00 2001 From: Nikhil Prasad Date: Fri, 15 May 2026 21:33:11 -0500 Subject: [PATCH] initial training complete --- .gitignore | 13 + .harlequin.toml | 8 + README.md | 101 +- docs/HTML/01_data_loading.html | 8352 ++++++++++++++++ docs/HTML/02_model_training.html | 8459 +++++++++++++++++ docs/nbconvert/01_data_loading.md | 171 + .../01_data_loading_10_0.png | Bin 0 -> 14665 bytes .../01_data_loading_11_0.png | Bin 0 -> 15611 bytes docs/nbconvert/02_model_training.md | 340 + .../02_model_training_12_0.png | Bin 0 -> 41983 bytes .../02_model_training_14_0.png | Bin 0 -> 33549 bytes .../02_model_training_17_0.png | Bin 0 -> 21930 bytes .../HTML_convert/01_data_loading.html | 2303 +++++ .../HTML_convert/02_model_training.html | 2320 +++++ notebooks/01_data_loading.ipynb | 537 ++ notebooks/02_model_training.ipynb | 533 ++ requirements.txt | 21 + 17 files changed, 23157 insertions(+), 1 deletion(-) create mode 100644 .harlequin.toml create mode 100644 docs/HTML/01_data_loading.html create mode 100644 docs/HTML/02_model_training.html create mode 100644 docs/nbconvert/01_data_loading.md create mode 100644 docs/nbconvert/01_data_loading_files/01_data_loading_10_0.png create mode 100644 docs/nbconvert/01_data_loading_files/01_data_loading_11_0.png create mode 100644 docs/nbconvert/02_model_training.md create mode 100644 docs/nbconvert/02_model_training_files/02_model_training_12_0.png create mode 100644 docs/nbconvert/02_model_training_files/02_model_training_14_0.png create mode 100644 docs/nbconvert/02_model_training_files/02_model_training_17_0.png create mode 100644 docs/nbconvert/HTML_convert/01_data_loading.html create mode 100644 docs/nbconvert/HTML_convert/02_model_training.html create mode 100644 notebooks/01_data_loading.ipynb create mode 100644 notebooks/02_model_training.ipynb create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore index 83972fa..8cd2c0b 100644 --- a/.gitignore +++ b/.gitignore @@ -216,3 +216,16 @@ __marimo__/ # Streamlit .streamlit/secrets.toml + + +docs\prompts\ +docs/prompts/ +docs\prompts +docs/prompts + +data\ +data + +setup.ps1 +*.ps1 + diff --git a/.harlequin.toml b/.harlequin.toml new file mode 100644 index 0000000..8e9ba8e --- /dev/null +++ b/.harlequin.toml @@ -0,0 +1,8 @@ +default_profile = "duckdb" + +[profiles.duckdb] +adapter = "duckdb" +theme = "textual-light" +limit = 100000 +keymap_name = ["vscode"] +locale = "C" diff --git a/README.md b/README.md index 97601e0..6e76731 100644 --- a/README.md +++ b/README.md @@ -1 +1,100 @@ -# MNIST \ No newline at end of file +# MNIST Handwritten Digit Classification + +A learning project for training a neural network on the MNIST dataset using PyTorch and DuckDB, with Jupyter notebooks for step-by-step visualization. + +## Quick Start + +```powershell +# 1. Run the setup script (creates venv, installs deps, extracts data) +.\setup.ps1 + +# 2. Open VSCode in this folder +code . + +# 3. Open notebooks/01_data_loading.ipynb +# Select kernel: "MNIST (Python)" +# Run all cells +``` + +## Manual Setup + +If you prefer to set up manually: + +```powershell +# Create and activate virtual environment +python -m venv .venv +.\.venv\Scripts\Activate.ps1 + +# Install dependencies +pip install -r requirements.txt + +# Register Jupyter kernel for VSCode +python -m ipykernel install --user --name mnist --display-name "MNIST (Python)" + +# Extract data (if not already done) +Expand-Archive -Path data\MNIST_ORG.zip -DestinationPath data -Force +``` + +## VSCode Notebook Setup + +1. Install the **Jupyter** extension in VSCode (`ms-toolsai.jupyter`) +2. Open any `.ipynb` file +3. Click "Select Kernel" → "Jupyter Kernel" → **MNIST (Python)** (view kernels installed: `jupyter kernelspec list`. May need to refresh list.) +4. Run cells with `Shift+Enter` + +## Project Structure + +``` +MNIST/ +├── data/ +│ ├── MNIST_ORG.zip # Original compressed data +│ ├── train-images.idx3-ubyte # 60,000 training images (28x28) +│ ├── train-labels.idx1-ubyte # Training labels (0-9) +│ ├── t10k-images.idx3-ubyte # 10,000 test images +│ ├── t10k-labels.idx1-ubyte # Test labels +│ └── mnist.duckdb # Generated after running notebook 01 +├── notebooks/ +│ ├── 01_data_loading.ipynb # Parse IDX files → DuckDB, explore with SQL +│ └── 02_model_training.ipynb # Train neural net, visualize results +├── requirements.txt +├── setup.ps1 +└── README.md +``` + +## Notebooks + +### 01 - Data Loading & DuckDB Storage +- Parses raw MNIST IDX binary format +- Stores all 70,000 images in DuckDB (queryable with SQL) +- Explores label distribution and pixel intensity +- Visualizes sample digits + +### 02 - Model Training & Visualization +- Loads data from DuckDB into PyTorch +- Trains a fully-connected neural network (784 → 256 → 128 → 10) +- Tracks loss and accuracy per epoch +- Visualizes training curves, confusion matrix, and misclassified examples +- Saves model weights and training history + +## Key Hyperparameters to Experiment With + +| Parameter | Default | Effect | +|-----------|---------|--------| +| Learning Rate | 0.001 | Step size for optimization | +| Hidden Layers | 256, 128 | Model capacity | +| Dropout | 0.2 | Regularization strength | +| Batch Size | 128 | Gradient noise vs speed | +| Epochs | 15 | Training duration | + +## Tech Stack + +- **DuckDB** - In-process SQL database for data storage and exploration +- **PyTorch** - Neural network training framework +- **Matplotlib/Seaborn** - Visualization +- **Jupyter** - Interactive notebook environment in VSCode + +## References + +- [MNIST Database](http://yann.lecun.com/exdb/mnist/) +- [PyTorch Documentation](https://pytorch.org/docs/stable/) +- [DuckDB Documentation](https://duckdb.org/docs/) diff --git a/docs/HTML/01_data_loading.html b/docs/HTML/01_data_loading.html new file mode 100644 index 0000000..925c93c --- /dev/null +++ b/docs/HTML/01_data_loading.html @@ -0,0 +1,8352 @@ + + + + + +01_data_loading + + + + + + + + + + + + +
+ + + + + +
+ + diff --git a/docs/HTML/02_model_training.html b/docs/HTML/02_model_training.html new file mode 100644 index 0000000..c6dc63f --- /dev/null +++ b/docs/HTML/02_model_training.html @@ -0,0 +1,8459 @@ + + + + + +02_model_training + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + diff --git a/docs/nbconvert/01_data_loading.md b/docs/nbconvert/01_data_loading.md new file mode 100644 index 0000000..eb87964 --- /dev/null +++ b/docs/nbconvert/01_data_loading.md @@ -0,0 +1,171 @@ +# 01 - MNIST Data Loading & DuckDB Storage + +This notebook: + +1. Reads raw MNIST IDX binary files +2. Stores them in DuckDB for fast SQL-based exploration +3. Visualizes sample digits + +```python +import numpy as np +import pandas as pd +import duckdb +import struct +import matplotlib.pyplot as plt +from pathlib import Path +``` + +## Load MNIST IDX Files + +The IDX format stores images as raw bytes with a header containing dimensions. + +```python +def read_idx_images(path): + with open(path, 'rb') as f: + magic, n, rows, cols = struct.unpack('>IIII', f.read(16)) + return np.frombuffer(f.read(), dtype=np.uint8).reshape(n, rows * cols) + +def read_idx_labels(path): + with open(path, 'rb') as f: + magic, n = struct.unpack('>II', f.read(8)) + return np.frombuffer(f.read(), dtype=np.uint8) + +data_dir = Path('../data') +train_images = read_idx_images(data_dir / 'train-images.idx3-ubyte') +train_labels = read_idx_labels(data_dir / 'train-labels.idx1-ubyte') +test_images = read_idx_images(data_dir / 't10k-images.idx3-ubyte') +test_labels = read_idx_labels(data_dir / 't10k-labels.idx1-ubyte') + +print(f'Train: {train_images.shape[0]} images, {train_images.shape[1]} pixels each') +print(f'Test: {test_images.shape[0]} images') +``` + + Train: 60000 images, 784 pixels each + Test: 10000 images + + +## Store in DuckDB + +We store pixel data as a flat array (784 columns for 28x28) plus the label. This lets us query and filter with SQL. + +```python +db_path = str(data_dir / 'mnist.duckdb') +con = duckdb.connect(db_path) + +# Create train table +train_df = pd.DataFrame(train_images, columns=[f'px{i}' for i in range(784)]) +train_df['label'] = train_labels +train_df['split'] = 'train' + +# Create test table +test_df = pd.DataFrame(test_images, columns=[f'px{i}' for i in range(784)]) +test_df['label'] = test_labels +test_df['split'] = 'test' + +# Combine and write +all_df = pd.concat([train_df, test_df], ignore_index=True) +con.execute('DROP TABLE IF EXISTS mnist') +con.execute('CREATE TABLE mnist AS SELECT * FROM all_df') +print(f'Stored {len(all_df)} records in DuckDB') +``` + + Stored 70000 records in DuckDB + + +## Explore with SQL + +```python +# Label distribution +con.execute(""" + SELECT label, split, COUNT(*) as count + FROM mnist + GROUP BY label, split + ORDER BY label, split +""").df() +``` + +| | label | split | count | +| --- | ----- | ----- | ----- | +| 0 | 0 | test | 980 | +| 1 | 0 | train | 5923 | +| 2 | 1 | test | 1135 | +| 3 | 1 | train | 6742 | +| 4 | 2 | test | 1032 | +| 5 | 2 | train | 5958 | +| 6 | 3 | test | 1010 | +| 7 | 3 | train | 6131 | +| 8 | 4 | test | 982 | +| 9 | 4 | train | 5842 | +| 10 | 5 | test | 892 | +| 11 | 5 | train | 5421 | +| 12 | 6 | test | 958 | +| 13 | 6 | train | 5918 | +| 14 | 7 | test | 1028 | +| 15 | 7 | train | 6265 | +| 16 | 8 | test | 974 | +| 17 | 8 | train | 5851 | +| 18 | 9 | test | 1009 | +| 19 | 9 | train | 5949 | + +```python +# Average pixel intensity per digit +con.execute(""" + SELECT label, + ROUND(AVG(px196::INT + px197::INT + px224::INT + px225::INT), 1) as center_intensity + FROM mnist WHERE split='train' + GROUP BY label ORDER BY label +""").df() +``` + +| | label | center_intensity | +| --- | ----- | ---------------- | +| 0 | 0 | 0.0 | +| 1 | 1 | 0.0 | +| 2 | 2 | 0.0 | +| 3 | 3 | 0.1 | +| 4 | 4 | 0.0 | +| 5 | 5 | 0.0 | +| 6 | 6 | 0.0 | +| 7 | 7 | 0.6 | +| 8 | 8 | 0.0 | +| 9 | 9 | 0.0 | + +## Visualize Sample Digits + +```python +fig, axes = plt.subplots(2, 5, figsize=(10, 4)) +for digit in range(10): + row = con.execute(f"SELECT * FROM mnist WHERE label={digit} AND split='train' LIMIT 1").fetchone() + pixels = np.array(row[:784]).reshape(28, 28) + ax = axes[digit // 5, digit % 5] + ax.imshow(pixels, cmap='gray') + ax.set_title(f'Label: {digit}') + ax.axis('off') +plt.tight_layout() +plt.show() +``` + +![png](01_data_loading_files/01_data_loading_10_0.png) + +```python +# Pixel intensity heatmap averaged across all training images +avg_pixels = con.execute(""" + SELECT {} FROM mnist WHERE split='train' +""".format(', '.join(f'AVG(px{i}) as px{i}' for i in range(784)))).fetchone() + +plt.figure(figsize=(5, 5)) +plt.imshow(np.array(avg_pixels).reshape(28, 28), cmap='hot') +plt.title('Average pixel intensity (all digits)') +plt.colorbar() +plt.show() +``` + +![png](01_data_loading_files/01_data_loading_11_0.png) + +```python +con.close() +print('DuckDB connection closed. Database saved at:', db_path) +``` + + DuckDB connection closed. Database saved at: ..\data\mnist.duckdb + diff --git a/docs/nbconvert/01_data_loading_files/01_data_loading_10_0.png b/docs/nbconvert/01_data_loading_files/01_data_loading_10_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e335a551c281125fbb18afbd07dd29045ef3be30 GIT binary patch literal 14665 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 literal 0 HcmV?d00001 diff --git a/docs/nbconvert/02_model_training_files/02_model_training_14_0.png b/docs/nbconvert/02_model_training_files/02_model_training_14_0.png new file mode 100644 index 0000000000000000000000000000000000000000..8707cd75710c9cd658bfa290dbaaeb4bb697251c GIT binary patch literal 33549 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 literal 0 HcmV?d00001 diff --git a/docs/nbconvert/02_model_training_files/02_model_training_17_0.png b/docs/nbconvert/02_model_training_files/02_model_training_17_0.png new file mode 100644 index 0000000000000000000000000000000000000000..071a9c311721cbc83e08698b3186ddf7ec23804e GIT binary patch literal 21930 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 + + + + + + + + +01_data_loading + +
+

01 - MNIST Data Loading & DuckDB Storage

This notebook:

  1. Reads raw MNIST IDX binary files

  2. Stores them in DuckDB for fast SQL-based exploration

  3. Visualizes sample digits

Load MNIST IDX Files

The IDX format stores images as raw bytes with a header containing dimensions.

Store in DuckDB

We store pixel data as a flat array (784 columns for 28x28) plus the label. This lets us query and filter with SQL.

Explore with SQL

 

 labelsplitcount
00test980
10train5923
21test1135
31train6742
42test1032
52train5958
63test1010
73train6131
84test982
94train5842
105test892
115train5421
126test958
136train5918
147test1028
157train6265
168test974
178train5851
189test1009
199train5949

 

 

 labelcenter_intensity
000.0
110.0
220.0
330.1
440.0
550.0
660.0
770.6
880.0
990.0

 

Visualize Sample Digits


png +

 


png +

 

 

+ + + \ No newline at end of file diff --git a/docs/nbconvert/HTML_convert/02_model_training.html b/docs/nbconvert/HTML_convert/02_model_training.html new file mode 100644 index 0000000..671017e --- /dev/null +++ b/docs/nbconvert/HTML_convert/02_model_training.html @@ -0,0 +1,2320 @@ + + + + + + + + + +02_model_training + +
+

02 - MNIST Model Training & Visualization

This notebook trains a neural network on MNIST data loaded from DuckDB, then visualizes:

  • Training loss & accuracy curves

  • Confusion matrix

  • Per-digit accuracy

  • Misclassified examples

Key ML Concepts Covered:

  • Neural network architecture (layers, activations)

  • Forward/backward propagation

  • Loss functions & optimizers

  • Batch training with DataLoaders

  • Overfitting detection (train vs validation)

1. Load Data from DuckDB

2. Create PyTorch DataLoaders

DataLoaders handle batching and shuffling. Batch size is a key hyperparameter:

  • Smaller batches → noisier gradients, can help escape local minima

  • Larger batches → smoother gradients, faster training per epoch

3. Define the Neural Network

Architecture: 784 → 256 → 128 → 10

Key parameters to experiment with:

  • Hidden layer sizes (try 64, 128, 256, 512)

  • Number of layers (try 1-4 hidden layers)

  • Activation function (ReLU, Sigmoid, Tanh)

  • Dropout rate (regularization to prevent overfitting)

4. Training Loop

Hyperparameters:

  • lr (learning rate): How big each optimization step is. Too high → diverges. Too low → slow.

  • epochs: Number of full passes through the training data.

  • optimizer: Adam adapts learning rate per-parameter. SGD is simpler but needs tuning.

 

5. Training Curves

What to look for:

  • If test loss increases while train loss decreases → overfitting (try more dropout, fewer parameters)

  • If both losses plateau high → underfitting (try more parameters, lower dropout)

  • Gap between train/test accuracy shows generalization


png +

6. Confusion Matrix

Shows which digits get confused with each other (e.g., 4↔9, 3↔5 are common).


png +

 

7. Misclassified Examples

Seeing what the model gets wrong helps understand its weaknesses.


png +

8. Save Model & Training Results to DuckDB

9. Experiment Ideas

Try changing these parameters and re-running to see the effect:

ParameterCurrentTry
LEARNING_RATE0.0010.01, 0.0001
HIDDEN125664, 512
HIDDEN212832, 256
DROPOUT0.20.0, 0.5
EPOCHS155, 30
BATCH_SIZE12832, 512
OptimizerAdamSGD(lr=0.01, momentum=0.9)
+ + + \ No newline at end of file diff --git a/notebooks/01_data_loading.ipynb b/notebooks/01_data_loading.ipynb new file mode 100644 index 0000000..ca6c27b --- /dev/null +++ b/notebooks/01_data_loading.ipynb @@ -0,0 +1,537 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 01 - MNIST Data Loading & DuckDB Storage\n", + "\n", + "This notebook:\n", + "1. Reads raw MNIST IDX binary files\n", + "2. Stores them in DuckDB for fast SQL-based exploration\n", + "3. Visualizes sample digits" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import duckdb\n", + "import struct\n", + "import matplotlib.pyplot as plt\n", + "from pathlib import Path" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load MNIST IDX Files\n", + "\n", + "The IDX format stores images as raw bytes with a header containing dimensions." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train: 60000 images, 784 pixels each\n", + "Test: 10000 images\n" + ] + } + ], + "source": [ + "def read_idx_images(path):\n", + " with open(path, 'rb') as f:\n", + " magic, n, rows, cols = struct.unpack('>IIII', f.read(16))\n", + " return np.frombuffer(f.read(), dtype=np.uint8).reshape(n, rows * cols)\n", + "\n", + "def read_idx_labels(path):\n", + " with open(path, 'rb') as f:\n", + " magic, n = struct.unpack('>II', f.read(8))\n", + " return np.frombuffer(f.read(), dtype=np.uint8)\n", + "\n", + "data_dir = Path('../data')\n", + "train_images = read_idx_images(data_dir / 'train-images.idx3-ubyte')\n", + "train_labels = read_idx_labels(data_dir / 'train-labels.idx1-ubyte')\n", + "test_images = read_idx_images(data_dir / 't10k-images.idx3-ubyte')\n", + "test_labels = read_idx_labels(data_dir / 't10k-labels.idx1-ubyte')\n", + "\n", + "print(f'Train: {train_images.shape[0]} images, {train_images.shape[1]} pixels each')\n", + "print(f'Test: {test_images.shape[0]} images')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Store in DuckDB\n", + "\n", + "We store pixel data as a flat array (784 columns for 28x28) plus the label. This lets us query and filter with SQL." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Stored 70000 records in DuckDB\n" + ] + } + ], + "source": [ + "db_path = str(data_dir / 'mnist.duckdb')\n", + "con = duckdb.connect(db_path)\n", + "\n", + "# Create train table\n", + "train_df = pd.DataFrame(train_images, columns=[f'px{i}' for i in range(784)])\n", + "train_df['label'] = train_labels\n", + "train_df['split'] = 'train'\n", + "\n", + "# Create test table\n", + "test_df = pd.DataFrame(test_images, columns=[f'px{i}' for i in range(784)])\n", + "test_df['label'] = test_labels\n", + "test_df['split'] = 'test'\n", + "\n", + "# Combine and write\n", + "all_df = pd.concat([train_df, test_df], ignore_index=True)\n", + "con.execute('DROP TABLE IF EXISTS mnist')\n", + "con.execute('CREATE TABLE mnist AS SELECT * FROM all_df')\n", + "print(f'Stored {len(all_df)} records in DuckDB')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Explore with SQL" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
labelsplitcount
00test980
10train5923
21test1135
31train6742
42test1032
52train5958
63test1010
73train6131
84test982
94train5842
105test892
115train5421
126test958
136train5918
147test1028
157train6265
168test974
178train5851
189test1009
199train5949
\n", + "
" + ], + "text/plain": [ + " label split count\n", + "0 0 test 980\n", + "1 0 train 5923\n", + "2 1 test 1135\n", + "3 1 train 6742\n", + "4 2 test 1032\n", + "5 2 train 5958\n", + "6 3 test 1010\n", + "7 3 train 6131\n", + "8 4 test 982\n", + "9 4 train 5842\n", + "10 5 test 892\n", + "11 5 train 5421\n", + "12 6 test 958\n", + "13 6 train 5918\n", + "14 7 test 1028\n", + "15 7 train 6265\n", + "16 8 test 974\n", + "17 8 train 5851\n", + "18 9 test 1009\n", + "19 9 train 5949" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Label distribution\n", + "con.execute(\"\"\"\n", + " SELECT label, split, COUNT(*) as count\n", + " FROM mnist\n", + " GROUP BY label, split\n", + " ORDER BY label, split\n", + "\"\"\").df()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
labelcenter_intensity
000.0
110.0
220.0
330.1
440.0
550.0
660.0
770.6
880.0
990.0
\n", + "
" + ], + "text/plain": [ + " label center_intensity\n", + "0 0 0.0\n", + "1 1 0.0\n", + "2 2 0.0\n", + "3 3 0.1\n", + "4 4 0.0\n", + "5 5 0.0\n", + "6 6 0.0\n", + "7 7 0.6\n", + "8 8 0.0\n", + "9 9 0.0" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Average pixel intensity per digit\n", + "con.execute(\"\"\"\n", + " SELECT label,\n", + " ROUND(AVG(px196::INT + px197::INT + px224::INT + px225::INT), 1) as center_intensity\n", + " FROM mnist WHERE split='train'\n", + " GROUP BY label ORDER BY label\n", + "\"\"\").df()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualize Sample Digits" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8cAAAGJCAYAAACnwkFvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4tklEQVR4nO3dB5gUVfov4BqiYABRDBhAF1BRESPIiqBgQlYxrOiqqOuqa+TPRUx/VjHnBCpmTJjWAGbUBXNYMO1iFgUFUVGJKiDS96m+D1ylTmu3MwNMn/d9nlncH2eqDzV9pvurqv6qIpfL5RIAAACIWK2lPQEAAABY2hTHAAAARE9xDAAAQPQUxwAAAERPcQwAAED0FMcAAABET3EMAABA9BTHAAAARE9xDAAAQPQUx7/DhAkTkoqKiuSSSy6psifQM888k99m+ifUNNYEWBPgdQK8d6rpoimOb7nllnzxOXbs2KRcTZ48Odlvv/2Sxo0bJyuttFKy5557Jh9//PHSnhbLqHJfE++//37St2/fpGPHjslyyy2X/7emRTzEuiYeeOCBpFevXsn666+fNGzYMNlggw2Sfv36JdOnT1/aU2MZVe5r4sEHH0x22WWXpFmzZkn9+vWTtddeO9l3332TcePGLe2psYwq9zWxuJ122in/7z3uuOOSWNRZ2hOgasyePTvZYYcdkhkzZiSnnXZaUrdu3eTyyy9POnfunLz55pvJKqusYlcTlZdffjkZNGhQ0qZNm2SjjTbKrwOI2ZFHHpkvAg466KBk3XXXTf773/8mV111VfLYY48lr7/+etKgQYOlPUVYotI1sPLKKyd9+vRJVl111eSLL75Ibr755mSbbbbJv4ZsttlmfiJE64EHHsivg9gojsvENddck3z44YfJv//972TrrbfOZ7vttluyySabJJdeemly3nnnLe0pwhK1xx575M+IrbjiivmPQCiOid19992XdOnS5RfZlltumRxyyCHJsGHDkr/97W9LbW6wNJx++umZLF0H6RnkIUOGJNdee+1SmRcsbXPmzMlfWXTyyScH10k5i+ay6mLMmzcv/wRI3yw0atQoWX755ZNOnTolo0ePLvg96dnZ5s2b54+4p2dpQ5fivPfee/nLdJo0aZK/vHOrrbZKHnrood+cz/fff5//3q+//rqoNz1pUbywME5tuOGGSdeuXZN77733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0Y/XsWPHYN65c+eit0HN7h7+8ssvL/G5lJM1A3fcOeKII4JjC921pybd7cCZYwAAAKKnOAYAACB6imMAAACipzgGAAAgehpy/cyWW24ZfELsvvvuwbyioqLoJ1CoOVbq4YcfzmSXXHJJcOznn38ezN94441gPm3atEy24447VvrfAtVpu+22y2RDhw4tqWlSIRdffHEmmzhxYknbIA577bVXMP/b3/5WbY85fvz4YL7TTjtlss8++yw4tmXLllU+L0gNGTIkuCOGDx9e0g768ccfM9kXX3xRbTt5pZVWCubjxo0L5s2aNSt624X+7WPHji16G1SdQg3cqJwbb7yxUg0kaxrPIgAAAKKnOAYAACB6imMAAACipzgGAAAgeopjAAAAohdlt+p27doF86eeeqqkToe5XC6TPf7448GxBxxwQDDv3LlzJhswYEBJ3eKmTp0azN96661MtmDBgpI6cm+xxRaZ7PXXXw+OhapwyCGHVKp7aOqZZ54J5rfddtvvnhdx+fOf/1wl25kwYUImGzNmTHDsySefHMwLdaYO2WijjUqYHRRv/vz5lX5+Lg277LJLMF955ZUrve1JkyYF87lz51Z62xTWtm3bYL766qvbbdWgUQl3BilUS9UkzhwDAAAQPcUxAAAA0VMcAwAAED3FMQAAANFTHAMAABC9su9W3bp160zWv3//krqxff3118F8ypQpmezWW28Njp09e3Ywf/TRR4vKqluDBg2Ceb9+/TLZgQceuARmRLlbddVVg/lf//rXorusT58+PZifc845lZwdsTviiCOC+ZFHHhnMn3zyyWD+0UcfZbKvvvoqqS66tRKr/fffv6S1XOh9TylOP/30Sm+D0nXv3r3afqYxK/T6sd566xW9jcmTJyc1nTPHAAAARE9xDAAAQPQUxwAAAERPcQwAAED0FMcAAABEr2y6VdevXz+YX3LJJUV3uZs1a1Yw7927dzAfO3Zs2XfKW3fddZf2FKjhWrRoEczvv//+Sm978ODBwXz06NGV3jZx+/zzz4P5wIEDk2XZtttuu7SnAFWm0N0xTjnllEzWsmXL4Ni6detWeh5vvvlmMP/xxx8rvW1Kt8EGG5Q0/u2337abixCqmQp1sf7ggw+SUmqpmsSZYwAAAKKnOAYAACB6imMAAACipzgGAAAgemXTkGvzzTcP5oWab4XsueeewfzZZ5/93fOC2O26667BvG3btkVv41//+lcwv/LKK3/3vGBpOeGEE4L58ssvX+ltb7rppiWNf+mllzLZyy+/XOl5EE9zxYMPPjiYd+vWrdKPud122wXzXC5X6W3PnDmz6GZfjz32WHDsDz/8UOl5UP3GjBlT9rt5pZVWKvr910EHHRTMd95556If7+yzzw7m06dPT2o6Z44BAACInuIYAACA6CmOAQAAiJ7iGAAAgOgpjgEAAIhe2XSrvuyyy4J5RUVF0d2nY+hKXatW+HjIggULlvhcKD89e/bMZBdccEFJ23jhhRcy2SGHHBIcO2PGjJK2DZXVsGHDYN6mTZtgfsYZZ1TqLgqFfm+X+jv7888/D+aHHXZYJvvpp59K2jblZ5NNNslkDz30UHDsuuuum9REzz//fDC//vrrl/hcqF5NmjSplu1uttlmRdcev9bBfe21185k9erVC4498MADi36dKNRN/dVXXw3mc+fODeZ16mTLxddeey0pV84cAwAAED3FMQAAANFTHAMAABA9xTEAAADRUxwDAAAQvRrXrbpHjx7BvF27dsE8l8sV3XExBoU6nIb2U+rNN9+s5hlRE7Vo0SKY33///ZXe9scff5zJvvzyy0pvFwqpW7duJtt8881Leo6vueaawTzULbRQ5+iXX345mO+6665Fd80uJNRtNLX33ntnsiuvvDI4dt68eSU9JuWlUAfeQvmyfoeNQu8nd9ttt0z2+OOPV/rxqDqFujAXei977bXXZrLTTjut0vNo27ZtSWti/vz5wfz777/PZO+8805w7M033xzMx44dW/RdeAq9p5o0aVIwb9CgQSZ77733knLlzDEAAADRUxwDAAAQPcUxAAAA0VMcAwAAEL0a15Ar9KHwVL169YL5V199lcnuueeepJzUr18/mA8cOLDobYwaNSqYn3rqqb97XpSvk08+udqapFxwwQWV3gaU8joRanj1wAMPlLQTzzzzzKJ/t7744ovBsU2aNCl6G5tssklJ82vatGkwP//88zPZp59+Ghw7fPjwYD537tyS5sKyb9y4cZmsS5cuwbEHHXRQMB85cmQwnzNnTlIdDj/88GB+/PHHV8vjsfQcc8wxwXzixInBvGPHjtUyj1J/V7777rvB/JVXXkmWpCOPPLKk14mPA41Sy5kzxwAAAERPcQwAAED0FMcAAABET3EMAABA9BTHAAAARK/GdasuVaiL5pQpU5Jy6ko9YMCAYN6/f/9MNmnSpODYSy+9NJjPnj27pDlSXtq1axfMd95550pve8SIEcH8/fffr/S2iVvdunVL6igd+l1ZyOOPPx7MBw8eHMynT59edEfQxx57LJhvuummmWzevHnBsRdddFEwL9Tdes8998xkw4YNC459+umng/mFF16YyaZNm5aU4s033yxpPEteoU7A5557brIsKHSHDt2q4xH6XURW165dS9ot999/f1S70ZljAAAAoqc4BgAAIHqKYwAAAKKnOAYAACB6imMAAACiV/bdqh966KGkXDoEF+qo2qtXr6K7Ae+zzz6VnB0xefLJJ4P5yiuvXPQ2XnnllWB+6KGH/u55wUK1a9fO7Iyzzz47uINOPPHEYP7dd99lslNOOSU49u677y66K3Vqq622ymRXXXVVcOzmm28ezD/88MNMdvTRRwfHjh49OpivtNJKwbxjx46Z7MADDwyO3WOPPYL5U089lRTrs88+C+brrbde0duAkF122cWOgWrw4IMPRrVfnTkGAAAgeopjAAAAoqc4BgAAIHqKYwAAAKKnOAYAACB6Na5bdUVFRUl5z549M1mfPn2SZUXfvn0z2T/+8Y/g2EaNGgXzYcOGBfPevXtXcnbEbpVVVgnmCxYsKHob11xzTTCfPXv2754XLHTkkUcW3ZX6+++/D+ZHHXVU0Z3aO3ToEMwPO+ywYL7bbrtlsgYNGgTHnnXWWcF86NChRXd9LmTmzJnB/IknnigqSx1wwAHB/C9/+UulXvOofnXr1g3mO++8czAfNWpUJvvhhx+SZUVovV155ZVLZS5AeXHmGAAAgOgpjgEAAIie4hgAAIDoKY4BAACIXo1ryJXL5UrK11hjjUw2aNCg4Nibb745mH/zzTdFN2Y5+OCDg2M322yzYL722mtnsk8//TQ4duTIkSU1PIJihRr+pGrVqvzxs5deeskPgmpz+umnFz22du3awbx///6ZbODAgcGxLVu2TCqr0LbPP//8YP7TTz8ly4K77rqrpJylY7vttstk//u//xscu9NOOwXz9dZbr9JN4ErRpEmTYN69e/dgftlll2Wyhg0blvSYhRqMzZkzp6TtQLko1Ny4devWmeyVV15JypUzxwAAAERPcQwAAED0FMcAAABET3EMAABA9BTHAAAARK/GdasuVag76THHHBMcu88++wTzmTNnBvNWrVpVSyff0aNHV7orKxTSrl27TNatW7fg2AULFgTzefPmBfOrr746k3355Zd+GFSbL774IpM1bdo0OLZ+/fol3U0g5LHHHgvmzz33XDAfPnx4JpswYcIy3ZWamu2qq67KZJtssklJ2zjppJMy2axZs5LqUqhr9hZbbFHSHUpCnnnmmWA+ZMiQYF7oPRiUu0LrqlYV3LmkJonrXwsAAAABimMAAACipzgGAAAgeopjAAAAoqc4BgAAIHo1rlv1yy+/HMzHjBkTzLfeeuuit73GGmsE89VXX73obXzzzTfB/O677w7mffr0KXrbUBUaN25c9HO/kMmTJwfzE0888XfPC36P7bffPpP17NmzpM63X331VSa7+eabg2OnTZtWUgd3qImOPvroZFkWWrMPP/xwSe+z5syZU+XzgnK07bbbZrJbbrklKVfOHAMAABA9xTEAAADRUxwDAAAQPcUxAAAA0atxDbkmTZoUzPfee+9gftRRR2WyAQMGVMlcrrzyykw2ZMiQ4NiPPvqoSh4TgP9v1qxZmd1x++23B3dRoRzKyaGHHprJjj/++ODYQw45JFnSxo8fn8m+//774Njnn38+mF9//fWZbNy4cVUwO4hXRUXF0p7CMsGZYwAAAKKnOAYAACB6imMAAACipzgGAAAgeopjAAAAoleRy+VyxewFHcxYmop8mi5RNXVNrLHGGpnsnnvuCY7dbrvtgvknn3wSzFu2bFnJ2VEsawKsiWLVr1+/6M7WqXPOOSeTrbzyysGxw4cPD+ZPPfVUMB8xYkQm++KLL4JjqRyvE5Sy7m+++eZgfsMNNxR1N6ByWRPOHAMAABA9xTEAAADRUxwDAAAQPcUxAAAA0VMcAwAAED3dqqkRdFwEawK8ToD3TvB76VYNAAAARXBZNQAAANFTHAMAABA9xTEAAADRUxwDAAAQPcUxAAAA0VMcAwAAED3FMQAAANFTHAMAABA9xTEAAADRUxwDAAAQPcUxAAAA0VMcAwAAED3FMQAAANFTHAMAABA9xTEAAADRq8jlcrno9wIAAABRc+YYAACA6CmOAQAAiJ7iGAAAgOgpjgEAAIie4hgAAIDoKY4BAACInuIYAACA6CmOAQAAiJ7i+HeYMGFCUlFRkVxyySVV9gR65pln8ttM/4SaxpoAawK8ToD3TjVdNMXxLbfcki8+x44dm5SjgQMH5v99i38tt9xyS3tqLKPKfU0sdM899yTbbrttsvzyyyeNGzdOOnbsmIwaNWppT4tlULmviRYtWgRfJ9KvVq1aLe3psQwq9zWRevrpp5MddtghWXXVVfOvEdtss01y++23L+1psYyKYU3cfffdyRZbbJGvIZo2bZocfvjhyddff53Eos7SngBVa8iQIckKK6yw6P/Xrl3bLiZa6UGjs846K9l3332TQw89NPnxxx+TcePGJZMnT17aU4Ml7oorrkhmz579i2zixInJgAEDkp133tlPhOg89NBDSc+ePfMHUBeeZLj33nuT3r1754uBvn37Lu0pwhKvI4455pika9euyWWXXZZMmjQpufLKK/MHA1599dUoTropjstMWgSkRz8hdq+88kq+ML700ku9wYEkyRcBizvnnHPyfx544IH2EdG56qqrkjXXXDN/NVH9+vXz2VFHHZVsuOGG+TOEimNiMm/evOS0005Ltt9+++Spp57KHyxKpVfc/elPf0puuOGG5Pjjj0/KXTSXVRf7pDj99NOTLbfcMmnUqFH+MsxOnTolo0ePLvg9l19+edK8efOkQYMGSefOnfNnpRb33nvv5YvWJk2a5I+4bLXVVvmjlb/l+++/z39vKZcy5HK5ZObMmfk/IeY1kZ4lW2ONNZI+ffrk18PiZ8wgtjURcueddybrrbde/s0PxLYm0vdLK6+88qLCOFWnTp38SYZ0bhDTmkgfc/r06UmvXr0WFcapHj165K9KTS+3joHieLFfkjfeeGPSpUuX5MILL8xfYjN16tRkl112Sd58883MzrvtttuSQYMGJccee2xy6qmn5p9UO+64Y/Lll18uGvP2228nHTp0SN59993klFNOyZ/FShdJegT/wQcf/NUfzr///e9ko402yh/ZLNb666+fX4grrrhictBBB/1iLhDTmvjXv/6VbL311vn5pJ+ZSddEeoaglPUE5bQmFvfGG2/kH/Mvf/mLHzRRrol0zulj/eMf/0g++uijZPz48cnZZ5+dv4T0pJNO+p17hNjV1DUxd+7c/J+hA0Nplr5mLFiwICl7uUgMHTo0PZWaGzNmTMEx8+fPz82dO/cX2bRp03Krr7567q9//eui7JNPPslvq0GDBrlJkyYtyl999dV83rdv30VZ165dc5tuumluzpw5i7IFCxbkOnbsmGvV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AIie4hgAAIDoKY4BAACInuIYAACA6FXkcrlcMXuhoqIi+p3F0lPk03SJsiaKs/rqqwfzBx54IJh36NCh6J//uHHjgnnXrl2D+TfffJOUC2sCrAnwOgFV+97JmWMAAACipzgGAAAgeopjAAAAoqc4BgAAIHqKYwAAAKJXJ/o9UAm1a9fOZI0aNar0Lj3uuOOCecOGDYP5BhtsEMyPPfbYTHbJJZcExx5wwAHBfM6cOZnsggsuCI4988wzgznxaN26ddHPufbt2xe93VNPPTWYjx07tuy7UgOw5Cy//PKZ7JlnngmObdasWTD/4x//mMkmTJhQBbMDqpszxwAAAERPcQwAAED0FMcAAABET3EMAABA9Mq+Ide6666byerVqxcc27Fjx2C+3XbbBfPGjRtnsn322SdZ0iZNmhTMBw0alMn22muv4NhZs2YF87feeiuTPfvssyXPkTg0adIkk3Xv3r3anuOjR4+u9LYBqFlCjbCaNm1a0jamTZsWzHfYYYdMtuWWWwbHvv/++8FcU0iouZw5BgAAIHqKYwAAAKKnOAYAACB6imMAAACipzgGAAAgemXTrbpdu3bBfNSoUZmsUaNGSU20YMGCYD5gwIBgPnv27Ew2bNiw4NgpU6YU3c2xUHdG4tG6detgfuedd2ayioqKkra99957Z7IRI0aUtA0oJ/369Sv6rgsbbbRRMD/wwAOLfrz33nsvmG+88cZFbwM22WST4E444YQTMlnz5s0r/RoUujvJr7nggguCeZs2bYp+HZs8eXIwL7Q+IaR9+/aZ7KCDDgqO7dy5c6V/P5944onB/PPPPy/6rj133HFHcOyrr76a1HTOHAMAABA9xTEAAADRUxwDAAAQPcUxAAAA0VMcAwAAEL2y6Vb96aefBvNvvvlmmehWXah72/Tp0zPZDjvsEBw7b968YH777bdXcnZQmoMPPjiYh7qFPvbYY8Gxf//730vq/gk1UaizaKEuvoW6kO61116V7gKfy+WKHtuqVatg/s477xTd3Rd23HHH4E44/PDDK71z5s6dW3T33ELzOOWUUyq9fm655Zai33tCr169gjvhyiuvzGSrrrpqcGyh3/3PPPNMJmvatGlw7MUXX1zSD6Mi8JiFtr3//vsnNZ0zxwAAAERPcQwAAED0FMcAAABET3EMAABA9MqmIde3334bzPv375/JevToERz7xhtvBPNBgwYVPY8333wzmO+0007B/LvvvstkG2+8cXBsnz59ip4HVIWXXnopmLdr1y6YT5gwIZP17ds3OFbjLZYVa665Zia76667gmPXX3/9krYdagC5/PLLl9Ro5bXXXstkW2yxRVJdatUKHzcvNG/iNnDgwKLffxVy6623BvOpU6cG80suuaTosYVer0aOHBnMQ42QCm37vvvuC+bEoU6dcBm11VZbBfMbbrghmDds2DCTPffcc8GxZ599djB/4YUXMln9+vWDY++9995gvvPOOyfFGjt2bFKunDkGAAAgeopjAAAAoqc4BgAAIHqKYwAAAKKnOAYAACB6ZdOtupDhw4dnslGjRgXHzpo1K5hvttlmwfzwww8vqoNioa7Uhbz99tvB/Mgjjyx6G1CKPffcM5i3b98+mOdyuWD+z3/+M5PNmTPHD4NlQrdu3YruILrOOuskS1qbNm2C+ddff11UR91Us2bNgvnQoUOD+dprr130/N55552ixxKPQl3MGzRoEMwnTpyYyf73f/83OHbKlClFz6Nly5bB/LTTTgvmTZs2Lfr9WqGO3F7f4nbQQQcF8xtvvLGk7Tz11FOZrFevXsGxM2fOLHq7hbZRSlfq1KRJk5JiO8yXA2eOAQAAiJ7iGAAAgOgpjgEAAIie4hgAAIDoKY4BAACIXtl3q65sp7fUjBkzih57xBFHBPN77rknmC9YsKCkuUBlNW7cOJN16tSpSnbstGnTiupyWFX69OkTzEvpNHziiSdW4YxYlp100knBvCo6U8+dOzeYn3zyyZnslVdeCY59//33i368b775pqQ1UUpX6gkTJgTzgw8+uOhtEI/77rsvmO+6665Fd2W/4IILgmOPOeaYYN6oUaNMdtlllwXH7r777sH822+/DebnnntuJhsyZEhwLPE4++yzi+6EXuiOHtdcc00wHzBgQKVrlZBCXeBLdcIJJ2SyqVOnJuXKmWMAAACipzgGAAAgeopjAAAAoqc4BgAAIHqKYwAAAKIXZbfqUg0cODCYb7nllpmsc+fOwbHdunUL5k8++WQlZwel+emnn4p6Lqdq1apVUpf15557rtI/jr59+xY99vjjjw/mzZs3L3ob/fr1K6m77+TJk4veNkvHzjvvHMw7dOhQ6W1/+umnJXVyfvHFF5MlqZSu1IWMGDEimH/99deV3jbl58033wzmhbqyh7pV77jjjsGxO+20UzC//PLLM9m6666blOLMM88M5oMHDy5pO5SX008/PZiHOlPPmzcvOHbkyJFF370g9cMPPxQ9v+WWW67o171Ca6KioiKYn3POOSW9JpQrZ44BAACInuIYAACA6CmOAQAAiJ7iGAAAgOhpyFWE7777LpgfccQRmez1118Pjr3hhhuC+ejRozPZ2LFjg2OvvvrqYJ7L5YI5hISaxnXq1KmkxluFmhKV0rCnXbt2wTw0lz322COpijU7adKkTLbBBhsEx953333BfP/9989kEydOLGl+VK9CTdYaNmxY9DZeeumlkpr4VGfjrZVXXjmT7brrrsGx22+/fUnbDv07H3vssZK2Qdzmzp0bzGfOnFn0Npo1axbM77///qIbChV6L3TTTTcF8+HDhxc9P8pP48aNg/kxxxwTzEPPr0KNt3r27FnJ2SVJy5Ytg/mwYcOCeaHGqqW8v7nooouK3kY5c+YYAACA6CmOAQAAiJ7iGAAAgOgpjgEAAIie4hgAAIDo6VZdCePHj89khx56aHDs0KFDg/nBBx9cVJZafvnlg/ltt90WzKdMmRLMicOKK64YzNdbb72it/H5558H89tvvz2Yf/TRR5msdevWwbH9+/cP5nvuuWfRXbCffPLJYH7ppZcG80aNGmWyUaNGFT2WmuH6668P5quuumownzFjRib7y1/+Ehz7xRdfJEva3//+90x29tlnl7SNt99+O5jvt99+y8S/kfKzpLv4F+qyfskllwTzzz77rJpnxLKsXr16Jb1OhJxwwgnBfLXVVgvmhx12WDAP3ZFjk002CY5dYYUViu6mXaiD+x133FHSnT5i48wxAAAA0VMcAwAAED3FMQAAANFTHAMAABA9xTEAAADRq8gVamW2mIqKiuh3VmUU6jp32WWXZbKuXbuWtO3rrrsumJ977rmZbPLkyUlNVOTTdIla1tfEbrvtFswffvjhordx1llnlZSvvvrqmeyGG24Iju3evXswnz17dtHdsU888cRg3qpVq2D+z3/+M5OtueaawbGFHvP4449PlgXWRPn505/+FMzvvffeTFa3bt3g2Pnz5wfzvn37BvMhQ4Yk5cKaWDpq164dzO++++5gvs8++1T6MR999NGi10/MrInCGjduHMzffffdYN60adOi3wdWxX4vdLeQQo8Zei8zderUosfGIlfEz8aZYwAAAKKnOAYAACB6imMAAACipzgGAAAgenWi3wNLyLhx44L5fvvtV3RTiaFDhwbzo446quimRDvttNNvzJRy0bZt20pvo1DjrUIeeOCBTNa+ffuStrHnnntmsmeffTY4tkOHDsH8hRdeKPrxrrjiipKafUF1GT58eKWbu5xwwgnB/Prrr//d84JfU6jx1t57711tzYqWxUZT1CzTp08P5j179gzmjzzySCZr0qRJcOz48eOD+YgRI4L5Lbfcksm+/fbbktZbqMlWobH8OmeOAQAAiJ7iGAAAgOgpjgEAAIie4hgAAIDoKY4BAACInm7Vy2C3vNtvvz049sYbbwzmdeqEf4zbb799JuvSpUtw7DPPPPMbM6Wmady4cTCvqKgouoNiIe3atQvmLVq0KOrxUv369Qvmoc7UrVu3Do698847g3kpj1moWzVUl/POOy+Y16oVPl69YMGCorddqLM7lKJZs2aZ7LDDDguO3WeffUrqKP36669nsrfeeis4ttBjrrbaasEcKuvVV18N5k2bNl2iOzf0Hj7VuXPnol8nPv744yqfVwycOQYAACB6imMAAACipzgGAAAgeopjAAAAoqc4BgAAIHq6VS8hbdu2Deb77rtvJtt6661L6kpdyDvvvJPJnnvuuZK2QfkJdRAt1FW0VKFuiYW2XWhNfPrpp5lsueWWC4795JNPgnmnTp2C+YwZM4I5VJd69eplss0337ykrtShNdSnT5/g2A8//LDkOcLiunbtmsnOOuusknbUgAEDgvlVV12VyXr27FlSt+rQ+xsoJw0aNKj068Tdd99d5fOKgTPHAAAARE9xDAAAQPQUxwAAAERPcQwAAED0FMcAAABET7fqSthggw0y2XHHHRccu/feewfzNdZYo9JPwp9++imYT5kypegud5SfESNGBPP+/ftnsj333DM4tkOHDsG8Xbt2wXzFFVcsen69e/cO5hUVFZns66+/Do4dOHBgMJ88eXLR84Cq0LBhw2B+0EEHZbKddtqppG3fddddmWzYsGHBsX7HU4ouXboE80GDBhW9jT322COYP/3000W/7zn99NOTUkyYMKGk8VDTjBw5cmlPIVrOHAMAABA9xTEAAADRUxwDAAAQPcUxAAAA0dOQq4jmWAcccEAwDzXfatGiRbU9qcaOHRvMzz333GD+0EMPVdtcWPb9+OOPwfz7778vupnQiy++GMxzuVxSXWbNmpXJ7r333uDYxx9/vNrmAaU0nbvhhhuC+b777lv0juzbt28wv+qqqzKZxltUhULN4Ro1apTJnn322eDYRx55JJjXrVs3mPfo0aOoxyvUoDE1derUYA7lYpdddlnaU4iWM8cAAABET3EMAABA9BTHAAAARE9xDAAAQPQUxwAAAESv7LtVr7766pmsTZs2RXcETW244YZJdXn11Vcz2cUXXxwcO2LEiGCuaykhr732WtHd1//P//k/wbFdunSp9M699dZbg/l///vfYP7GG28U3SUVlrS11lqr0l2px48fH8wHDRr0u+cFv0eh9w+hOxIUuktBoa7UPXv2DOZXXnllJps2bVpw7I033hjMhwwZEsyhXKy//vpLewrRcuYYAACA6CmOAQAAiJ7iGAAAgOgpjgEAAIie4hgAAIDo1bhu1U2aNAnm1113XTBv167dEu0A99JLLwXzSy+9NJiPHDkyk/3www9VPi9Y6NFHHy0qg5gVuktBv379StrOBx98kMl222233z0vqEqrrbZa0WOnTp0azJ966qlg3qlTp6K3fdhhhwXzhx9+uOhtQDl5/vnng3mtWuHzmu5cU3WcOQYAACB6imMAAACipzgGAAAgeopjAAAAordMNORq3759MO/fv38m22abbYJj11prraS6fP/998F80KBBmey8884Ljv3uu++qfF4AVI9//OMfwbxXr14lbWfw4MGZbOLEib97XlCV3n333aLH7rvvvsG8oqIimH/77bfB/Oqrr85kTz/9dNHzgBiMGzcumH/44YfBPNRs+A9/+ENJzfX4f5w5BgAAIHqKYwAAAKKnOAYAACB6imMAAACipzgGAAAgestEt+q99tqrpLwU77zzTiZ75JFHgmPnz58fzC+99NJgPn369ErODoClbeONN85kK620UknbuP7664P5qFGjfve8oLrdeuutwbxevXpFd3AfO3ZsMH/ooYeC+eWXX17SHIHfvivOjTfemMnOPffc4Njjjz++6JopRs4cAwAAED3FMQAAANFTHAMAABA9xTEAAADRUxwDAAAQvYpcLpcrZi9UVFREv7NYeop8mi5R1gRLkzVRdS688MJM1q9fv+DYiRMnBvPu3bsH8/fff7+Ss6NY1gRYE+Wu0J0U7r333kzWrVu34NgHHnggmB922GHB/Lvvvktiep1w5hgAAIDoKY4BAACInuIYAACA6CmOAQAAiJ7iGAAAgOjpVk2NoAspWBPVpWvXrpls5MiRwbH77LNPMB8xYkSVz4vSeJ0AayJWoS7W5557bnDs0UcfHczbtm0bzN95552kXOhWDQAAAEVwWTUAAADRUxwDAAAQPcUxAAAA0dOQixpBoxWwJsDrBHjvBL+XhlwAAABQBJdVAwAAED3FMQAAANFTHAMAABA9xTEAAADRK7pbNQAAAJQrZ44BAACInuIYAACA6CmOAQAAiJ7iGAAAgOgpjgEAAIie4hgAAIDoKY4BAACInuIYAACA6CmOAQAASGL3fwENbVx2EVO37gAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axes = plt.subplots(2, 5, figsize=(10, 4))\n", + "for digit in range(10):\n", + " row = con.execute(f\"SELECT * FROM mnist WHERE label={digit} AND split='train' LIMIT 1\").fetchone()\n", + " pixels = np.array(row[:784]).reshape(28, 28)\n", + " ax = axes[digit // 5, digit % 5]\n", + " ax.imshow(pixels, cmap='gray')\n", + " ax.set_title(f'Label: {digit}')\n", + " ax.axis('off')\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAGdCAYAAABzfCbCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA8aElEQVR4nO3dCXxU1b0H8H9YEhBIICwJVAJhEZBV2UQUQSibRSK4gPQVlAcVAQVckD7ZlBahrfJQBLUWagsovMdSeIpF1qrsFi2KCIgCYlgbkGAguXPf53fsjDNhAnOSe5M5c3/fz+cSZnJy587cmfnfc87//m+cbdu2EBERGaZUSW8AERFRYTCAERGRkRjAiIjISAxgRERkJAYwIiIyEgMYEREZiQGMiIiMxABGRERGKlPSG0BERPpycnLk0qVLjrx08fHxUq5cOeN2AwMYEZGBwSs9PV0yMzMdWV9qaqocOnTIuCDGAEZEZBj0vDIzM+XIkUOSmJhYpHWdO3dOatdOV+tkACMiomKRmJhY5ABmMvbAiIiMlffvpajrMBMDGBGRsfI8HcCYRk9EREZiD4yIyFh5nu6BMYARERnLciAAYR1m4hAiEREZiT0wIiJj5XEIkYiITJTn6QDGIUQiIjIShxCJiIyV5+keGAMYEZGxLAeyCJmFSEREVKw4B0YRWbBggcTFxclXX33lyiuG9WL9eJwr2bhxo2qHn6aL9Dk75fz581KjRg1ZuHChI/u/c+fOaiksrG/KlClXfIxIOf2+mDdvnqSlpcnFixfFjPPA8oqwsAcW1V5++WX15m7fvn1JbwqVoGPHjqkvzN27d0ftfnj77bdDvtSd9N///d9SqVIlGTBggHjBokWLZNasWYX62yFDhqjLi7zyyisS3fIcWszkiR4Yjjjr1q0r27dvlwMHDpT05hjpP/7jP+T777+XOnXqlOh2dOrUSW0HfhYmgE2dOjVqAhheSzwXvLbBAQzb6LTc3FwVwP7zP/9TSpcuLbH2Hgv3vihKAMN1sQYPHizPP/+82LZdqHWQ+2I+gOEqox9++KF6I1avXr1QwydF5fP51BVUTYYvPXyo0ZMtSaVKlVLbgZ+mw2uJ51IcAWX16tVy8uRJuffeeyUW32NuvC/wWn399deyYcMGiV557IHFMgSsKlWqyB133CF33313SADDUWlycrI88MADYa9Sig/E448/HrgP4+GTJ0+WBg0aSEJCgtSuXVuefPLJy8bJ8QEcNWqUeqymTZuqtmvWrFG/+93vfic333yzVK1aVcqXLy+tW7eW//mf/7ns8XE0+cgjj0i1atXUsM+dd94p33zzzWXzBoD7H3zwQUlJSVGPhcf84x//GNHrE7ytjRo1Us8Z27R58+aQdvnnJ9avX6++LCZNmhTSDke9aDd37lxHti+SuQ7MwzRr1kw+++wz6dKli1xzzTXyk5/8RGbOnBnyd23btlX/x/7GOvLPP23btk169uwpSUlJah233XabfPDBByGPj9cef4eePIaZKleurNpjnRcuXAhpu3btWrnllltUm4oVK6rX91e/+lWBc2BY35w5cwL7xb+gB4ARhL59+172euDACI//y1/+8oqv24oVK9Q66tevH3L/J598oh63Xr16at/j0vLYV6dPnxan4PMxduxYdQDpfy8fPXr0snbh5sBw8IfXvFatWmqfYP9iP+O5YLsLel/gPfF///d/KgD5X0f8jd+LL76o3odYJ74f2rRpo967wfA5wPfDypUrJXrleTqAxXwaPb6Y+/XrJ/Hx8TJw4ED1xbpjxw71ZVa2bFm56667ZNmyZWqsG22CP/D44PnnC/BBwgfv/fffl+HDh0uTJk3kn//8p7zwwgvyxRdfqPbB8AW/ZMkSFRwQhPwfHgzjYD2DBg1SY+xvvvmm3HPPPeoIGUHWDx9O/D2GVW666SbZtGlTyO/9jh8/rn7vD0T4knjnnXdk6NChKgiPGTPmqq8R1v3WW2+pgIkAgzlDfJFjyBWBIZzbb79dHn74YZk+fbpkZGTIjTfeKN9++62MHj1aunXrJg899JBj2xeJf/3rX2qbsa9x5IyDgvHjx0vz5s2lV69ean8988wzKuBi/916663q73Aw4d9faIcvLRykIDjPnz9fPc+///3v0q5du5DHw2Okp6er5//RRx/JH/7wB5UgMWPGDPX7Tz/9VH72s59JixYt1OPidUXQyx8QgyEIYZgTge/Pf/5z4H68dj//+c9VQD5z5oz6UvVbtWqVeh3x+yvBKAT2UX54rC+//FIFYAQvbPerr76qfm7dutWRHjeGLf/yl7/I/fffr15vvNbh3svhTJgwQT3vPn36SI8ePeTjjz9WP682ovFf//VfcvbsWRUo8RkFHETAa6+9pt7rOKB99NFH1boQ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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Pixel intensity heatmap averaged across all training images\n", + "avg_pixels = con.execute(\"\"\"\n", + " SELECT {} FROM mnist WHERE split='train'\n", + "\"\"\".format(', '.join(f'AVG(px{i}) as px{i}' for i in range(784)))).fetchone()\n", + "\n", + "plt.figure(figsize=(5, 5))\n", + "plt.imshow(np.array(avg_pixels).reshape(28, 28), cmap='hot')\n", + "plt.title('Average pixel intensity (all digits)')\n", + "plt.colorbar()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DuckDB connection closed. Database saved at: ..\\data\\mnist.duckdb\n" + ] + } + ], + "source": [ + "con.close()\n", + "print('DuckDB connection closed. Database saved at:', db_path)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "MNIST (Python)", + "language": "python", + "name": "mnist" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/02_model_training.ipynb b/notebooks/02_model_training.ipynb new file mode 100644 index 0000000..9551608 --- /dev/null +++ b/notebooks/02_model_training.ipynb @@ -0,0 +1,533 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 02 - MNIST Model Training & Visualization\n", + "\n", + "This notebook trains a neural network on MNIST data loaded from DuckDB, then visualizes:\n", + "- Training loss & accuracy curves\n", + "- Confusion matrix\n", + "- Per-digit accuracy\n", + "- Misclassified examples\n", + "\n", + "**Key ML Concepts Covered:**\n", + "- Neural network architecture (layers, activations)\n", + "- Forward/backward propagation\n", + "- Loss functions & optimizers\n", + "- Batch training with DataLoaders\n", + "- Overfitting detection (train vs validation)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import duckdb\n", + "import torch\n", + "import torch.nn as nn\n", + "from torch.utils.data import DataLoader, TensorDataset\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from sklearn.metrics import confusion_matrix, classification_report\n", + "from pathlib import Path\n", + "from tqdm.notebook import tqdm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Load Data from DuckDB" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train: (60000, 784), Test: (10000, 784)\n" + ] + } + ], + "source": [ + "con = duckdb.connect(str(Path('../data/mnist.duckdb')), read_only=True)\n", + "\n", + "train_data = con.execute(\"SELECT * FROM mnist WHERE split='train'\").fetchnumpy()\n", + "test_data = con.execute(\"SELECT * FROM mnist WHERE split='test'\").fetchnumpy()\n", + "con.close()\n", + "\n", + "# Extract pixel columns and labels\n", + "px_cols = [f'px{i}' for i in range(784)]\n", + "X_train = np.column_stack([train_data[c] for c in px_cols]).astype(np.float32) / 255.0\n", + "y_train = train_data['label'].astype(np.int64)\n", + "X_test = np.column_stack([test_data[c] for c in px_cols]).astype(np.float32) / 255.0\n", + "y_test = test_data['label'].astype(np.int64)\n", + "\n", + "print(f'Train: {X_train.shape}, Test: {X_test.shape}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Create PyTorch DataLoaders\n", + "\n", + "DataLoaders handle batching and shuffling. Batch size is a key hyperparameter:\n", + "- **Smaller batches** → noisier gradients, can help escape local minima\n", + "- **Larger batches** → smoother gradients, faster training per epoch" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "BATCH_SIZE = 32\n", + "\n", + "train_ds = TensorDataset(torch.tensor(X_train), torch.tensor(y_train))\n", + "test_ds = TensorDataset(torch.tensor(X_test), torch.tensor(y_test))\n", + "\n", + "train_loader = DataLoader(train_ds, batch_size=BATCH_SIZE, shuffle=True)\n", + "test_loader = DataLoader(test_ds, batch_size=BATCH_SIZE)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Define the Neural Network\n", + "\n", + "Architecture: 784 → 256 → 128 → 10\n", + "\n", + "**Key parameters to experiment with:**\n", + "- Hidden layer sizes (try 64, 128, 256, 512)\n", + "- Number of layers (try 1-4 hidden layers)\n", + "- Activation function (ReLU, Sigmoid, Tanh)\n", + "- Dropout rate (regularization to prevent overfitting)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using device: cpu\n" + ] + } + ], + "source": [ + "class MNISTNet(nn.Module):\n", + " def __init__(self, hidden1=256, hidden2=128, dropout=0.2):\n", + " super().__init__()\n", + " self.net = nn.Sequential(\n", + " nn.Linear(784, hidden1),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " nn.Linear(hidden1, hidden2),\n", + " nn.ReLU(),\n", + " nn.Dropout(dropout),\n", + " nn.Linear(hidden2, 10)\n", + " )\n", + "\n", + " def forward(self, x):\n", + " return self.net(x)\n", + "\n", + "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", + "print(f'Using device: {device}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Training Loop\n", + "\n", + "**Hyperparameters:**\n", + "- `lr` (learning rate): How big each optimization step is. Too high → diverges. Too low → slow.\n", + "- `epochs`: Number of full passes through the training data.\n", + "- `optimizer`: Adam adapts learning rate per-parameter. SGD is simpler but needs tuning." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model parameters: 235,146\n", + "MNISTNet(\n", + " (net): Sequential(\n", + " (0): Linear(in_features=784, out_features=256, bias=True)\n", + " (1): ReLU()\n", + " (2): Dropout(p=0.2, inplace=False)\n", + " (3): Linear(in_features=256, out_features=128, bias=True)\n", + " (4): ReLU()\n", + " (5): Dropout(p=0.2, inplace=False)\n", + " (6): Linear(in_features=128, out_features=10, bias=True)\n", + " )\n", + ")\n" + ] + } + ], + "source": [ + "# === HYPERPARAMETERS (experiment with these!) ===\n", + "EPOCHS = 15\n", + "LEARNING_RATE = 1e-3\n", + "HIDDEN1 = 256\n", + "HIDDEN2 = 128\n", + "DROPOUT = 0.2\n", + "\n", + "model = MNISTNet(HIDDEN1, HIDDEN2, DROPOUT).to(device)\n", + "criterion = nn.CrossEntropyLoss()\n", + "optimizer = torch.optim.Adam(model.parameters(), lr=LEARNING_RATE)\n", + "\n", + "print(f'Model parameters: {sum(p.numel() for p in model.parameters()):,}')\n", + "print(model)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "40c8fa44b05646f6a477aa9682899b80", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Training: 0%| | 0/15 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))\n", + "\n", + "ax1.plot(history['train_loss'], label='Train')\n", + "ax1.plot(history['test_loss'], label='Test')\n", + "ax1.set_xlabel('Epoch')\n", + "ax1.set_ylabel('Loss')\n", + "ax1.set_title('Loss Curve')\n", + "ax1.legend()\n", + "ax1.grid(True, alpha=0.3)\n", + "\n", + "ax2.plot(history['train_acc'], label='Train')\n", + "ax2.plot(history['test_acc'], label='Test')\n", + "ax2.set_xlabel('Epoch')\n", + "ax2.set_ylabel('Accuracy')\n", + "ax2.set_title('Accuracy Curve')\n", + "ax2.legend()\n", + "ax2.grid(True, alpha=0.3)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Confusion Matrix\n", + "\n", + "Shows which digits get confused with each other (e.g., 4↔9, 3↔5 are common)." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "model.eval()\n", + "all_preds, all_labels = [], []\n", + "with torch.no_grad():\n", + " for X_batch, y_batch in test_loader:\n", + " preds = model(X_batch.to(device)).argmax(1).cpu()\n", + " all_preds.append(preds)\n", + " all_labels.append(y_batch)\n", + "\n", + "all_preds = torch.cat(all_preds).numpy()\n", + "all_labels = torch.cat(all_labels).numpy()\n", + "\n", + "cm = confusion_matrix(all_labels, all_preds)\n", + "plt.figure(figsize=(8, 6))\n", + "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',\n", + " xticklabels=range(10), yticklabels=range(10))\n", + "plt.xlabel('Predicted')\n", + "plt.ylabel('Actual')\n", + "plt.title('Confusion Matrix')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.9798 0.9908 0.9853 980\n", + " 1 0.9877 0.9930 0.9903 1135\n", + " 2 0.9872 0.9700 0.9785 1032\n", + " 3 0.9861 0.9832 0.9846 1010\n", + " 4 0.9825 0.9725 0.9775 982\n", + " 5 0.9898 0.9798 0.9848 892\n", + " 6 0.9864 0.9875 0.9870 958\n", + " 7 0.9806 0.9815 0.9810 1028\n", + " 8 0.9785 0.9805 0.9795 974\n", + " 9 0.9679 0.9861 0.9769 1009\n", + "\n", + " accuracy 0.9826 10000\n", + " macro avg 0.9827 0.9825 0.9825 10000\n", + "weighted avg 0.9826 0.9826 0.9826 10000\n", + "\n" + ] + } + ], + "source": [ + "print(classification_report(all_labels, all_preds, digits=4))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. Misclassified Examples\n", + "\n", + "Seeing what the model gets wrong helps understand its weaknesses." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABHoAAAHuCAYAAADgAGuHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAABVF0lEQVR4nO3dB7gU1fk44HMpKvaKigo2MJbYwF7R2IItscQWK3ZR7EosMZbYW+xGsZdYsUSNGtvPGrBrjB1FwYpRVEBh/8/Z+d8Alxm4c9nL7s593+e5D/DNzsy5u3uY2W/POV9DqVQqBQAAAADqXrtqNwAAAACAypDoAQAAACgIiR4AAACAgpDoAQAAACgIiR4AAACAgpDoAQAAACgIiR4AAACAgpDoAQAAACgIiR4AAACAgpDoAYDp7JprrgkNDQ3lP1tbPM/6668f6uX3v/nmm8PKK68cZptttvJj+vfvX44vuuii5Z9qtIkpa+3XBgDIR6IHAHL48MMPywmB+LPAAguEn3/+OfVx//73v//3OB+Cm+fZZ58NO++8c/j222/D/vvvH0488cSw6aab1uT7MybPGl/frJ/HH3+82s0EANqgDtVuAADUow4dOoTPPvss/P3vfw9bbrnlZNuvuuqq0K5d+vcpv/nNb8Lqq68eFlxwwdAWZf3+999/fyiVSuG6664La6655iTbHn300VCLDj/88DDrrLOmbpPgAwCqQaIHAFogJiJeeeWVcPXVV0+W6ImjfG644Ybwq1/9KjzxxBOT7TvHHHOUf9qqrN//008/Lf/ZpUuXybYtscQSoRYdccQR5ZFdAAC1wtQtAGiBTp06hR122KE8CuXzzz+fZNt9991XHu2z55575loP5sUXXwzbbrtt6Nq1a5hxxhnDfPPNF1ZZZZVw6qmnTnaMeM44mmSppZYqt2XuuecOq622Wjj77LOn2va33347HHXUUeW1cOaZZ54w00wzhR49eoRjjjkmjBo1arLHDx8+PBxyyCGhe/fu5XPNOeecYemllw777bdf+O9///u/x8W/n3DCCWGZZZYpj3KZffbZw5JLLhl22223MHTo0MzfP05xiv8eOHBg+d+LLbbY/6Y/xalyU1oHJo4Aism2tdZaq3y+mWeeOfTq1ascS/P111+X2z3//POXHxuf37vuuiu0pnfffbe85tDCCy8cvvrqq2Zti+3faqutyr9zfH3i67vJJpuExx57bLLjNz5/f/zjH8MzzzwTevfuXT5mfP8ccMAB4ccffyw/Lr5X11hjjTDLLLOUf//4Hmg69XDi12bQoEFh1VVXLT9P8Vjx/Rzf182V57UZPXp0OOecc8IKK6xQTgLGNsbfffvtty8nVAGA5pPoAYAWih984wfl66+/fpJ4/CAbP5hvvfXWzT7Wyy+/XB4l9MADD4S11147HHbYYeWkT/xwfMUVV0zy2P/85z9hxRVXDOeee27o3LlzOPjgg8NOO+1Ufuxpp5021XPdeeed5alliy++eDkJExMfsb1nnHFG2GijjcJPP/30v8f+8MMP5Q/qf/nLX8qjavr16xd23333cmIo/t5ffPHF/z7Ux0TEySefXD7WPvvsU/5ZaaWVwj333BPeeeedzPbED/RxPZ74IT+KSaX47/gTk0pZ4jnjmj577bVXuR3xOejbt2/4/vvvy7E42mZi8XeJa+tcfvnl5d8lnicmyn73u9+F22+/PbSWmOyKz98nn3xSbl+j+DzvuOOO5XbF5zIm3RodeOCB5aRKHBV26KGHhs0337y8hlH8d0zApHn++efDhhtuWE6U7LvvvuWE4aWXXhr23nvvcOutt5bfT926dStvi8/rWWedlfl+ueOOO8J2221XbntcEPuXv/xlOREX35sjR46c6u+c97WJ78PG2B577BEOOuigcn946qmnwr/+9a9mP9cAQHIhBgCa6YMPPijFy+cmm2xS/vdyyy1XWnbZZf+3ffjw4aUOHTqU+vXrV/73jDPOWOrWrdskxxg4cGD5GPHPRocddlg5dvfdd092zi+//HKSf/fq1av82CuuuGKyx3788ceT/Ds+br311pskNmzYsNKYMWMm2/ekk04qP/6GG274X+yee+4px/r37z/Z47/77rvS6NGjy39/9dVXy4/beuutJ3tcfEx87JR+/2i33XYrx+Nz3FR8Dps+j/H3j4/fY489SmPHjv1fPP5uW2yxRXnb4MGD/xc/8cQTy7G99957kuM8+OCD5Xham7LE5zQ+/vDDDy8ft+nPn//858n22WGHHcr7XHLJJeV/H3nkkeV/H3vssZM99v33358s9umnn5a6dOlS6t69+yTxxx577H/tn/j9E5+T5ZdfvtTQ0FCad955Sy+88ML/tn377belzp07l+aee+5JnrvG1yb+xOdl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ttkmNX7rrbdm7rP55punxh988MHQlumz1fXaa69lblt66aVT43fffXfmPttuu22oloUXXjh32dcp/S79+vXLVV72iSeeyDzWnnvuGYpCnyWvzp07p8affPLJzH3mmGOO1PiKK66Yuc9nn33mxUmhz9aumWeeOTV+77335v4MeMopp6TGn3766cxj/fjjj6G1ZZVKjz7//PNc+6y33nqZx3p6Cr9nEfusET0AAAAABSHRAwAAAFAQEj0AAAAABSHRAwAAAFAQEj0AAAAABZFeSorJ9O/fP/VZ+c1vfpP5bN1yyy2tXl2rXbt2uc//0EMPpcb/+te/Vqxd0NbdcccdqfG33347c5+VVlopNd7Wq24xfXTp0iU13q1bt8K8BMOGDcvcllWN5JhjjsncJ+91c6GFFsr1eGgrNttss9R4jx49Mve5/fbbc1fWyqrUk1Vd97vvvss8FkwPP/zwQ2p8ww03LMwLcPjhh+fus++++25q/K233qpYu+qdET0AAAAABSHRAwAAAFAQEj0AAAAABSHRAwAAAFAQEj0AAAAABaHqVjOrixx88MGp8ddeey3zyT3ppJNCa1t44YUzt2277bap8V/84hep8RtuuCHzWKNHj25B66D1ZVWx2X777VPj66+/fuaxRo4cmRq/7bbbUuNPP/107nbNOuusmfvcddddmdugtWW9NxsaGnIf68Ybbwz15sQTT0yNzz333Jn73HvvvbnOkVUlBNqKWWaZJTX++9//PvexzjzzzFwVtKZUkXb++edPjf/617/OPNbXX3891TYCE/Tq1Sv16Tj66KNzP02XXnppavyrr77ylP9/RvQAAAAAFIREDwAAAEBBSPQAAAAAFIREDwAAAEBBSPQAAAAAFIREDwAAAEBBKK/exDHHHJP6RC2yyCKp8XPOOSfzyX3rrbdCpXTs2DE1fuqpp+Y+1meffZYaV0KdapttttlS49tuu23mPueff36uktBffvll5rGySrLutttuqfHhw4dnHuvjjz9OjT///PPT5f8MyOvtt99OjY8cOTJzn06dOqXG33zzzcK8ABdddFHmth133DE1Puecc7Zii6B+HXrooanxDTbYIDX+2GOPZR5r8ODBqfGNN944c58tttgi5JF1/x8prw6Ta9cuexzJJptskuteIvrvf/+b+/8GEkb0AAAAABSERA8AAABAQUj0AAAAABSERA8AAABAQUj0AAAAABREm6y6teSSS2Zu22OPPVLj9913X2r8wgsvDNND1qr/u+yyS+5jDRo0qAItgsrr3bt3anzTTTfNXXXrqquuSo1/9NFHmceaYYYZclUJuOeeezKPteCCC6bGv/3228x9unXrlhofOnRo5j7Q2s4444zMbRdccEFqfMstt8zc56yzzgr15IMPPsjc9uOPP+aqupVV2W9K237++eepthFqyXLLLZe5bZ999sl1rKuvvjpz27zzzpsa/8tf/hLyyqqiOWLEiNzHgrZsr732ytx20kkn5T7esccemxp/9dVXcx+rrTGiBwAAAKAgJHoAAAAACkKiBwAAAKAgJHoAAAAACkKiBwAAAKAg2mTVrS222CJz24wzzpgab9euujmx7bbbrmLHuu222yp2LMhrrbXWytx2/fXXp8Z32mmnzH3uv//+ir0IY8eOTY3POuusuY/1/vvvp8bXXXfdzH2ef/751PhWW22V6/FQSc8991zmtqwqclkVLKOvv/46V6W86WX99ddPjR999NG5q+tlWW+99TK3rbPOOqnxxx57LNc5oNI6duyYqyLmJZdcknmshRZaKNe577rrrsxtWRUxu3fvHvIaN25c7kp5WZ8ZxowZk/v8UBSbb7557n2mVBH32muvncYWtV1G9AAAAAAUhEQPAAAAQEFI9AAAAAAUhEQPAAAAQEFI9AAAAAAUhEQPAAAAQEE0lEqlUrMe2NAQimKZZZbJ3PbKK6/kKq84pbKPp512Wmp88ODBqfEll1wy81gvvfRS7rLPf/3rX1Pj++67b2p8/PjxoS1o5lu+7tVqn51SqeYZZpghd0ni7777LlTKZpttlqsvffbZZ7mPtdpqq2Xuc/755+cq4bzSSitlHuutt94KRaHP1q7rr78+Nb7TTjvlPtawYcNS45dddlmYHrKu2VO6Nl533XW5ysv/6le/yjzWQw89lBrfZpttMve5++67Qy3SZ+vPHHPMkbkt6153/fXXD23Zxx9/nBrv27dv5j4PP/xwqEX6LHmtuOKKqfEhQ4bkfp/169cvc59LL73Ui9PCPmtEDwAAAEBBSPQAAAAAFIREDwAAAEBBSPQAAAAAFIREDwAAAEBBtMmqW1Pyhz/8ITV+8skn535evvnmm9T4Cy+8kBpfc801M4+VVV1r3LhxmfssvPDCqfERI0aEtkxlgeq6/fbbM7c9/vjjqfGLLrqoYufv2rVr5rann346NT527NjU+FprrZV5rJb0s6zKe//4xz9ytSvaeOONU+MfffRRqDf6bO3q2LFjanzllVfOXcGnc+fOoZpefPHF1Ph5552X+3cZPXp0rgqe0UknnZQab9cu+zu5Y489NtQifbb+qmudffbZmfvstddeuc7x/fffZ27LOs+3336bGt9xxx0zj9WrV69QTe+//35q/Morr8zc54wzzmjFFrWcPkuWWWaZJTV+0003pca33HLLzGM98sgjqfGNNtrIC5CTqlsAAAAAbYipWwAAAAAFIdEDAAAAUBASPQAAAAAFIdEDAAAAUBASPQAAAAAFobx6M+2www6p8TPPPDNzn0UWWSS0tqxy1FHv3r1b/fz1SAnJ6ppSOdSs0uv9+vXL3Ofee+9Njffp0yc1fs4552Qea9SoUbn6/7vvvhumh7xl16dUer1nz54tKolbTfpsscw333yp8f322y81vthii+U+x5gxY1LjJ598cu7+n1X2udJmmGGG1Phtt92Wuc+rr76aGj/++ONDNemz1dWxY8fMbZdccklFSqhPyeGHH5657bzzzkuNzzTTTKnxTz75JPNYc801V+73X1afefTRR1Pj9913X+axXnzxxar+n1FJ+ixZDjzwwNT4BRdckOv6G/Xt2zc1fvPNN3sBclJeHQAAAKANMXULAAAAoCAkegAAAAAKQqIHAAAAoCAkegAAAAAKQtWtVqqSEbVv3z41vuyyy6bG//Wvf+WuBrLccstl7jN06NDMbW2ZygK1609/+lNq/Ljjjsvc584770yNb7755qnxTz/9NPNYa6+9du59qimrGteUqoE88cQTmftsv/32qfEff/wxVJM+S1t2xx135K5i2K1bt1BN+mx1LbPMMpnbXn/99Yqd54YbbkiN77HHHpn7jBs3LjW+2267pcavueaa3O+zBx54IHOfrIqcbZ0+27ZN6X5yyJAhqfFZZpklNX7qqadmHuvEE09sQetIo+oWAAAAQBti6hYAAABAQUj0AAAAABSERA8AAABAQUj0AAAAABREh2o3oN6NHTs29z6zzjpr7n1GjBiRGldZiyI588wzU+Prrrtu5j49evRIje+33365qnRF3377bagn7777bua27bbbLjV+++23Z+7z3HPPpcZXXXXV1PiYMWOm2kZg2rz33nuZ2zbbbLPU+Lbbbpu7/1McRx11VEWP98EHH6TGjz/++FyVtaZkvvnmy11Z5vrrr89d9QvasoaGhtT4gAEDMvfJqq6V5d57783dLlqHET0AAAAABSHRAwAAAFAQEj0AAAAABSHRAwAAAFAQEj0AAAAABSHRAwAAAFAQyqtXwZFHHpl7nwcffLBV2gK1ZNSoUanxTTfdNHOf8ePHp8bHjh0b2rKHHnooNb7KKqtk7vPiiy+mxu+7777U+CabbJL7dQHyOeOMMzK39e7dOzW+yy67pMaVVy+WeeaZJ9f7YkqmdM3caaedUuNDhw4NlbLQQgulxseMGZO5zy233JIad/2BdNtss01qfNddd839lF1zzTWp8cGDB3v6a4QRPQAAAAAFIdEDAAAAUBASPQAAAAAFIdEDAAAAUBASPQAAAAAFoepWK1pxxRVT4xtttFFrnhYKZ/To0dVuQmG89dZbmdv22muv1Pj111+fGj/ooIMyj3XhhRe2oHWQT8eOHVPjSyyxRO6n8rTTTkuNl0qlzH2yqljdfPPNoVL69++fuW2llVZKjV999dUVOz/19/6faaaZch+rT58+mduef/750NrOPPPM1Pi1116buc/LL7/cii2C4unevXvFjnXKKaeE6eF3v/tdavzWW2+dLuevZ0b0AAAAABSERA8AAABAQUj0AAAAABSERA8AAABAQUj0AAAAABSERA8AAABAQSiv3opmmWWWXOUwR40alXmsG2+8sWLtAshTErpz586p8XPPPTfzifz4449T43fddZcnn4o58MADU+Nnn3127mM1NDTkLq9+6qmnpsYXWmih3Offa6+9UuO77LJL5j7jxo1Ljf/www+5z0/9GTFiRGp8/vnnD/Vm+PDhueJAfqusskrFyqhn3efNOOOMmcf67W9/mxo/7rjjMvc5+OCDp9pG0hnRAwAAAFAQEj0AAAAABSHRAwAAAFAQEj0AAAAABSHRAwAAAFAQqm61oi+++CJXNYwhQ4ZkHuu5556rWLsA8rjoootS49tuu23mPueff35qXNUtKmno0KGp8e+++y41Pttss1X0/C+88EJobT/++GPmtksuuSQ1fu2117ZiiwCoR2ussUbufeaee+7U+NJLL50av+mmmzKP1a1bt1wVLKMnnnhiqm0knRE9AAAAAAUh0QMAAABQEBI9AAAAAAUh0QMAAABQ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K6wQwqBBE0YFRP/4Rwgff5x8SwLUTp+N57nrrkl/+vVLtsV1P2680asFtdRnG0cU3HLL5Gtafv99CCut5PWCWuqzrrPTxIie1hQXZ4wlG7fZJvmQ9soryZt/3nknfVycKxwvMptvHsLuuyff7McLzmuvhXD77cmQ8MZ9YkWea68N4YMPpryAVTzeKackZZrjt40x8XPTTSG8/noIp50WwgILtOqvDnWpmn02Ou+85LyxWl6sVBDXE4iLp8ebU+sGQG312Y03njzWOFIhTgWJ634AtdNn4xp4yy4bwp/+lIzGi2vgvftuCBddlFS13GsvrxY05TpbtyR6WtPeeycXnauuCuHBB5O5/A8/HMKGG076uJlnTipixQRMXLE8llWOc4Xjh7tYWjkO/87rl78MYZllQrjhhhC++CIZxROrDPztb0llAaC2+mwUR9rF8x5/fAgDBiTn2XrrEM48c9IFmoHa6LNA/fTZeC/81FNJqeb77w/h5ptDmG225Dobz9M02QS4ztaxhlIpTkwFAAAAoN5ZowcAAACgICR6AAAAAApCogcAAACgICR6AAAAAApCogcAAACgICR6at2ii4aw++7VbgXQXPos1Bd9FuqLPgv1RZ+tComeKbnmmhAaGib8zDRTCD16hHDQQSF89lmoeZ9+GsIuu4Sw1FIhzDZbCHPOGcKqq4Zw7bUhlErVbh1UXr332Wj8+BDOPDOExRZL2r/88iHcfHO1WwWtowh99t13Q9h22xDmmiuEmWcOYe21Q3jssWq3ClpHEfqs6yxtSRH6rOtsi3Ro2W5tzJ/+lHzoGj06hP/7vxAuvTSEv/89hNdfT27qatWXX4YwbFhyA9q1awg//RTCww8nI4T+858QTjut2i2E1lGvfTb6wx9COP30EPbeO4RVVglh0KAQdtopuTjvsEO1Wweto1777Mcfh7DGGiG0bx/CkUeGMMssIQwcGMLGG4fw6KMhrLtutVsIraNe+2zkOktbVK991nW25UpkGzgwjnsplf71r0njhx2WxG+6KXvfUaMq88x261Yq7bZbZV+lzTcvlWaZpVT6+efKHheqrd777LBhpVLHjqXSgQdOiI0fXyqts06ptPDC+izFU+999oADSqUOHUqlt96aEPv++1JpkUVKpZVXrkz7oJbUe591naWtqfc+6zrbYqZutcQGGyR/fvBB8mccITPrrCG8914Iv/51Mk1q550nDA89//wQll02GSo3//wh7LtvCCNHNs24hXDKKSEsvHCSVe3dO4Q33kg/fzxP/JmWeZI//BDC2LEtPwbUk3rps3H0Thx5d8ABE2JxJM/++yej8559tmW/P9SbeumzTz0VwkorJVOkG8Vjb7llCC++GMI777Ts94d6Uy991nUW6qvPus62mKlbLdH4ppxnngmxn38OYZNNkrn5Z589YQhc7ARxbuQee4Rw8MFJZ7roohBeeimEp58OoWPH5HEnnJB0jNix4k+8QYxDv9OSMRtumPz54YfNa++PP4bw/fchjBoVwhNPJMPK41DzTp1a9OtD3amXPhvPEad+LL30pPG4tlbj9theKLp66bNjxiRr8zTV2LYhQ0Lo3r0lzwDUl3rps66zUF991nW2xSR6muO//03Wu4lzGuObOc5xjEmSzTef9E243XYh/PnPE2Jx/uNf/xrCjTcma2w0itnNTTcN4bbbkvgXXySLr/bpE8K99ybf4DfOIa7EOjoXXBDCscdO2rFisgeKql777PDhybckjcdrtOCCExZYhyKq1z4bR/LEbxu/+y759nPidkWffNLyY0Mtq9c+6zpLW1WvfdZ1tsVM3WqOX/0qhPnmC2GRRZLFUOOwtrvuCmGhhSZ9XJxeMbH4xp9jjhA22ijpWI0/PXsmx2isyvHII0mms1+/ST/g9e+f3p6Y+WzuaJ5oxx2TRZhvumlCB42jfKCo6rXPxn4544yTx+Mw2cbtUET12mdje775JoTf/S75ZvPtt5NjDh6cbNdnKap67bOus7RV9dpnXWdbzIie5rj44qQMXYcOybftMbPYrkmOLG6L8xEnFufmx+xp587px/388+TPoUOTP5sO746dMW1IeF7duiU/jUmfffZJOnusvGX6FkVUr3029sf4bUpT8duXxu1QRPXaZzfbLIS//CWEY44JYeWVk9iSS4Zw6qkhHHVUchMMRVSvfdZ1lraqXvus62yLSfQ0R1wfo1evKT8mfgvftLPEhatip4hD3dLEN341xHLrV14ZwpNPJvMwoWjqtc/GKVrxm5G4mN3E34bEoeZRly6te36olnrts9FBByXrFrz6aggzzBDCiiuGcNVVybZ4Uw1FVK991nWWtqpe+2zkOtsiEj2taYklkmFsa6015W/iG0fbxIzp4otPiMe5jk1XM6+ExqHk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T58+mfvsscceqfGBAwfmPj9UypTuJ7feeuvUeL9+/XL38XHjxuX+PLvKKqtkbmPKjOgBAAAAKAiJHgAAAICCkOgBAAAAKAiJHgAAAICCkOgBAAAAKAhVt6bRqFGjMrd99dVXFavsscYaa6TGu3fvnrnPG2+8kfs8UIs22WSTzG1TqlZXKV26dEmN33333bmPNaVqJDPOOGNqfNiwYanx+eabL/NYU/q/Ia8vv/wyNT506NDMfVZdddWKnZ+2LauCVrT33nunxrfZZpvU+LzzzluxakCVltXPn3jiieneFmiOXXfdtWJ96YUXXsjVl6Phw4enxj/55JPMfUaOHFmxqltZfvjhh8xtI0aMqNh5IK8NN9wwNX7rrbdm7jPXXHPlOseNN96Yue2UU05Jjffo0SNzn0GDBuU6PxMY0QMAAABQEBI9AAAAAAUh0QMAAABQEBI9AAAAAAUh0QMAAABQEKpuTaPXX389c1tWRZ699tor93myKnUdcMABmfsceOCBuc8D1ZRV3WqFFVbI3Kdv376p8V69eqXGP/roo8xjff7556nxq6++OncFrYaGhtT4kksuGfK69tprU+Pt27fP3GfAgAGhUrIqFWVVSYGW6NSpU2r89NNPz9xns802q9iT/dlnn6XGTzjhhNwVRKZUES/LP/7xj9z7QFFcddVVqfEff/wxc5/ZZpstNT7nnHPmvmeopH/+85+Z2x544IFWPz9svfXWqU/CLbfckhrv2LFj5pP27bffpsb33HPP1Ph9992XeayffvopV3un5N577829T1tjRA8AAABAQUj0AAAAABSERA8AAABAQUj0AAAAABSERA8AAABAQUj0AAAAABSE8uqtKKvsakvKq2fZcsstM7ddccUVqfFXXnmlYueHSrr++utT4+uvv37mPpdffnlqvGvXrqnxnXfeOXd59VGjRqXGt91228xjtWuXnkeff/75Q15PPvlkanyRRRbJ3CerbYsttljmPlnlNR966KFcpTVhSpZccsnU+CWXXJIa32CDDabLE/r999+nxvfdd9/MfVpSRj1LVn967rnnMve57bbbKnZ+qKazzz47Nb7ffvtl7pN1bV5nnXVCNd1zzz1VPT/FsuKKK6bGt9pqq8x9svpN1n3e4MGDM4/Vp0+f1PiXX34ZKqVnz5659xk5cmTFzl9URvQAAAAAFIREDwAAAEBBSPQAAAAAFIREDwAAAEBBSPQAAAAAFERDqVQqNeuBDQ2t35o24pxzzkmNH3bYYZn7jB8/Pvd5hg0blhrv1q1baMua+Zave7XaZ1dbbbXMbQ8//HBq/O23387cJ6siTlZ/Ov744zOP9f7774eimG222VLjF198ceY+WRXJBg4cmBrv27dvmB702frTuXPnzG1/+MMfUuMHHnhgqOb/i7X6Pvvkk08yt9Xq9bxWn8u2cp2t9n1rS+5ZWyKruuX0Ov9vf/vb1PigQYNCvdFnq6t3796Z27LeT7PMMkvu89x33325q6h+9dVXoVJmnnnm1Pg333yTuU/79u1T46usskpq/MUXXwxtQakZ11kjegAAAAAKQqIHAAAAoCAkegAAAAAKQqIHAAAAoCAkegAAAAAKokO1G9AW/elPf0qNDx48OHOfK664IjXeqVOnzH0WWGCB1PiFF16YGr/66qszj/Xyyy9nboM8sqpkTamCwI033pi5z5AhQ3JVkGor5p9//tR4W39eqKwVVlghNf7AAw+0qCJXUXz//fep8SuvvDJzn/feey81/sMPP1SsXZDl0ksvzdy244475qpuNb0qOFX7/PVYXYvqmnHGGVPjN910U+574zFjxmTus+uuu6bG77zzzqpWqvvlL3+Zq7JW9Oabb6bG33jjjYq1q6iM6AEAAAAoCIkeAAAAgIKQ6AEAAAAoCIkeAAAAgIKQ6AEAAAAoCIkeAAAAgIJoKDWzBmFDQ0Prt4ZMd911V2p8/fXXz9xnttlmy/WMfvbZZ5nbVlxxxdT4F198EerN9Cq7WW3V7rMnnHBCavy4447L3OfZZ59NjW+44YaZ+/z888+hrfrjH/+Yue3oo4/OXUJ3wIABqfFx48alxn/66acwPeiz1bXyyitnbjv22GNT47/5zW9Cvf2/2JL3WVZ510033TQ1Pnz48NAW6LO1a7nllkuN//Of/8zcZ+65587Vn6b0+n/33Xe5rlndunXLPNYxxxyT+/yVdNZZZ6XGTzzxxMx9xo4dG2qRPltdp512Wua2rL4xJZ9//nlNliTv0qVLanyppZbK3GfUqFG5+tnIkSMzj3XjjTcW5rNEc/qsET0AAAAABSHRAwAAAFAQEj0AAAAABSHRAwAAAFAQEj0AAAAABaHqVp3bd999M7ddfPHFFatG0rVr19T4J598EuqNygLTx/jx43M//08++WRqvHfv3qEty6rGsNFGG2Xuc//996fGH3zwwcx9nnvuuVCL9Nnpo2fPnqnxRx99tGLVHautXbt2uf/Pev3113NX3bnhhhtCW6bP1q5LLrkkNb7PPvvkPlbWfeMzzzyTuyLnY489lvv8F154Ye574/bt24dKyfr9p1Rd9M9//nOoRfpsda2++uqZ22655ZZcn82ml5ZU3aukrMqvTz31VOY+ffr0SY2PGTMm1BtVtwAAAADaEFO3AAAAAApCogcAAACgICR6AAAAAApCogcAAACgICR6AAAAAAqiQ7UbwLR55ZVXPIXUpJaUXcwq1bzAAgtk7jNixIhQT3r16pW5bb/99kuN77rrrqnx4cOHZx7ruuuuS42///77U20jbVNWeddZZ501c5/pUUb1kUceydz2wQcfpMb33nvvXCXUp/S7ZJWjjtp6GXVq04orrpi5bYsttmj180+pz7SkjHqWgw8+ODW+1VZbZe6z0EILhda2/PLLt/o5KJbnnnsud3+e0rW5W7duqfF11103VErW/eTiiy+euc+qq66aGt9yyy0z9/nPf/6TGt9uu+1S42+88UbmsdoaI3oAAAAACkKiBwAAAKAgJHoAAAAACkKiBwAAAKAgJHoAAAAACqJNVt1ab731cu/zxBNPhGrKqiBy7LHH5q56lKVdO3k/Kqcl1XhWWmml1Pi1116buc+OO+6YGv/6669DNStrZFUDOOqoozL3+fvf/54aP/HEE1PjTz75ZOaxVNeimrLey9HLL7+cGr/ssstS4998803msTp06JDrmjkl//73v1Pjt956a+5jQTX16NEjc1uXLl0qdp6XXnopd//PW3Wzb9++mfuce+65uavrVVLWffOUrs2QV9Y1cErXxmHDhqXGn3766VZ/Aab0eXLQoEG5j3fppZemxlXXmjqf7AEAAAAKQqIHAAAAoCAkegAAAAAKQqIHAAAAoCAkegAAAAAKoqHUzNI4eSs41YKsygJvvvlm5j5ZK+Vff/31FWvXlltumbsa2Pzzz58ab9++fe7zZ1U82WqrrTL3GTFiRGp83LhxoS1Ug6pH1e6z77zzTmp8vvnmy111Y0oeffTR1PgBBxyQGj/rrLMyj7XkkkvmOvfss8+eue3CCy9MjT/44IOZ+wwfPrxqFcRqmT47fcw111yp8c6dO+c+1tChQzO3jR49Otexsq5/0eOPP54a7969e67/l6KNN944Nf7xxx9PtY1MSp+trqyqj9HNN99csfN8//33uStlZt1rZlXqWXDBBXPf50yv91+3bt1y3TPX8n2zPsv0qPqXVd1ySrI+N7g3Lk31uTOiBwAAAKAgJHoAAAAACkKiBwAAAKAgJHoAAAAACkKiBwAAAKAgJHoAAAAACqJDKLCs0uOzzjpr5j59+vRJjf/6178O1SyHnVX28Lvvvsvc5+ijj06N33vvvblKO0NLZJU3vvrqqzP3GTVqVGp89dVXz9xnww03TI3/5z//CZXy888/p8YvuOCC3GXf33jjjYq1Cypp5MiRueLTy0EHHZT7/5ksZ599duY2ZdQhn6z76QMOOKDunsoxY8akxk866aTMfT755JNWbBHUp7nnnjv3Pm+++Wbmth9++GEaW9R2GdEDAAAAUBASPQAAAAAFIdEDAAAAUBASPQAAAAAFIdEDAAAAUBCFrro1bty43JWqZp999lAtw4YNy9z20ksv5a7689hjj1WkXVBJp59+eua2999/PzXetWvXzH0GDRqUGl9ggQVCpZxwwgmp8UsvvbRi54C2Lquf77777rmv80OGDEmNX3XVVS1sHdSPZ599NnPbO++8U5EKdrUg6755/PjxuY91xRVXpMbPPPPM3MeCtiyrgvWUZN3/R6NHj57GFrVdRvQAAAAAFIREDwAAAEBBSPQAAAAAFIREDwAAAEBBSPQAAAAAFIREDwAAAEBBFLq8+qeffpoa33rrrTP3WWmllXKdo1+/fpnbHn/88dT4a6+9lho///zzc50b6tHbb79d0bKLv/zlL6exRcD01KlTp9T4YYcdlhpfcMEFM4/13nvvpcbXXHPNFrYO6l9W2fHommuuSY2feuqpoZquvfbaXPfMkftmgGxG9AAAAAAUhEQPAAAAQEFI9AAAAAAUhEQPAAAAQEFI9AAAAAAUREOpVCo164ENDa3fGpgOmvmWr3v6LEWhzxbLqquumhp/5plnUuMjR47MPNbaa6+dGv/Pf/7TwtZRCfos1Bd9lko5+eSTM7cNGDAgNT5w4MDMffr27VuRdrXFPmtEDwAAAEBBSPQAAAAAFIREDwAAAEBBSPQAAAAAFIREDwAAAEBBdKh2AwAAsvzwww+Z21TXAoD69uCDD1a7CYVkRA8AAABAQUj0AAAAABSERA8AAABAQUj0AAAAABSERA8AAABAQUj0AAAAABSE8uoAwHQzbNiw1Pibb76ZGp9jjjlauUUAQCU8/PDDmdu23nrr1PiTTz7pyW8FRvQAAAAAFIREDwAAAEBBSPQAAAAAFIREDwAAAEBBSPQAAAAAFERDqVQqNeuBDQ2t3xqYDpr5lq97+ixFoc9CfdFnob7os1C8PmtEDwAAAEBBSPQAAAAAFIREDwAAAEBBSPQAAAAAFIREDwAAAEBBSPQAAAAAFIREDwAAAEBBSPQAAAAAFIREDwAAAEBBSPQAAAAAFIREDwAAAEBBSPQAAAAAFERDqVQqVbsRAAAAAEw7I3oAAAAACkKiBwAAAKAgJHoAAAAACkKiBwAAAKAgJHoAAAAACkKiBwAAAKAgJHoAAAAACkKiBwAAAKAgJHoAAAAAQjH8P1zGG5Db6twdAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "wrong_idx = np.where(all_preds != all_labels)[0][:10]\n", + "\n", + "fig, axes = plt.subplots(2, 5, figsize=(12, 5))\n", + "for i, idx in enumerate(wrong_idx):\n", + " ax = axes[i // 5, i % 5]\n", + " ax.imshow(X_test[idx].reshape(28, 28), cmap='gray')\n", + " ax.set_title(f'True: {all_labels[idx]}\\nPred: {all_preds[idx]}', color='red')\n", + " ax.axis('off')\n", + "plt.suptitle('Misclassified Examples', fontsize=14)\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 8. Save Model & Training Results to DuckDB" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model saved. Final test accuracy: 0.9826\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "# Save training history\n", + "history_df = pd.DataFrame(history)\n", + "history_df['epoch'] = range(1, EPOCHS + 1)\n", + "\n", + "con = duckdb.connect(str(Path('../data/mnist.duckdb')))\n", + "con.execute('DROP TABLE IF EXISTS training_history')\n", + "con.execute('CREATE TABLE training_history AS SELECT * FROM history_df')\n", + "con.close()\n", + "\n", + "# Save model weights\n", + "torch.save(model.state_dict(), '../data/mnist_model.pth')\n", + "print(f'Model saved. Final test accuracy: {history[\"test_acc\"][-1]:.4f}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 9. Experiment Ideas\n", + "\n", + "Try changing these parameters and re-running to see the effect:\n", + "\n", + "| Parameter | Current | Try |\n", + "|-----------|---------|-----|\n", + "| `LEARNING_RATE` | 0.001 | 0.01, 0.0001 |\n", + "| `HIDDEN1` | 256 | 64, 512 |\n", + "| `HIDDEN2` | 128 | 32, 256 |\n", + "| `DROPOUT` | 0.2 | 0.0, 0.5 |\n", + "| `EPOCHS` | 15 | 5, 30 |\n", + "| `BATCH_SIZE` | 128 | 32, 512 |\n", + "| Optimizer | Adam | SGD(lr=0.01, momentum=0.9) |" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "MNIST (Python)", + "language": "python", + "name": "mnist" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a1a4e65 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,21 @@ +# Jupyter & VSCode notebook support +jupyter==1.1.1 +ipykernel==6.29.5 +ipywidgets==8.1.5 + +# Data & Database +numpy==1.26.4 +pandas==2.2.3 +duckdb==1.5.2 + +# ML Framework +torch==2.5.1 +torchvision==0.20.1 + +# Visualization +matplotlib==3.9.3 +seaborn==0.13.2 +tqdm==4.67.1 + +# Utilities +scikit-learn==1.6.0