You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1348 lines
280 KiB
Plaintext

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"cells": [
{
"cell_type": "markdown",
"id": "6a937ab3",
"metadata": {},
"source": [
"# Development of a Modular Python Library from Scratch for Automated ROI Segmentation in Thermal Images"
]
},
{
"cell_type": "markdown",
"id": "547b1c8a",
"metadata": {},
"source": [
"# Module 3: Artificial Neural Network (ANN)"
]
},
{
"cell_type": "markdown",
"id": "c29cdf01",
"metadata": {},
"source": [
"Author: Sofia Samaniego Lopez\n",
"\n",
"Institution: Universidad Autonoma de Baja California (UABC)\n",
"\n",
"Advisor: Dr. Gerardo Marx Chavez Campos"
]
},
{
"cell_type": "markdown",
"id": "fe3535d2",
"metadata": {},
"source": [
"This notebook presents **Module 3** of the library's development: the implementation of an **Artificial Neural Network (ANN) from scratch**.\n",
"\n",
"With the objective of maintaining algorithmic transparency and bypassing commercial \"black-box\" frameworks, the entire network architecture (weight matrix initialization, feedforward propagation, and backpropagation via gradient descent) has been programmed using strictly linear algebra through **NumPy**. \n",
"\n",
"As a proof of concept and baseline evaluation, the model is trained and validated using the **MNIST** dataset. This demonstrates the pure mathematical algorithm's capability to classify complex patterns prior to scaling the framework for thermal image processing."
]
},
{
"cell_type": "markdown",
"id": "6ff6f020",
"metadata": {},
"source": [
"## 1. Environment Setup & Initialization\n",
"Importing core libraries for matrix operations and data visualization. A random seed is set to ensure reproducible weight initialization across experimental runs."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "371dacfd",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: numpy in c:\\Users\\sofia\\ANN-From-Scratch\\.venv\\Lib\\site-packages (2.5.0)\n",
"Requirement already satisfied: matplotlib in c:\\Users\\sofia\\ANN-From-Scratch\\.venv\\Lib\\site-packages (3.11.0)\n",
"Requirement already satisfied: contourpy>=1.0.1 in c:\\Users\\sofia\\ANN-From-Scratch\\.venv\\Lib\\site-packages (from matplotlib) (1.3.3)\n",
"Requirement already satisfied: cycler>=0.10 in c:\\Users\\sofia\\ANN-From-Scratch\\.venv\\Lib\\site-packages (from matplotlib) (0.12.1)\n",
"Requirement already satisfied: fonttools>=4.22.0 in c:\\Users\\sofia\\ANN-From-Scratch\\.venv\\Lib\\site-packages (from matplotlib) (4.63.0)\n",
"Requirement already satisfied: kiwisolver>=1.3.1 in c:\\Users\\sofia\\ANN-From-Scratch\\.venv\\Lib\\site-packages (from matplotlib) (1.5.0)\n",
"Requirement already satisfied: numpy>=1.25 in c:\\Users\\sofia\\ANN-From-Scratch\\.venv\\Lib\\site-packages (from matplotlib) (2.5.0)\n",
"Requirement already satisfied: packaging>=20.0 in c:\\Users\\sofia\\ANN-From-Scratch\\.venv\\Lib\\site-packages (from matplotlib) (26.2)\n",
"Requirement already satisfied: pillow>=9 in c:\\Users\\sofia\\ANN-From-Scratch\\.venv\\Lib\\site-packages (from matplotlib) (12.2.0)\n",
"Requirement already satisfied: pyparsing>=3 in c:\\Users\\sofia\\ANN-From-Scratch\\.venv\\Lib\\site-packages (from matplotlib) (3.3.2)\n",
"Requirement already satisfied: python-dateutil>=2.7 in c:\\Users\\sofia\\ANN-From-Scratch\\.venv\\Lib\\site-packages (from matplotlib) (2.9.0.post0)\n",
"Requirement already satisfied: six>=1.5 in c:\\Users\\sofia\\ANN-From-Scratch\\.venv\\Lib\\site-packages (from python-dateutil>=2.7->matplotlib) (1.17.0)\n"
]
}
],
"source": [
"!pip3 install numpy\n",
"!pip3 install matplotlib\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"np.random.seed(12)"
]
},
{
"cell_type": "markdown",
"id": "64958384",
"metadata": {},
"source": [
"## 2. Artificial Neural Network (ANN) Architecture"
]
},
{
"cell_type": "markdown",
"id": "8594921c",
"metadata": {},
"source": [
"Neural Network's Basic Structure "
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "d18ac1be",
"metadata": {},
"outputs": [],
"source": [
"class ann:\n",
" #init\n",
" def __init__():\n",
" pass\n",
"\n",
" #feedfoward\n",
" def feedforward():\n",
" pass\n",
"\n",
" #backpropagation\n",
" def backpropagation():\n",
" pass\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "83a68db8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'type'>\n"
]
}
],
"source": [
"MyANN = ann\n",
"print(type(MyANN))"
]
},
{
"cell_type": "markdown",
"id": "d9680a2a",
"metadata": {},
"source": [
"### 2.1 Initialization\n",
"Defining the network structure (input, hidden, and output layers). Synaptic weight matrices ($W_{ih}$ and $W_{ho}$) are initialized using a normal distribution to break mathematical symmetry."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "7285c021",
"metadata": {},
"outputs": [],
"source": [
"class ann:\n",
" #init\n",
" def __init__(self, inputNodes: int, hiddenNodes: int, outputNodes: int):\n",
" # Nodes\n",
" inN = inputNodes # Private var or parameters\n",
" hN = hiddenNodes\n",
" oN = outputNodes\n",
" # Weights\n",
" np.random.seed(12) #seed for reproducibility\n",
" self.wih = np.random.randn(hN, inN) #weights for input to hidden layer\n",
" self.who = np.random.randn(oN, hN) #weights for hidden to output layer\n",
" pass\n",
"\n",
" #feedfoward\n",
" def feedforward():\n",
" pass\n",
"\n",
" #backpropagation\n",
" def backpropagation():\n",
" pass"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "b5b34c6e",
"metadata": {},
"outputs": [],
"source": [
"MyANN = ann(3, 3, 3)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "5c00cf15",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.47298583, -0.68142588, 0.2424395 ],\n",
" [-1.70073563, 0.75314283, -1.53472134],\n",
" [ 0.00512708, -0.12022767, -0.80698188]])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"MyANN.wih"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "4b0f2e37",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 2.87181939, -0.59782292, 0.47245699],\n",
" [ 1.09595612, -1.2151688 , 1.34235637],\n",
" [-0.12214979, 1.01251548, -0.91386915]])"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"MyANN.who"
]
},
{
"cell_type": "markdown",
"id": "f3e2ed15",
"metadata": {},
"source": [
"### 2.2 Feedforward (Inference)\n",
"So the next step is to create the network of nodes and links. The most important part of the network is the link weights. Theyre used to calculate the signal being fed forward, the error as its propagated backwards, and it is the link weights themselves that are refined in an attempt to to improve the network.\n",
"\n",
"For the basic NN, the weight matrix consist of:\n",
"\n",
"- A matrix that links the input and hidden layers, $Wih$, of size hidden nodes by input nodes ($hn×in$)\n",
"- and another matrix for the links between the hidden and output layers, $Who$, of size $on×hn$ (output nodes by hidden nodes)\n",
"\n",
"$$X_h=W_{ih}I$$\n",
"$$O_h=\\sigma(X_h)$$\n",
"\n",
"\n",
"Then, \n",
"\n",
"$$X_o=W_{ho}O_{h}$$\n",
"$$O_o=\\sigma(X_o)$$"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "31b8c4dd",
"metadata": {},
"outputs": [],
"source": [
"class ann:\n",
" #init\n",
" def __init__(self, inputNodes: int, hiddenNodes: int, outputNodes: int):\n",
" # Nodes\n",
" inN = inputNodes # Private var or parameters\n",
" hN = hiddenNodes\n",
" oN = outputNodes\n",
" # Weights\n",
" np.random.seed(12) #seed for reproducibility\n",
" self.wih = np.random.randn(hN, inN) #weights for input to hidden layer\n",
" self.who = np.random.randn(oN, hN) #weights for hidden to output layer\n",
" pass\n",
"\n",
" #feedfoward\n",
" def feedforward(self, Inputs):\n",
" # Forward pass to hidden layer\n",
" inputs = np.array(Inputs, ndmin=2).T\n",
" Xh = np.dot(self.wih, inputs)\n",
" af = lambda x: 1 / (1 + np.exp(-x))\n",
" Oh = af(Xh)\n",
" # Forward pass to output layer\n",
" Xo = self.who @ Oh\n",
" Oo = af(Xo)\n",
" return Oo\n",
"\n",
" #backpropagation\n",
" def backpropagation():\n",
" pass"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "6d6b0b09",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0.80230104],\n",
" [0.65960645],\n",
" [0.48247944]])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"MyANN = ann(3, 3, 3)\n",
"MyANN.feedforward([0.1, 0.2, 0.3])"
]
},
{
"cell_type": "markdown",
"id": "4dd6b848",
"metadata": {},
"source": [
"### 2.3 Backpropagation (Training)\n",
"The core learning algorithm. It calculates the prediction error, propagates it backward, and dynamically updates the weight matrices using gradient descent and the chain rule."
]
},
{
"cell_type": "markdown",
"id": "c8b04eed",
"metadata": {},
"source": [
"#### Mathematical Derivation of the Cost Function and Gradient\n",
"\n",
"To thoroughly understand the network's learning mechanics, we must derive the gradient of the error with respect to the synaptic weights. This procedure uses the **Chain Rule** from calculus and establishes the mathematical foundation for the Gradient Descent optimization strategy used in our backpropagation algorithm.\n",
"\n",
"**1. The Cost Function (SSE)**\n",
"We define the Total Error ($E$) using the Sum of Squared Errors:\n",
"$$E = \\frac{1}{2} \\sum (T - O_o)^2$$\n",
"Where $T$ represents the target label and $O_o$ is the predicted output. We define the output error as $e_o = (T - O_o)$.\n",
"\n",
"**2. The Chain Rule Application**\n",
"To update the weight matrix $w_{ho}$ (connecting the hidden layer to the output layer), we need to determine how a change in $w_{ho}$ impacts the total error $E$. We calculate the partial derivative using the Chain Rule:\n",
"$$\\frac{\\partial E}{\\partial w_{ho}} = \\frac{\\partial E}{\\partial O_o} \\cdot \\frac{\\partial O_o}{\\partial X_o} \\cdot \\frac{\\partial X_o}{\\partial w_{ho}}$$\n",
"*(Note: $X_o = w_{ho} \\cdot O_h$ represents the raw signal entering the output node before activation).*\n",
"\n",
"**3. Solving the Partial Derivatives**\n",
"* **Error derivative:** How the total error changes with respect to the final output.\n",
" $$\\frac{\\partial E}{\\partial O_o} = -(T - O_o) = -e_o$$\n",
"* **Activation derivative:** The derivative of the Sigmoid activation function $\\sigma(X_o)$.\n",
" $$\\frac{\\partial O_o}{\\partial X_o} = \\sigma(X_o)(1 - \\sigma(X_o)) = O_o(1 - O_o)$$\n",
"* **Weight derivative:** How the raw input $X_o$ changes with respect to the weight matrix $w_{ho}$. This evaluates directly to the output of the preceding hidden layer $O_h$.\n",
" $$\\frac{\\partial X_o}{\\partial w_{ho}} = O_h$$\n",
"\n",
"**4. Final Gradient Equation**\n",
"Multiplying these individual derivatives yields the final gradient of the error for $w_{ho}$:\n",
"$$\\frac{\\partial E}{\\partial w_{ho}}= -e_o\\cdot \\sigma \\left(w_{ho} O_h\\right) \\left(1-\\sigma\\left (w_{ho} O_h\\right) \\right) O_h$$\n",
"\n",
"Thus, by substituting the activated output $O_o$, we arrive at the simplified expression:\n",
"$$\\frac{\\partial E}{\\partial w_{ho}}= -e_o\\cdot O_o \\left(1-O_o \\right) O_h$$\n",
"\n",
"This precise formulation dictates the weight update rule programmed in our `backpropagation` method, scaled by the learning rate ($\\eta$) to ensure stable convergence:\n",
"$$w_{ho_{new}} = w_{ho} + \\eta \\cdot e_o \\cdot O_o(1 - O_o) \\cdot O_h^T$$"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "ef1098b0",
"metadata": {},
"outputs": [],
"source": [
"class ann:\n",
" #init\n",
" def __init__(self, inputNodes: int, hiddenNodes: int, outputNodes: int):\n",
" # Nodes\n",
" inN = inputNodes # Private var or parameters\n",
" hN = hiddenNodes\n",
" oN = outputNodes\n",
" # Weights\n",
" np.random.seed(12) #seed for reproducibility\n",
" self.wih = np.random.randn(hN, inN) #weights for input to hidden layer\n",
" self.who = np.random.randn(oN, hN) #weights for hidden to output layer\n",
" pass\n",
"\n",
" #feedfoward\n",
" def feedforward(self, Inputs):\n",
" # Oh\n",
" inputs = np.array(Inputs, ndmin=2).T\n",
" Xh = np.dot(self.wih, inputs)\n",
" af = lambda x: 1 / (1 + np.exp(-x))\n",
" Oh = af(Xh)\n",
" # Oo\n",
" Xo = self.who @ Oh\n",
" Oo = af(Xo)\n",
" return Oo\n",
"\n",
" #backpropagation\n",
" def backpropagation(self, Inputs, Targets, Learning):\n",
" lr = Learning\n",
" inputs = np.array(Inputs, ndmin=2).T\n",
" targets = np.array(Targets, ndmin=2).T\n",
" \n",
" # 1. Internal feedforward\n",
" Xh = self.wih @ inputs\n",
" af = lambda x: 1 / (1 + np.exp(-x))\n",
" Oh = af(Xh)\n",
" \n",
" Xo = self.who @ Oh\n",
" Oo = af(Xo)\n",
" \n",
" # 2. Error calculation\n",
" Eo = targets - Oo\n",
" Eh = self.who.T @ Eo\n",
"\n",
" # 3. Weight matrices update\n",
" self.who = self.who + (lr * Eo * Oo * (1-Oo) ) @ Oh.T\n",
" self.wih = self.wih + (lr * Eh * Oh * (1-Oh) ) @ inputs.T\n",
" pass"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "deacbee4",
"metadata": {},
"outputs": [],
"source": [
"MyANN = ann(3, 5, 3)\n",
"MyANN.backpropagation([0.1, 0.2, 0.3], [0.01, 0.01, 0.99], 0.3)"
]
},
{
"cell_type": "markdown",
"id": "40d8674c",
"metadata": {},
"source": [
"## 3. MNIST Dataset Exploration\n",
"Loading the training dataset. To verify the geometric structure, a raw 784-pixel flat array is extracted and reshaped into a 28x28 2D matrix for visual confirmation."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "bb581e90",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<function TextIOWrapper.close()>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Load training data\n",
"file = open(\"mnist_train.csv\")\n",
"list = file.readlines()\n",
"file.close"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "ddb0a6fb",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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7WHIh9DkyZPtT9MDuJoZqtz7mltFRETYa73mPpGbmeGp12sfhtvbiJnKPxTbhxkday4x/fWvf5UvfelLrm0PT9+gHoKlPQz5EDLdaFO5V9/7MA3sH//4hyxevFjcwtwXu3jxos+2v//97/bywtVDtt1o0aJF9j5ATU2Nd9sbb7xhh6+H2knnRv773//6rJtpId96662Qax8bN260jyuYE++sWbNc2x423qQegqU9DPnRccbPfvYzeynKjA5KTU2VX/3qV/bhs69//eviFm1tbXLPPffYMf/mw3T69GnZunWrfQ5g/vz5EsrMsw+dnZ32oTzzgJ4Z/WQuS37ta1+zry9YsMD+QWJGDD3++ONy6tQp+d3vfjfkLjsMdD389re/tTenTXswl53MH27mYca3335bQoUZJfuTn/zE/n823xxq6sAYNWqUbQduaQ8v9aMegqU9BM0s2sePH5dt27bJhQsX7CgPc20zWKYqDxRzw9V8mMxfeWZI5le+8pWQDyBj9erVcvnyZZ9tsbGx9kPW68qVK7Z9mIf2zBPy3/rWt2w7cVs97N+/355szQgoMyT3O9/5TkgMSe718ssvy4EDB67Zbr7O+oUXXnBNe3i5n/UQDO0haEIIABB6hvw9IQBA6CKEAABqCCEAgBpCCACghhACAKghhAAAagghAIAaQggAoIYQAgCoIYQAAGoIIQCAGkIIACBa/g94lJIy4CerDwAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Visualize sample at index 120\n",
"values = list[120].split(\",\")\n",
"image = np.asarray(values[1:], dtype=int)\n",
"plt.imshow(image.reshape(28,28), cmap='Grays')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "23314858",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"49999"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"values [0]\n",
"len(list)"
]
},
{
"cell_type": "markdown",
"id": "b499d390",
"metadata": {},
"source": [
"## 4. Model Training\n",
"Setting up hyperparameters. During training, pixel intensities are normalized to a $[0.01, 1.0]$ range to prevent zero-gradient issues. Target labels are formatted using an adapted One-Hot Encoding."
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "c4dd5448",
"metadata": {},
"outputs": [],
"source": [
"# hyperparameters\n",
"inputNodes = 784\n",
"hiddenNodes = 100\n",
"outNodes = 10\n",
"learningRate = 0.1\n",
"MyANN = ann(inputNodes, hiddenNodes, outNodes)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "a800df69",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/5 - Average Loss: 0.0972\n",
"Epoch 2/5 - Average Loss: 0.0559\n",
"Epoch 3/5 - Average Loss: 0.0461\n",
"Epoch 4/5 - Average Loss: 0.0403\n",
"Epoch 5/5 - Average Loss: 0.0361\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAAHVCAYAAAATqShMAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlcelbwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAc8lJREFUeJzt3QeUU8XbBvBnd+lF6b33jiBNkWYX7Cj2itjoAioiKKIgilJEsXyWv71gxYaAdARp0pv0Ih0UpLP7nWeudzfJFpJsdjNJnt85OZvctJvcdydvJjPvxCUlJSVBRERERCRKxYd7B0REREREspISXhERERGJakp4RURERCSqKeEVERERkaimhFdEREREopoSXhERERGJakp4RURERCSqKeEVERERkaimhFdErPPQQw/huuuuC9v9RUQkuuQI9w6ISORo1aoV9uzZc8bb3X777XjyySeDfp6tW7di27ZtYbt/Zj366KP47rvvsHTpUuTKlQu2mzp1Kj777DOzv0eOHEGZMmVQq1Yt3HXXXWjYsGG4d09EJNPitLSwiPjrzz//xKlTp5Ivjx49Gq+//rpJ7qpXr568vXDhwihZsmTQbyyTVT5PpUqVwnL/zGLC/9FHH+Ho0aPIkycPbHXs2DGT1H777bd48MEHcdVVV6F48eLYvHkz3nvvPXz11Vf4+uuvce2114Z7V0VEMkU9vCLit2rVqnldLlq0qPlbuXJl0yMYKuXKlQvr/WPFww8/jC+//BK//PILLrzwwuTtDRo0MMnvJ598gtOnT4d1H0VEQkFjeEUkpG677TZz+vvvv9GnTx80bdoUPXv2NNcNHDjQJMY81alTBy1btkS/fv2wc+fOM47BdR/38OHD6Nu3L5o0aYI2bdrgnXfeSbUPmb0/ff/992jfvj0aNWqEO+64Axs2bMDTTz+NZs2aheBdApKSkkwv6hVXXGESzHbt2mHEiBGm19XTjBkzcMstt5j3kfvbu3dvbN++PeDb+Fq5cqV5/nvuuccr2fXEx/Ts3fVnnw8dOmSO71tvvWWe4+abb8Y555xjHmf+/PnJt2Mi3aJFC/To0SPN577yyivN83tiYn7TTTeZY8L7PvbYY9i3b1+az83hGbw/95O91LRjxw6T5PP+3Hcm9KtXrzb3+fHHH72e68SJE3j11Vdx2WWXmce4+OKLza8ZiYmJybeZMGGCue+6detMb/hFF11kHpvPsXfv3lSviY85btw4E1ccKnL11VebfQj0eUUkCBzSICISjAEDBiSxGVm2bFnytpYtWya1aNEiqX379knvvPNO0syZM5Neeuklc91ff/2VtGrVKnNaunRp0pdffpl07rnnJlWvXj3p33//TX6MDh06JDVs2NDrudzH7dixY9J7772X9Pvvvyf169fPPP+nn37qddvM3p/7ze0PPvhg0uzZs5O+/fbbpAsvvDDphhtuSDr77LPP+L7cdttt5v5Hjx5N9zZ33313Us6cOZOGDRuWNG/evKS33347qXDhwknnn39+0rFjx8xtpk2blpSQkJDUp0+fpLlz5ybNmTMnacyYMUnNmjVLfhx/bpMWPi/38Ycffjjj6wlknw8cOGAet0uXLuY4/PTTT0kzZsxIateuXVL+/PmTdu7cmfx4fH/z5Mlj7uNp8eLF5jFeffXV5G2DBw9OypEjR9Kjjz5qjsnEiRPN8axatWrSvn37vJ77nnvuSbrkkkvMa+Ox+/rrr5N2796dVL58+aRatWolffPNN+YxHn744aRu3bqZ+3zyySfJz8Xj1qpVq6QSJUokvfnmm0nz589Pevfdd5OKFSuWdPvttyff7oMPPjD35T7xcfiY48ePTypZsmRS27ZtvV7TkSNHTAwWKlQoafTo0eb9mzBhgomV999/P6DnFZHAKeEVkZAnvHFxcUm//PJL8rbExMR0H4NJMB+DSeiZEtb4+Pik6dOne21nwty8eXOvbZm5PxMTJiVXX3211+22bt1qkrNQJLxTpkwx1w8fPtxrO5NDbh85cqS53LNnz6TixYunuv+JEyeSz/tzm7R07tzZPNeaNWvO+HoC2Wc36SxTpox5L13btm0zifmQIUOSty1YsCBVYktMHj0T4UWLFpnbPf3001634/VFihQxyb7nczNBPHTokFf89ejRwyTrmzdv9noMfgHyTXifeeYZEyv8UuSJCTRvO3XqVK+E1zcZfeutt8x2Ju6uQYMGmW38QpLesfL3eUUkcBrSICIhV6xYMVxyySXJl+Pi4sxfTuIaNWoULr/8cvNzLX8Obtu2rbmePy2fSenSpdG6dWuvbRxisGbNGr/2y5/7z5kzBwcPHsStt96aalwwh2CEwg8//GD+3n333V7b+b5wHzmcwn1O/jTOYQP79+9Pvl3OnDm99utMt0nL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desmbytdujS++OIL2EIJbxgxaUlISMDcuXNx//33h3NXJEJs2LAB77//Pho0aGAuM3batm2L2rVr48477wz37omlPS8jRoxI7mnhkp+NGjXCSy+9hCeffDLcuycW++677zB16lST7IqcSfPmzU2njK00hjeMKlWqZOrVcf1nEX88/PDDyckutWjRwiQvs2bN0hsoabr22mu9flbkOvccCsPhDSLp4c/TDz30ED766CPz07TImZw4cQKLFy82vzyePn0atlEPr0gEO3ToENasWYPrrrsu3LsiFuOHz2+//YZjx45h8uTJJpl59913w71bYnG83HbbbejTp4/XF2yRjMyYMcP80sj5JcShMNdffz1soYRXJIKxB4a9L507dw73rojFjh49asZ+Hz582Izl5bjv6tWrh3u3xFLPPPMMcuXKhd69e4d7VyRCtGnTxnxB4rjdxMREDBkyBLfccgsWLVrkNa43nJTwikTwZBJOImGPnWbdS0ZYycMd9rJ582a0bt3a9PaOHDlSb5x4WbZsmZlMzbkCs2fPNtv27dtnfq5mDJ177rma7CipcCKsKz4+HoMGDcIbb7yBr776SgmviASvf//+ePPNN/HLL79YVfZF7FexYkV06tQJEyZMUMIrqRw5csS0KWPGjEnexsoe7LXjrwQff/yxKW0nkpG4uDgUL17cqrkC6uEViTBPPPEEXnvtNUycONHMihU5U/nD/Pnze23jpBL9KiBpYZviOwn2hhtuML8IqCyZ+NvObNmyxcwv6dKlC2yhhDfM5syZY745HzhwwDQobGg4dqpZs2bh3jWx0NChQ/H888/jxRdfNAuWuB9MKgov6WGywvakadOmpq1hzy4TF5acEhEJ1Relu+66C/Xr18dff/1lasPXqFED99xzD2wRl5SUlBTunYhlF110kVnJxhN7Xr799tuw7ZPYXZZs6dKlqba3bNnSjLsTSesn6tdff93MoGbCyw+hBx54QJPWxG8DBw40Y3jVxkhG6wq88sorZtXYs846C+eff75pZ3Lnzg1bKOEVERERkaimhSdEREREJKop4RURERGRqKaEV0RERESimhJeEREREYlqSnhFREREJKop4RURERGRqKaEV0RERESimhJeERE547Khn376KQ4fPqx3SkQikhaeEBGxEBfB/Oyzz9K8rnHjxmbFtOyyadMmVK5cGevWrUO1atWy7XlFREIlR8geSUREQub06dO45ZZb0KJFC1SsWNHrurPPPjtbE14RkUinhFdExGJdu3bF7bffnu5QgwkTJuDKK6/Ejh07sGbNGlSqVAn169dPddudO3fi999/N2vbc537ggULprrNoUOHMHfuXNO7fN5556V5mw0bNmDVqlUoV64cGjZsGKJXKSKStZTwiohEqD179phe4CuuuMIMN6hSpQpmzZqFLl26YNSoUcm3Gzt2LB599FE0b94cf//9NzZv3owvv/wSbdu2Tb7N+PHjcd9995mhCyVKlMDGjRvxwQcfmPu4HnnkEaxfv97cZvr06bjnnnswZsyYbH/dIiKBUsIrImIx9rjmyOHdVF9yySUoWrRo8uWTJ09i5cqVyJkzp+nFZe9sx44d0apVK/z5558mUWXyetNNN5nb9+jRwySrq1evNj2+vM1tt92GF154AT179jS32bVrl0l6PRUvXhzffvst4uLiTMLbrl079O3bFxUqVMiW90JEJFhKeEVELLZw4ULs3bvXa1uTJk28Et5evXqZZJeaNWtmem4///xzk/CyJ7d8+fLJyS4NGDAAr7zyCubNm4fWrVvjk08+QalSpUwi7CpZsqQ5eXrggQdMsksXXHAB4uPjsXbtWiW8ImI9JbwiIhE6htfFcbueOOSAwxaIfznUwRMT2fz58yffZsuWLab6gpvMpqdIkSLJ5xMSEkzP87FjxwJ+TSIi2U11eEVEItyBAwdSXS5WrJg5z7/79+/3uv748eM4cuRI8m0KFSqEffv2ZeMei4hkLyW8IiIR7ptvvkk+z0lpU6ZMQcuWLZOHHixZssRMNvOcoJYnTx5Tz5cuvfRSLF26FH/88UeqSXEiItFAQxpERCJs0lrNmjXRqFGj5MuckHbq1CnUqlULb731lhmze+eddyYns+3btzcT3TjWlwnx8OHDMXDgwOQxurzujjvuwEUXXWQmrbFKA5NoPsatt96aza9YRCT0lPCKiFiIE8I40YwT1jx7cIkJrGfC++OPP5peXVZouOaaa8zkM3cSG3Hi2vvvv4/Zs2ebqgxcwa1Dhw5ej/nee++Z55k4cSJ2796NPn36mESYON6X++Jbl7dTp04oW7ZsFr0DIiKho6WFRUQilJb8FRHxj8bwioiIiEhUU8IrIhKh0htqICIi3jSkQURERESimnp4RURERCSqKeEVERERkaimhFdEREREopoSXhERERGJakp4RURERCSqKeEVERERkaimhFdEREREopoSXhERERGJakp4RURERATR7P8BuoctaF/ErrYAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 800x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Model Training and Loss Tracking\n",
"\n",
"# Initialize a list to keep track of the loss for plotting\n",
"epoch_losses = []\n",
"\n",
"# Iterative training loop\n",
"epochs = 5\n",
"for e in range(epochs):\n",
" total_loss = 0\n",
" for record in list: \n",
" values = record.split(\",\")\n",
" \n",
" # Input data normalization\n",
" data = np.asarray(values[1:], dtype=float) / 255.0 * 0.99 + 0.01\n",
" index = int(values[0])\n",
" \n",
" # Target Vector construction\n",
" target = np.zeros(outNodes) + 0.01\n",
" target[index] = 0.99\n",
" \n",
" # Calculate loss before updating weights\n",
" output = MyANN.feedforward(data)\n",
" # Using SSE formulation: 0.5 * sum((target - output)^2)\n",
" loss = np.sum(0.5 * (target.reshape(-1, 1) - output)**2)\n",
" total_loss += loss\n",
" \n",
" # Train\n",
" MyANN.backpropagation(data, target, learningRate)\n",
" \n",
" # Calculate and store the average loss for this epoch\n",
" average_loss = total_loss / len(list)\n",
" epoch_losses.append(average_loss)\n",
" print(f\"Epoch {e+1}/{epochs} - Average Loss: {average_loss:.4f}\")\n",
"\n",
"# --- Plotting the Learning Curve ---\n",
"plt.figure(figsize=(8, 5))\n",
"plt.plot(range(1, epochs + 1), epoch_losses, marker='o', color='red', linewidth=2)\n",
"\n",
"plt.title(\"Training Loss Convergence\")\n",
"plt.xlabel(\"Epoch\")\n",
"plt.ylabel(\"Average Loss (SSE)\")\n",
"plt.xticks(range(1, epochs + 1))\n",
"plt.grid(True, linestyle='--', alpha=0.7)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "1608f5b1",
"metadata": {},
"source": [
"### Final Trained Weights Extraction\n",
"\n",
"After completing the training epochs, the optimal state of the network is fully captured within its weight matrices ($W_{ih}$ and $W_{ho}$). These resulting numerical arrays act as the permanent \"memory\" of the model. "
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "88385d55",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"FINAL WEIGHTS: HIDDEN TO OUTPUT LAYER (Who)\n",
"Matrix Dimensions: (10, 100)\n",
"--------------------------------------------------\n",
"[[-1.67078471 0.15194614 -1.7767362 ]\n",
" [ 1.62235502 -1.00391943 -0.37989541]\n",
" [-1.26930144 0.42418591 0.62579789]]\n",
"\n",
"==================================================\n",
"\n",
"FINAL WEIGHTS: INPUT TO HIDDEN LAYER (Wih)\n",
"Matrix Dimensions: (100, 784)\n",
"--------------------------------------------------\n",
"[[ 0.46048182 -0.69392989 0.22993549]\n",
" [-0.94519842 0.42366932 1.41797905]\n",
" [ 0.36351595 -0.27497497 1.32172583]]\n"
]
}
],
"source": [
"# Display the final trained weight matrices\n",
"# Displaying only a representative 3x3 slice to keep the notebook clean\n",
"\n",
"print(\"FINAL WEIGHTS: HIDDEN TO OUTPUT LAYER (Who)\")\n",
"print(f\"Matrix Dimensions: {MyANN.who.shape}\")\n",
"print(\"-\" * 50)\n",
"print(MyANN.who[:3, :3])\n",
"\n",
"print(\"\\n\" + \"=\"*50 + \"\\n\")\n",
"\n",
"print(\"FINAL WEIGHTS: INPUT TO HIDDEN LAYER (Wih)\")\n",
"print(f\"Matrix Dimensions: {MyANN.wih.shape}\")\n",
"print(\"-\" * 50)\n",
"print(MyANN.wih[:3, :3])"
]
},
{
"cell_type": "markdown",
"id": "c75cb916",
"metadata": {},
"source": [
"## 5. Validation & Inference\n",
"Evaluating model performance using unseen test data. A new sample is normalized and processed to extract the final prediction vector, which is then visually compared to the ground truth image."
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "a446646f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<function TextIOWrapper.close()>"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Load testing data\n",
"file2 = open(\"mnist_test.csv\")\n",
"list2 = file2.readlines()\n",
"file2.close"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "bb895183",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Network Accuracy (Score) on Test Set: 95.27%\n"
]
}
],
"source": [
"#Test Set Evaluation (Network Score)\n",
"scorecard = []\n",
"\n",
"for record in list2:\n",
" values = record.split(\",\")\n",
" correct_label = int(values[0])\n",
" \n",
" # Normalize input\n",
" data = np.asarray(values[1:], dtype=float) / 255.0 * 0.99 + 0.01\n",
" \n",
" # Get network prediction\n",
" outputs = MyANN.feedforward(data)\n",
" # The index of the highest value corresponds to the predicted class\n",
" predicted_label = np.argmax(outputs)\n",
" \n",
" # Append 1 if correct, 0 if incorrect\n",
" if predicted_label == correct_label:\n",
" scorecard.append(1)\n",
" else:\n",
" scorecard.append(0)\n",
"\n",
"scorecard_array = np.asarray(scorecard)\n",
"accuracy = scorecard_array.sum() / scorecard_array.size\n",
"print(f\"Network Accuracy (Score) on Test Set: {accuracy * 100:.2f}%\")"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "682673f4",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[3.92210113e-05],\n",
" [9.64025823e-01],\n",
" [1.22524901e-03],\n",
" [1.47886768e-02],\n",
" [1.61851002e-03],\n",
" [3.98689305e-03],\n",
" [7.74585782e-05],\n",
" [2.65175424e-03],\n",
" [4.98386616e-03],\n",
" [2.37478194e-03]])"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Inference on sample 500\n",
"values = list2[700].split(\",\")\n",
"data = np.asarray(values[1:], dtype=int)/255*0.99+0.01\n",
"\n",
"# Display probability vector for the 10 classes\n",
"MyANN.feedforward(data)"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "8d5fb4bd",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Visual verification\n",
"image = np.asarray(values[1:], dtype=int)\n",
"plt.imshow(image.reshape(28,28), cmap='Grays')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "0dabacd4",
"metadata": {},
"source": [
"## 6.1 Hyperparameter Tuning: Learning Rate Impact\n",
"To optimize the network's performance, we evaluate the impact of the Learning Rate ($\\eta$) on the final classification accuracy. The network is trained across a sweep of different learning rates `[0.01, 0.1, 0.2, 0.3, 0.6, 0.9]` while keeping the hidden nodes constant (100 nodes). \n",
"\n",
"The results are plotted to identify the optimal step size for the Gradient Descent algorithm, avoiding both slow convergence (values too close to 0) and divergent oscillations (values too close to 1)."
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "b3be2fde",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Starting Learning Rate sweep. This may take a few minutes...\n",
"Training network with Learning Rate: 0.01...\n",
"Performance for LR 0.01: 0.8683\n",
"\n",
"Training network with Learning Rate: 0.1...\n",
"Performance for LR 0.1: 0.9249\n",
"\n",
"Training network with Learning Rate: 0.2...\n",
"Performance for LR 0.2: 0.9274\n",
"\n",
"Training network with Learning Rate: 0.3...\n",
"Performance for LR 0.3: 0.9178\n",
"\n",
"Training network with Learning Rate: 0.6...\n",
"Performance for LR 0.6: 0.8587\n",
"\n",
"Training network with Learning Rate: 0.9...\n",
"Performance for LR 0.9: 0.8326\n",
"\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 800x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 6. Hyperparameter Tuning: Learning Rate Sweep\n",
"learning_rates = [0.01, 0.1, 0.2, 0.3, 0.6, 0.9]\n",
"performances = []\n",
"hidden_nodes_baseline = 100\n",
"\n",
"print(\"Starting Learning Rate sweep. This may take a few minutes...\")\n",
"\n",
"for lr in learning_rates:\n",
" print(f\"Training network with Learning Rate: {lr}...\")\n",
" # Initialize a fresh network for each test\n",
" testANN = ann(784, hidden_nodes_baseline, 10)\n",
" \n",
" # Train 1 epoch\n",
" for record in list: \n",
" values = record.split(\",\")\n",
" data = np.asarray(values[1:], dtype=float) / 255.0 * 0.99 + 0.01\n",
" target = np.zeros(10) + 0.01\n",
" target[int(values[0])] = 0.99\n",
" testANN.backpropagation(data, target, lr)\n",
" \n",
" # Evaluate on the Test Set\n",
" score = 0\n",
" for record in list2:\n",
" values = record.split(\",\")\n",
" correct_label = int(values[0])\n",
" data = np.asarray(values[1:], dtype=float) / 255.0 * 0.99 + 0.01\n",
" \n",
" outputs = testANN.feedforward(data)\n",
" if np.argmax(outputs) == correct_label:\n",
" score += 1\n",
" \n",
" # Calculate performance (accuracy as a decimal between 0 and 1)\n",
" performance = score / len(list2)\n",
" performances.append(performance)\n",
" print(f\"Performance for LR {lr}: {performance:.4f}\\n\")\n",
"\n",
"# Plotting the exact graph requested\n",
"plt.figure(figsize=(8, 5))\n",
"plt.plot(learning_rates, performances, marker='s', markersize=8, color='#003366', linewidth=1.5)\n",
"\n",
"# Formatting to match the requested style\n",
"plt.title(\"Performance vs. Learning Rate\")\n",
"plt.xlabel(\"learning rate\")\n",
"plt.ylabel(\"performance\")\n",
"\n",
"# Setting axes limits and ticks\n",
"plt.xlim(0, 1)\n",
"plt.xticks(np.arange(0, 1.1, 0.1))\n",
"plt.ylim(0.8, 0.98)\n",
"plt.yticks(np.arange(0.8, 1.0, 0.02))\n",
"\n",
"# Adding horizontal grid lines\n",
"plt.grid(axis='y', linestyle='-', alpha=0.7)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "7bda99b0",
"metadata": {},
"source": [
"## 6.2 Hyperparameter Tuning: Hidden Nodes Capacity\n",
"In this experiment, we evaluate the effect of the network's capacity by varying the number of hidden nodes `[10, 50, 100, 200, 500]`. The Learning Rate is kept constant at $0.2$.\n",
"\n",
"The resulting curve demonstrates the law of diminishing returns in neural network architecture. While increasing the number of nodes initially provides a massive boost in classification performance, the accuracy plateaus after approximately 200 nodes. Beyond this threshold, adding more nodes significantly increases computational cost and memory footprint without yielding proportional accuracy gains."
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "0ead825a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Starting Hidden Nodes sweep. This will take a while...\n",
"Training network with 10 hidden nodes...\n",
"Performance for 10 nodes: 0.8064\n",
"\n",
"Training network with 50 hidden nodes...\n",
"Performance for 50 nodes: 0.9183\n",
"\n",
"Training network with 100 hidden nodes...\n",
"Performance for 100 nodes: 0.9274\n",
"\n",
"Training network with 200 hidden nodes...\n",
"Performance for 200 nodes: 0.9344\n",
"\n",
"Training network with 500 hidden nodes...\n",
"Performance for 500 nodes: 0.9167\n",
"\n"
]
},
{
"data": {
"image/png": "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nVqUdZvGjRvnybh8AAAAyB17BUDABWUNoRpAdeSLu+++22ks5vr16193ex0CTkssBgwY4NLP01bq7Ebg0CHprIalCwkJMTcAAAD4lrzOaG5NOOKRHxwcLH379pUZM2Y4ms1//PFH2bBhg/Tr18+xno6xnHGqbKXb9enTJ9PsgFqrsmjRIqdl7733npw+fdopkAMAAAA+GZTVSy+9ZP4SaNiwodx3331y1113yYgRI5wCrXbs+/LLL52208lNfv7550yd+JS2Mmvtsu5TA7eO0/z444/L66+/bkowAAAAAFcE2bKrR7gBdOSLFStWOGbma9SokdPrOnnIqVOnTJC205Csnex0Fr+s6PBwOulI8eLFzVjNpUqV8qm5wwEAAJA7eZ3XvB6UfRVBGQAAIH/nNa+WXgAAAAC+iqAMAAAAWCAoAwAAABYIygAAAIAFgjIAAABggaAMAAAAWCAoAwAAABYIygAAAIAFgjIAAABggaAMAAAAWCAoAwAAABYIygAAAIAFgjIAAABggaAMAAAAWCAoAwAAABYIygAAAIAFgjIAAABggaAMAAAAWCAoAwAAABYIygAAAIAFgjIAAABggaAMAAAAWCAoAwAAABYIygAAAIAFgjIAAABggaAMAAAAWCAoAwAAABYIygAAAIAFgjIAAABggaAMAAAAWCAoAwAAABYIygAAAIAFgjIAAABggaAMAAAAWCAoAwAAABYIygAAAICFEPGyhIQEmT9/vpw8eVIaNGggnTt3znb9V155RS5fvpxpeePGjaVr165u7xcAAADwmRblI0eOmBA7depU2bt3rzz00EPSp08fsdlsWW6TkpIiycnJjtvRo0flmWeekd27d+dqvwAAAEB6QTYvpsf+/fvLnj17ZN26dRIaGmrCbr169WTOnDnSu3dvl/YxefJkGTdunAnMpUqV8th+4+PjJTIyUuLi4qRYsWK5ep8AAADwvLzOa15rUb569aopjRg4cKAJs6pOnTrStm1bmTt3rsv7mTFjhvTq1csRkj21XwAAAORvXqtRPnTokFy6dElq167ttFyfb9y40aV9bNiwQXbs2CFTpkzJ9X61pENv6f9CUampqeYGAAAA35LXGc1rQfnixYvmXpvL04uKinK8dj3Tp0+X6tWryx133JHr/U6cOFHGjx+faXlMTIxERES4dDwAAAC4cRITEwMzKNvD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yeeMG/DZpKammpv9s3FlHeTu4tW5c2dp3bq1TJo0yemzUVb/dtJ/NtdbB+4pUqSIaVHWX/jaCqbB7O9//3uOrmtc+zzv4YcfNv9eEhISzOezbds2s3zz5s2mB35W553r2o3x4IMPOv7Y11FIpkyZYoLz//73P8dno7iu3Xh67hctWiSffPKJua4dOnRIateubT4zb1zXCMrp6LBXOsRSevo8KirKtEzCu5+NBrX0M67bn+uQWK6uA/foeezQoYPUqVNHvvzyS8cvEft5V1b/dtJ/NtdbB7mn5/mBBx6Qb7/9NkfXNa59nlemTBk5cOCAae3X27vvvmuWv/zyy7JgwQLHeee65hsiIyOlUKFCjn8rXNe8p2rVqtKsWTNzs4fawYMHy65du+TMmTM3/LpGUE5Ha2IWL15smuXt9IKmy+Fd+hnoP5D0NWT62eg4vG3atHF5HeScfi2pIblGjRoyb968TH+J16xZU6pVqyYLFy50LNM62S1btjj+7biyDnIuMTEx07LY2Finrxtdua5x7cub+mRtSbbftCxGffHFF/L44487zjvXtRtP+0toy316q1evNq2P+nW/4rrmPZ07dza/d9LXJevvC/3dY/8W4IZe13LU9S/AHTt2zPS07N27t23hwoW24cOHm7Evt23b5u1DyxdjJq5Zs8b24IMP2mrWrGke680+NIzq06ePrXr16rZPP/3U9vbbb9uKFClie+mll5z248o6cN2FCxdsN998s61GjRpmBBH756K38+fPO9bT8ZBDQkJsEydOtM2bN8/WrFkzW/PmzZ0+P1fWQc5oj24dJ/Trr7+2LViwwPTo1nO8ePHiHF3XuPblPatRLxTXtRvv8OHDtkaNGtnefPNN23fffWd74403zL+Re+65x2n0C65r3hEfH29+5/Tv398MCffOO++Y4eLGjh3rletakP4nd9k/sGjvSu2hrLOQ6VfC+pd/w4YNvX1YAU8L9n/77bdMy5csWWJqMO2tAFpHpr37taasT58+8qc//clpfVfWgeu0dXLQoEGWr7322mumA4ydft0/ffp0M+ueLtc6Wf06Mz1X1oHrtMPL22+/bVrDtPVF6/iGDx/u1JnP1esa1768pT3wtXPf3LlznWYH47rmvc6Wb731lpnFtWzZstKpUyfp379/pplcua55h9aL6zVLa5RLlSol9957r6lRTv/5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",
"text/plain": [
"<Figure size 800x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 6.2 Hyperparameter Tuning: Hidden Nodes Sweep\n",
"hidden_nodes_options = [10, 50, 100, 200, 500]\n",
"performances_hn = []\n",
"optimal_lr = 0.2 # Fixed learning rate from previous experiment\n",
"\n",
"print(\"Starting Hidden Nodes sweep. This will take a while...\")\n",
"\n",
"for hn in hidden_nodes_options:\n",
" print(f\"Training network with {hn} hidden nodes...\")\n",
" testANN = ann(784, hn, 10)\n",
" \n",
" # Train 1 epoch\n",
" for record in list: \n",
" values = record.split(\",\")\n",
" data = np.asarray(values[1:], dtype=float) / 255.0 * 0.99 + 0.01\n",
" target = np.zeros(10) + 0.01\n",
" target[int(values[0])] = 0.99\n",
" testANN.backpropagation(data, target, optimal_lr)\n",
" \n",
" # Evaluate on the Test Set\n",
" score = 0\n",
" for record in list2:\n",
" values = record.split(\",\")\n",
" correct_label = int(values[0])\n",
" data = np.asarray(values[1:], dtype=float) / 255.0 * 0.99 + 0.01\n",
" \n",
" outputs = testANN.feedforward(data)\n",
" if np.argmax(outputs) == correct_label:\n",
" score += 1\n",
" \n",
" # Calculate performance\n",
" performance = score / len(list2)\n",
" performances_hn.append(performance)\n",
" print(f\"Performance for {hn} nodes: {performance:.4f}\\n\")\n",
"\n",
"# Plotting the exact graph requested\n",
"plt.figure(figsize=(8, 5))\n",
"# marker='D' creates the diamond shapes seen in the reference image\n",
"plt.plot(hidden_nodes_options, performances_hn, marker='D', markersize=6, color='#003366', linewidth=1.5)\n",
"\n",
"# Formatting axes\n",
"plt.xlabel(\"number of hidden nodes\")\n",
"plt.ylabel(\"performance\")\n",
"\n",
"# Setting axes limits and ticks to match the image\n",
"plt.xlim(0, 600)\n",
"plt.xticks(np.arange(0, 601, 100))\n",
"plt.ylim(0.6, 1.0)\n",
"plt.yticks(np.arange(0.6, 1.05, 0.05))\n",
"\n",
"# Adding horizontal grid lines\n",
"plt.grid(axis='y', linestyle='-', alpha=0.7)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "e1ce2d95",
"metadata": {},
"source": [
"## 7. Model Selection and Architecture Evaluation\n",
"\n",
"**Which is the best ANN and how do you select which network is better?**\n",
"The best network is the one that achieves the highest accuracy on the Test Set while keeping the Cost Function (Loss) to a minimum, without falling into Overfitting. It is selected by comparing different combinations of hyperparameters (Hidden nodes and Learning Rate), evaluating them with data the network never saw during training. The winning network is the one that best generalizes to new data, not the one that memorizes the training data.\n",
"\n",
"## 8. Microcontroller Deployment Strategy\n",
"\n",
"**How do we implement it on a microcontroller?**\n",
"Once the network is trained on the computer, we extract the final weight matrices ($W_{ih}$ and $W_{ho}$) and export them as constant arrays (`const float`) in C/C++ language. On the microcontroller, only the inference stage (Feedforward) is programmed (matrix multiplication and the sigmoid function). The Backpropagation algorithm is completely omitted, which saves the microcontroller's limited memory and processing capacity, allowing for real-time signal processing."
]
},
{
"cell_type": "markdown",
"id": "e6c42d2f",
"metadata": {},
"source": [
"## 9. Corrupted MNIST Dataset\n",
"\n",
"**Performance Degradation on Corrupted Data**\n",
"When evaluating the previously trained model (`MyANN`) against the **Corrupted MNIST** dataset (which introduces artifacts like brightness variations, dotted lines, and glass blur), we observe a significant drop in classification accuracy. The model fails to recognize digits that it would normally classify correctly if they were clean.\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "5dac52a6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Evaluating main model (MyANN) against: brightness...\n",
"Accuracy on 'brightness': 13.00%\n",
"\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAAD1CAYAAABk3mnHAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlcelbwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAPmpJREFUeJzt3Qd4FFXXwPETQk3oHQRBpUkXUcGGCKIviFIEAVGkiFJEfe0Ve0ERQZr6ioooRRQBQZCuiIhU6UjvvYdO9nvOldlvyyTZSjLZ/+958kDu7s5OZmd27rnl3DiXy+USAAAAAAAcKkt67wAAAAAAAOEgsAUAAAAAOBqBLQAAAADA0QhsAQAAAACORmALAAAAAHA0AlsAAAAAgKMR2AIAAAAAHI3AFgAAAADgaAS2AAAAAABHI7AFkOmsXLlSihcv7vXz6quv2j63T58+fs9dvHhxxPaldu3aXttu3759wPt9xRVXyKFDh7yes3bt2hT3NdzXB3tM7X6GDBkioRo4cKB7O3Xr1g34sVg1ZcoU28/g0ksvlerVq0ubNm3ku+++E5fLFfS2o3G8+QwBANGUNapbB4B0cPbsWdmzZ49X2ccffyzPPvus5MqVy1125swZ6devn99ztTwS5s6dK4sWLfIqGzNmjHz00UdSuHDhgPb7vffek3fffTfF53jua7ivT43dtu0kJSVJqI4fP+5+j9y5cwf8WKw6depUip/Jtm3bZPny5TJ69Gi55557TIAbjGgc71C3uX79ernxxhu9rqty5cpFZJ8AAJkHPbYAYsLBgwdlxIgRXmWjRo2S3bt3R+09hw8fbhsgjhw5MuBtaEAezj6G+/qUaHC+a9cuv5/u3btH/L0QmO+//958BuvWrZNWrVq5y8eOHSszZ8507GE8d+6cCYitH/0dAABfBLYAMr34+Hjz74ABA7zK+/fv7/V4JJ0+fdqrl+ySSy5JNeBNyYkTJ+TNN98MeT/CfX1K8uXLZzsMNiEhIeRtPvroo+4Aef78+RHd31hQsGBB8xmUL1/eq5deLViwIKht8VkAAJyGwBZApnf33Xebf1esWOHuufr111/d80ubNWtm+7oPPvjAHbDdcccdfo/rME/r8apVq8r58+fdj02YMEEOHz5s/p81a1avuacLFy6UNWvWpLnfBQoUMP9+9tlnsnnz5iD/6vBfH47x48d7BbwlSpSQsmXLynXXXSePP/646VX09cUXX0jNmjXNT9OmTQN+rxdeeMH9PtZnbdHjbj12zTXXpDrnU3sCNSCsVauWlCxZUubNm+f1ebZt21aqVKkipUuXNnNYu3btKsuWLfPbn+TkZBk2bJjceeedUqFCBTPnVbf/4IMPmnNGhxB7qlixons/gmn0SI3nkHvfxptA/u60Pgudu/3000+b817ncut8Xp2//e2337q3rX9XanTu7yeffGLOCd3G7bffbuYNe2rYsKHcdNNNXmX6u/Ue+tnb/U2BbNtTtD7fYM8FAEAYXACQySxZskSz5bh/fvnlF1fOnDnN/++++27znObNm5vfs2XL5poxY4bX8//44w/znB07dpjHrXLdrqf//Oc/7sf++9//ej125513uh9r1KiRKzk52VW6dGl32fPPP5/mfr/zzjvu/3fo0ME8Z/ny5bb7GonXB3NMv/jii1SfP3LkSK/n+/7o5zFt2jSv13ju7xVXXBHwYz169HA/duONN3o99v7777sfK1OmTKrbbNmypdc+zpo1y3Xq1ClX06ZNU/w74uPjXYMHD/babteuXVP929u1a+f1/Hz58rkfGzJkiCtQ48aN89tfy8svv+z12KJFi4L6u1M73vv373dVqFDB7+/Kmzev67HHHnP/rn9Xase7U6dOtsdnwoQJ7tfUqFEj1WOpn32o21bR/nyDPRcAAKGjxxZAplekSBFp166d+f/EiRNNr6320KjWrVubXio7Wn7vvfe6f/fsdd2/f79MmzbN/XuXLl3c/9+3b59X75C+R1xcnEniY9H5vmllq9Ve4ptvvtn9/NWrVwf1d4f7+tQ89thjtkORdS6z1QvuOfdWkxn9+eef7uOpPVXRmI+bJUtot7UNGzbI0qVLzXmxdetWs8/XX3+9PPXUU+acUcWKFZMffvjBPPd///uf6YnXXvqePXu6h05rMi7toVM5cuQw29uyZYvppdfezJYtW0q2bNkkGlq0aGE+gzx58sgbb7zh7rnVedbaGxvM350a7am1etx16PmXX35pemtffPFF816B0PfVERO///67/PXXX3LllVe6H/McRj1jxgz57bffvF6rv1vn1TvvvBPytlU0P9/0PBcAICaFERQDQIbk27uovy9btsyrJ8n6/4IFC1yrV69OsRdTe7qs8sTERNeRI0dM+aBBg1LsJezfv7/7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",
"text/plain": [
"<Figure size 1200x300 with 5 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Evaluating main model (MyANN) against: dotted_line...\n",
"Accuracy on 'dotted_line': 87.82%\n",
"\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAAD1CAYAAABk3mnHAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlcelbwAAAAlwSFlzAAAPYQAAD2EBqD+naQAASsdJREFUeJzt3Qd0FNX3wPG3SWgJvStSFUITkCJNmoCoqAgKWFBEFBEpNqwoYgV+IiggKNJsNBUBEZEuiKJIkSK9SO+9J9n/uU9m/5udt8luNiGZ7PdzTg7kZnZ2MpnZmTvvvftcbrfbrQAAAAAAcKiI9N4AAAAAAABCQWILAAAAAHA0ElsAAAAAgKOR2AIAAAAAHI3EFgAAAADgaCS2AAAAAABHI7EFAAAAADgaiS0AAAAAwNFIbAEAAAAAjkZiC8DxOnXqpIoWLer5KlGihDp69KhtudOnT6trr7020bIPPPBAqm3HhAkTEq1bvlatWhXwdr/zzju2ZR5//HG/2xrq65Piu27Tl+zLUJQqVcqzrm+//Tbgn4WrZs2aefbJVVddpa655hr9N6hRo4Zq06aN6t+/v9q7d68KB9WrV/fsi1GjRqVoHRx/AJC5RKX3BgBAqI4dO6YOHDiQKCY3uy+++GKi2JgxY9S2bdsSxUwJcEqNHj3ath3jx49X1apVC2i7JTHp0qWLKlSokHEZ320N9fXB7lNfMTExKhT79+9XFy5c0P8/d+5cwD8LV4cPH/b7N1mxYoWaOnWqeu2119RLL72k+vXrpyIiQn923bVrV/X999/r/999991q5MiRKVomtR08eNCzL86cOZOidXD8AUDmQostgEzp448/VvHx8Z7vExIS1NChQ9Ps/Xbv3q0WLFhgbMWNi4sLaB3Sovzee++leBtCfb0/0jK4b98+25fvQwJcOXXr1vX8DWbOnKlatmyp43Ksvf3227rFPTUcP35cJ5DyJf9P6TIAAKQ1ElsAmUpkZKT+999///W0IokffvhBbdmyJdEyqenLL7/UybMoXLiwior6r0OM3OzPnj074PWMGDFCJ8kpFerrTWR/mboiy+8Zip07d3qS5HvvvTfVtjccZM2aVf8NSpcurW6//XZ9fPfq1cvz888//1xNmTIlXbfRyTg2AcB5SGwBZCqNGzdWefLk0f//8MMPPfEhQ4Z4us/KWEVf0p3xuuuu8yRtc+fOtS1Tq1Ytz8+l27G3L774wvP/+++/X918883Gn/mTL18+/e/58+fVm2++GeBvm3qvD1WDBg0SJb3FihVT5cuXV61atVLjxo1L1HpuqV27tu6mLV/S6hgI6U7t/T6LFy9O9HPvMdSTJk1KckzlypUr1T333KPKlCmjx6haJNHu27evatiwof6ZfDVv3lwNHz7c0z3a2+bNm1WPHj308VGyZEn9e0uyKd2B//nnH1sXeWsbqlSpolLTgAEDEnVDHzRokG2ZXbt2qVdffVXddNNNOimW301+T9lW727OP/30k97GadOmeWLyf+99L4lzcst4d38Pdr+KH3/8UbVo0UL/7WT/Sq8Lt9ut0lpSx6bvcbR161bVoUMH/flRs2ZN9cwzz/htuU7JPgAABMgNAA7XqlUrudPVX/L/Z5991vP9ypUr3atXr/Z8/9RTT7nbt2/v+b5Fixae9XTr1i3RerwtW7bM87OsWbO6Dx065PnZ8uXLPT+Tr6VLl7pHjRrl+T579uzu48ePJ7vdderU0f+Piopyb968WS9zzz33GLc1NV4f6D4tWbJkssvHxsYm2ge+X/LecXFxiV6TLVs2z8+/+OKLgH4m+917vXPnzk30upiYGM/Pxo4d63edPXr00H8X6/tGjRrpZX788Ud3njx5/P4e1apVcx88eNCzzo0bN7pz5syZ5O++adMmz/KDBw/2xIsUKeIORtWqVW3b66tDhw6eZSIiItzHjh3z/GzatGlJbmu+fPncCxcu1MtOnTo1yd9JvsaPH5/sMtZ5Eux+FR999JFx2U6dOrmLFSvm+V72aUqk5Pjz/Vnv3r3defPmtW1jzZo13fHx8Ylel5J9AAAIHC22ADIdaT2zuhtLq63VWutyuVTPnj39vu7pp5/Wywjp2imtW5avv/7a8//WrVurggULJur2aSlevLiqU6eObgG0uiNLK2og3ULfffddzzjJ119/PajfOTVe74/sB1NX5FdeecWzzJIlSxKNv920aZP66quvVN68efXPpTu2bwtqakhpgaRhw4apbt26qdWrV+vt/e677/TvKV2iT5w4oZd55JFH1Nq1a3VhJukJIKTKdceOHT3rkd9RxjYLaf1dt26d7vI+Z84c3QpatmxZY2t1WpFWWIt0jd+zZ4+na+19993n2VYZkyst1suXL/f8blIwTI7tI0eOqNtuu03vF2lxt8j/vf/G7dq1S3aZAgUKpGi/Sivos88+m2i98rf67bff1Jo1azy/V3r74IMP1Msvv6w2btzoOf+E7Nd58+Z5vk/JPgAABIfEFkCmI10F77rrLk/xJisplZv1cuXK+X2dJCF33HGH/r8kI59++qknQZg8eXKiKXQskkROnDjR833btm11cpw/f/6guyM3adLE001a1vn3338H9XuH+np/5Pe3igN5f508edKzjCT63kmv7EuZXkiSPcusWbNUarMeRARL/s7SVVe6A8v2yt9LugmfPXtW/1y6lUp380qVKqkbbrhBffbZZ4l+D0ncfRPr6Oho3dVdupfK30EeLshySR1zqc13/LhVuEy236ounTNnTp2QSzdbmSpIzo8sWbJ4klsZL54tWza9X7Jnz+5Zl/zf+29sfZ/UMvL3Scl+le2ztl32qVQXl7+VPDQaO3asyijkAdYLL7yg/8aS4FoPcsSGDRs8/0/JPgAABIfEFkCmJK2vQsatWWPXrFhSvFuJ5Ibz0qVLutqxtD4JSVq8E1YZiyhTj1ikFcv0fxkLumPHjmTf32r1kXGEffr0SXb51H59MFWRvSswy834c889p8duyj66+uqrdWIjDxYsGWmOVdM4a2nB9G5hs34H+apfv36iZf/66y9PS6IUcrIeXshDFUlwJQmTByC//PJLouRXpmOy9p+0PKY235ZMme9WeM+nLAmVNQ7dWsa7pVdaRlNTSvartHxbZMyy9/ZWrlw55KmmUouMlfXmndharbMp3QcAgOAwjy2ATEluOKU1xLqhrFixoi7SkhzpFmi9Tua5lLlBvasaP/bYY4laCb27IQvvbpne0/xIoimJj8wzmhQpkCPdQeV9Z8yYoROlYIT6+qSqIvuzdOlS1bRpU93lOilpURzHqkRttbIntw0WaaH15d1lWLY1qXl8rdZqafWUbsfS+itJrBQNkm2QpFW+5OGIdMG2HnJI0itfaUGOMe/ur9KKaFWu9j4WrdZZb96xQKenClRK9qv3a5Lb3vTkncgmVXE9JfsAABAcWmwBZFre0594/z853i27MkZXxl8KGTMrY+O8W2QkefTm3VVXxip6C6Q7spB5SK1WvkBaeVP79cH66KOPPAmltPzNnz9ft0pJq6R0zU5NOXLkSPT9qVOnPP+XRDKU8azeXYarV69ubKW2vh5++OFED1GkGrB0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",
"text/plain": [
"<Figure size 1200x300 with 5 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Evaluating main model (MyANN) against: glass_blur...\n",
"Accuracy on 'glass_blur': 82.03%\n",
"\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAAD1CAYAAABk3mnHAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlcelbwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWDVJREFUeJzt3Qd8FMX7P/DZS68khNBDT0LvHUQRpSgISBEUQUBRUbCLBX/2rxUVAbGBoiBFAQGl9957770nEBLSc/t/PSN3/0vm2XCXQrK5z/v14gU8N7e3dzd7O7M784ym67ouAAAAAAAAAEzKUtA7AAAAAAAAAJAb6NgCAAAAAACAqaFjCwAAAAAAAKaGji0AAAAAAACYGjq2AAAAAAAAYGro2AIAAAAAAICpoWMLAAAAAAAApoaOLQAAAAAAAJgaOrYAAAAAAABgaujYAkCRtW/fPlG6dOlMf9577z227Oeff66U3b59e57tS+PGjTNtu1+/fk7vd9WqVcW1a9cylTl06JDhvub2+a5+ptyf8ePHi5waO3asfTstWrRw+jEQIiYmRnz11Veia9euonbt2qJChQqiVq1aok2bNmLAgAFiwoQJ4syZM0X6M83p+ylqnwMAgLvxLOgdAADIL2lpaeLSpUuZYmPGjBEjRowQfn5+9lhqaqr4+uuvlbIUzwtr164V27ZtyxSbMWOG+Oabb0SJEiWc2u/PPvtMfPrpp4ZlHPc1t8/PDrdtzs2bN0VOJSQk2F8jMDDQ6cfcna1uJyUlsY+vWbNG/Pbbb7KD++uvvxbZzzSn76eofQ4AAO4Gd2wBwK3ExsaKyZMnZ4pNmzZNXLx4Md9ekzoTXAdx6tSpLnVacrOPuX2+EeqcX7hwQfkzdOjQPH8tMDZy5EgxfPhwe6e2VatWYtasWeLo0aPi8OHDYtmyZWLcuHHivvvuE15eXvgoAQCgyEHHFgDchoeHh/z722+/zRQfPXp0psfzUkpKivjzzz/t/y9Xrly2HV4jiYmJ4qOPPsrxfuT2+UaKFSvGDkX29/fP8TaHDRtm7yBv3LgxT/e3KFq/fr34+OOP7f/v0aOHWLVqlejevbschh4ZGSnuvfdeebFhyZIl4vvvvy/Q/QUAAMgP6NgCgNugeYdk7969Yvny5fLfq1evts8v7datG/u8L7/80t5h69ixo/L49OnT7Y/TvMaMjAz7Y3PnzhXXr1+X//b09Mw093Tr1q3i4MGDt93v0NBQ+fdPP/0kTp486eK7zv3zc2POnDmZOrxlypQRlSpVEs2aNRMvvviivJuY1S+//CLq168v/3Tp0sXp13rrrbfsr2P7rm3oc7c91qRJk2znVqanp8th2w0bNhRly5aVHUfH77Nv375y3mpERISoW7euGDJkiNi1a5eyP1arVUycOFF07txZREVFyfmutP0nnnhC1pnk5ORM5aOjo+374cpFD6qfNt7e3vLObHYXaVy5gJOT78+V9+3qZ5QT9Bo01YDmudO+0zG8cOFCl7ZxJ+oWAADkkg4AUETt2LFDp58525/Fixfrvr6+8t9du3aVZbp37y7/7+XlpS9btixT+Q0bNsgy586dk4/b4rRdR506dbI/9vLLL2d6rHPnzvbH2rdvr1utVj0iIsIee/PNN2+735988on93wMGDJBl9uzZw+5rXjzflc/0l19+ybb81KlTM5XP+oe+jyVLlmR6juP+Vq1a1enHnnvuOftjrVu3zvTYF198YX+sYsWK2W6zR48emfZxxYoVenJyst6lSxfD9+Hh4aF/9913mbY7ZMiQbN/7o48+mql8sWLF7I+NHz9ed1ZwcLD9effcc4/TzzN6/7n9/lx5365+Rjl5P3379mW3nfX7Kqi6BQAAeQN3bAHAbYSHh4tHH31U/nvevHnyri3dgSO9e/eWd1A4FH/kkUfs/3e863r16lU5vNPmySeftP/7ypUrme4M0WtomiZ69uxpj9F8X12nNq4xusNEWW1t5Q8cOODS+87t87PzwgsvsEORaS6z7S6449xbysi7adMm++dJd+TyYz6uxZKz09uxY8fEzp07Zb04ffq03OeWLVuKV199VdYZUqpUKTl/lcr+/PPP8k483aV//vnn7UOnKRkX3YkkPj4+cnunTp2Sd+n/+OMPOVw4L+a6xsXFiRs3btj/X6VKlUyP01167vvJmhnZiKvfnyvv+058RvQdHT9+XH4v9L3SnWEbuuNMr1fQdQsAAPIGOrYA4FaoI2Ybnvjwww/bhw3b4kZeeukl+7+nTJli70xQdmMaXkhat24tatSoYS9HyaFsj1EDneY8kl69etnLUEdh5cqVt93v//3vf/Jv2t933nnHhXecN883Qp8DZZLN+oc+X+Lr65upQ1W+fHnRtGnTTMNnjxw5Ihv9eYku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",
"text/plain": [
"<Figure size 1200x300 with 5 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import os\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# 9.2 Robustness Evaluation on Corrupted MNIST (Inference Only)\n",
"def evaluate_npy_corruptions(corruption_type, base_folder, model):\n",
" images_path = os.path.join(base_folder, corruption_type, \"test_images.npy\")\n",
" labels_path = os.path.join(base_folder, corruption_type, \"test_labels.npy\")\n",
" \n",
" try:\n",
" images = np.load(images_path)\n",
" labels = np.load(labels_path)\n",
" except FileNotFoundError:\n",
" print(f\"Error: No se encontraron los archivos para {corruption_type}\")\n",
" return\n",
" \n",
" score = 0\n",
" errors = []\n",
" num_samples = len(labels)\n",
" \n",
" print(f\"Evaluating main model (MyANN) against: {corruption_type}...\")\n",
" \n",
" for i in range(num_samples):\n",
" img_flat = images[i].flatten()\n",
" \n",
" if img_flat.max() > 1.0:\n",
" data = (img_flat / 255.0) * 0.99 + 0.01\n",
" else:\n",
" data = img_flat * 0.99 + 0.01\n",
" \n",
" correct_label = labels[i]\n",
" \n",
" outputs = model.feedforward(data)\n",
" predicted_label = np.argmax(outputs)\n",
" \n",
" if predicted_label == correct_label:\n",
" score += 1\n",
" else:\n",
" \n",
" if len(errors) < 5:\n",
" errors.append((img_flat, correct_label, predicted_label))\n",
" \n",
" accuracy = (score / num_samples) * 100\n",
" print(f\"Accuracy on '{corruption_type}': {accuracy:.2f}%\\n\")\n",
" \n",
" \n",
" if errors:\n",
" fig, axes = plt.subplots(1, len(errors), figsize=(12, 3))\n",
" fig.suptitle(f\"MyANN Failures: {corruption_type.capitalize()}\", fontsize=14, fontweight='bold')\n",
" for ax, (img_data, true_lbl, pred_lbl) in zip(axes, errors):\n",
" ax.imshow(img_data.reshape(28, 28), cmap='Reds')\n",
" ax.set_title(f\"True: {true_lbl}\\nPred: {pred_lbl}\", color='darkred')\n",
" ax.axis('off')\n",
" plt.show()\n",
"\n",
"\n",
"base_dir = \"mnist_c\" \n",
"\n",
"corruptions_to_test = [\"brightness\", \"dotted_line\", \"glass_blur\"]\n",
"\n",
"for corr in corruptions_to_test:\n",
" evaluate_npy_corruptions(corr, base_dir, MyANN)\n"
]
},
{
"cell_type": "markdown",
"id": "ed816300",
"metadata": {},
"source": [
"## 10. Fashion MNIST Dataset\n",
"\n",
"To evaluate the limitations of the current Multi-Layer Perceptron (ANN) architecture, a new model instance was trained from scratch using a structurally complex dataset (Fashion MNIST). Unlike handwritten digits, which are mostly empty space and simple lines, the Fashion MNIST dataset contains garments with distinct textures, internal edges, and complex spatial hierarchies.\n",
"\n",
"**Empirical Results:**\n",
"While the ANN easily achieved over 95% accuracy on standard digits, its performance significantly plateaued when trained on the more complex visual data of clothing. The network struggled to capture the underlying features, resulting in a notably lower classification accuracy. "
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "b4b439e0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Loading Fashion MNIST dataset...\n",
"Training FashionANN from scratch. This may take a few minutes...\n",
"Epoch 1/5 - Average Loss: 0.1682\n",
"Epoch 2/5 - Average Loss: 0.1414\n",
"Epoch 3/5 - Average Loss: 0.1352\n",
"Epoch 4/5 - Average Loss: 0.1314\n",
"Epoch 5/5 - Average Loss: 0.1263\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAAHVCAYAAAATqShMAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlcelbwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAfP9JREFUeJzt3QdYk9f3B/DDBpEhCC4QFRcO3HvWPTtsa4et/ju0jrbaYatddtvWDttatfbXvazddVH3FhUXqDhx4WLvDfk/59I3hkAgCRk3yffzPO9Ddt7kPdyc3Jx7r5NKpVIRAAAAAICdcrb2DgAAAAAAmBMSXgAAAACwa0h4AQAAAMCuIeEFAAAAALuGhBcAAAAA7BoSXgAAAACwa0h4AQAAAMCuIeEFAAAAALuGhBdAEm+++SZ169ZNr9t+/PHH1LZtW7PvE8ilU6dO9N5771nt/gAAtsrV2jsAILM+ffpQenp6ldf9/vvv1L59e5M91/Xr1+nUqVN63TY5OVnv25ra119/Te+++26178H9999Phw4doiZNmtDmzZsr3bdOnTq0detW8vPzq3C/GTNm0JEjR2jv3r2V7vPLL7+IhE2RkJBAn3zyCcXFxYlj1KxZMxo4cCBNmTKF6tWrR2fOnKHx48fr9Zo+++wzGjp0qFHvh6Weh/ExT0pKstr9a2vAgAHUtGlT+vHHH0l2xcXF9PPPP9PatWtFrPGipLzv3bt3p4cffpgaNmxo7V0EAAMg4QWoIZlp0aIFfffdd5Wu4wTLWubMmUMPPPCAVZ47NTVVJE5ubm4iGX3//fcrXH/x4kVauXIlubq6UkFBQZX3ZQsXLqR33nmnwvWXL18W73lV98nPz1dfxknIHXfcIRLcp556ikJCQujo0aP09ttv06uvvkoZGRkUFhZGf/31V4XHuvfee+nKlSu0c+fOCpfz/Y1lqedhsbGxIpm31v1ri4+tLaxmzwnurbfeKmLv6aefFjHm4eEhYoy/ZC1YsEB8cbDmewkAhkHCC1AD7o2UrXygfv36YrOm0aNH0w8//CCSVk5uFd98843Yt1atWomkryo9evQQZRmzZs2i0NBQg5/72WefpUaNGtG6devI3d1dXNa5c2e6++676aGHHhLn+XLt4+bp6UkuLi4mPZ6Weh7WunVrq97fEfAXqzFjxogva/wrBceZokuXLuKL5uzZs6m0tNSq+wkAhkENL0At8E+znNTwFhERQT179qRp06bRsWPHKtwuMzOT3njjDfFzdteuXenOO++kVatWVfmYZWVloteUyyl69eol7ldSUqJXDe+5c+do5syZIqHk55k8ebL40K6qVlif56nO//3f/9GNGzcoKipKfRn33n377bciKeAeYF1ef/11cnJyopdeeomMwb3InLwpya7ml5OffvqJZFNUVCSO15IlS+jEiRM0adIkUZ7BZRqM40KJow4dOtDw4cPpo48+EverrgZX83FPnz4tSkk48efeSc2yEFPdn+OD96t///4ixp5//nnKy8ujkSNHiiTQFLKyskR8cPkD7+9tt91Gv/32W4XbcJzxrwtjx44VSSh/+Vq0aFGFXwH0uU1V/ve//4lfFLiMRjPZVfCXOy5NCQgIMGifN2zYIN7r48eP0+rVq8Ux5v167LHHxP+Rgkt0+HZcTqGNb9euXTv69NNPKxyTzz//nEaNGkWRkZE0ZMgQcTw1E3LN5/7zzz/F8eLHUZ43OjpatEl87CdMmEAHDx4U7x3fh38t0d6HF154QcQAv1a+vWbZEps/f754L3jf3nrrLdG+cDvD7ym3O9q4t/zll1+mQYMGiXaL24+YmBiDnxegWioA0CkwMFA1aNAgndenp6er4uPjxXb8+HHVv//+qxo/fryqbt26qnPnzqlvx4/Rtm1b1Z9//qk6cuSI6q+//lLdd999qq+++kp9m1mzZqm8vb1VTz/9tGrRokWqffv2qT755BOVu7u7at68eRWe98UXX+TfhStcdvDgQZWvr6+qX79+qvXr16u2bt2qmjBhgsrNzU31zz//GPU8VeH78HPHxcWJ57rzzjvV123ZskVcd/ToUfGaw8LCdN6Xn8vZ2Vm8H4qxY8eK97yq++zdu1d9Wa9evVQ+Pj6qEydOqAzB92vQoIHK3LSfJz8/X7yGKVOmqIYOHapavXq1as2aNapff/1VXH/27Fl1HPFxXL58uSooKEg1efLkCo/r4eGheuaZZyo97sMPP6waM2aMau3ataqdO3eqRowYofL09FRdvnzZpPefNGmSuPyjjz5S7d+/X+znxIkTVeHh4RXiQBd+TzhmdMnMzFS1a9dO1bhxY9WPP/6oio6OFrHu5ORUITYXLFgg/sdWrFihOnTokGrjxo2q559/XvXYY48ZdJuq8PFxdXVV5ebm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",
"text/plain": [
"<Figure size 800x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Evaluating FashionANN on Test Set...\n",
"FashionANN Accuracy on Test Set: 83.52%\n"
]
}
],
"source": [
"# 10. Architectural Limits: Training on a Complex Dataset (Fashion MNIST)\n",
"\n",
"print(\"Loading Fashion MNIST dataset...\")\n",
"try:\n",
" file_f_train = open(\"fashion-mnist_train.csv\", \"r\")\n",
" fashion_train_list = file_f_train.readlines()\n",
" file_f_train.close()\n",
" \n",
" file_f_test = open(\"fashion-mnist_test.csv\", \"r\")\n",
" fashion_test_list = file_f_test.readlines()\n",
" file_f_test.close()\n",
"except FileNotFoundError:\n",
" print(\"Error: No se encontraron los archivos CSV. Verifica los nombres.\")\n",
"\n",
"FashionANN = ann(784, 100, 10)\n",
"learning_rate = 0.1\n",
"epochs = 5\n",
"fashion_epoch_losses = []\n",
"\n",
"print(\"Training FashionANN from scratch. This may take a few minutes...\")\n",
"\n",
"for e in range(epochs):\n",
" total_loss = 0\n",
" valid_samples = 0\n",
" for record in fashion_train_list:\n",
" if not record[0].isdigit(): \n",
" continue\n",
" \n",
" values = record.split(\",\")\n",
" data = np.asarray(values[1:], dtype=float) / 255.0 * 0.99 + 0.01\n",
" index = int(values[0])\n",
" \n",
" target = np.zeros(10) + 0.01\n",
" target[index] = 0.99\n",
" \n",
" output = FashionANN.feedforward(data)\n",
" loss = np.sum(0.5 * (target.reshape(-1, 1) - output)**2)\n",
" total_loss += loss\n",
" \n",
" FashionANN.backpropagation(data, target, learning_rate)\n",
" valid_samples += 1\n",
" \n",
" average_loss = total_loss / valid_samples\n",
" fashion_epoch_losses.append(average_loss)\n",
" print(f\"Epoch {e+1}/{epochs} - Average Loss: {average_loss:.4f}\")\n",
"\n",
"\n",
"plt.figure(figsize=(8, 5))\n",
"plt.plot(range(1, epochs + 1), fashion_epoch_losses, marker='o', color='purple', linewidth=2)\n",
"plt.title(\"Fashion MNIST - Training Loss Convergence\")\n",
"plt.xlabel(\"Epoch\")\n",
"plt.ylabel(\"Average Loss (SSE)\")\n",
"plt.xticks(range(1, epochs + 1))\n",
"plt.grid(True, linestyle='--', alpha=0.7)\n",
"plt.show()\n",
"\n",
"\n",
"print(\"Evaluating FashionANN on Test Set...\")\n",
"score = 0\n",
"test_samples = 0\n",
"\n",
"for record in fashion_test_list:\n",
" if not record[0].isdigit():\n",
" continue\n",
" values = record.split(\",\")\n",
" correct_label = int(values[0])\n",
" data = np.asarray(values[1:], dtype=float) / 255.0 * 0.99 + 0.01\n",
" \n",
" outputs = FashionANN.feedforward(data)\n",
" if np.argmax(outputs) == correct_label:\n",
" score += 1\n",
" test_samples += 1\n",
"\n",
"fashion_accuracy = (score / test_samples) * 100\n",
"print(f\"FashionANN Accuracy on Test Set: {fashion_accuracy:.2f}%\")"
]
},
{
"cell_type": "markdown",
"id": "61fb544f",
"metadata": {},
"source": [
"## 11. General Conclusion: Architectural Limitations and The Transition to CNNs\n",
"\n",
"The development and implementation of this Artificial Neural Network (ANN) from scratch successfully demonstrated the core mathematical principles of Feedforward inference and Backpropagation optimization. While the model achieved a robust 95% accuracy on the standard MNIST dataset, the subsequent stress tests exposed critical vulnerabilities inherent to standard Multi-Layer Perceptrons when processing 2D image data.\n",
"\n",
"**Key Findings from Dataset Evaluations:**\n",
"1. **Complexity and Spatial Hierarchies (Fashion MNIST):** Training the network from scratch on complex images (clothing) revealed a performance ceiling. By flattening a 28x28 image into a 1D vector of 784 inputs, the ANN destroys the two-dimensional spatial topography. It treats adjacent pixels as mathematically isolated, making it highly inefficient at learning local features such as edges, curves, and textures.\n",
"2. **Noise Sensitivity and Translation Variance (Corrupted MNIST):** Evaluating the highly accurate digit-recognition model against images with artificial noise (e.g., dotted lines, glass blur, brightness shifts) resulted in a drastic drop in accuracy. The weight matrices ($W_{ih}$) strict pixel-to-pixel mapping forces the network to memorize exact global locations. Any spatial shifting or superficial corruption completely alters the 1D input array, breaking the model's predictive capability.\n",
"\n",
"**Final Verdict:**\n",
"Standard ANNs are powerful mathematical approximations but are structurally brittle for real-world computer vision tasks. For the overarching goal of this library—automated ROI segmentation in complex thermal images—a dense, fully connected architecture is insufficient. \n",
"\n",
"To overcome these limitations, the architecture must evolve to utilize **Convolutional Neural Networks (CNNs)**. Moving forward, the implementation of sliding mathematical kernels (filters) will allow the network to process images in their native 2D format, preserving spatial relationships, sharing weights to optimize parameter count, and extracting robust, translation-invariant features."
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"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.14.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}