{ "cells": [ { "cell_type": "markdown", "id": "8595fed8", "metadata": {}, "source": [ "\"Open" ] }, { "cell_type": "markdown", "id": "d2f79457", "metadata": {}, "source": [ "# Model For Predicting MNIST Images" ] }, { "cell_type": "code", "execution_count": 20, "id": "57bd3880", "metadata": {}, "outputs": [], "source": [ "import torch\n", "import torch.nn as nn\n", "import torch.optim as optim\n", "from torchvision import datasets, transforms\n", "from torch.utils.data import DataLoader\n", "import matplotlib.pyplot as plt\n", "import time" ] }, { "cell_type": "markdown", "id": "542feb3f", "metadata": {}, "source": [ "## Changing To CPU" ] }, { "cell_type": "code", "execution_count": 21, "id": "e20e7e74", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using device: cpu\n" ] } ], "source": [ "# however, to be able to save and load the complete model we need to use \"cpu\"\n", "device = torch.device(\"cpu\")\n", "print(f\"Using device: {device}\")" ] }, { "cell_type": "markdown", "id": "b2c539fe", "metadata": {}, "source": [ "## Data Preparation " ] }, { "cell_type": "code", "execution_count": 22, "id": "78006010", "metadata": {}, "outputs": [], "source": [ "# Define a transformation to flatten the 8x8 images\n", "transform = transforms.Compose([\n", " transforms.Resize((6,6)), # Resize the PIL Image to 8x8 first (MNIST images ar\n", " transforms.ToTensor(), # Then convert to tensor\n", "])\n", "\n", "# Load the MNIST dataset\n", "train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)\n", "test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)\n", "\n", "# Create DataLoaders\n", "batch_size = 36\n", "train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n", "test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)" ] }, { "cell_type": "code", "execution_count": 23, "id": "30e1538a", "metadata": {}, "outputs": [ { "data": { "image/png": "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UIjIAwAAKETkAQAAFCLyAAAAChF5AAAAhYg8AACAQkQeAABAISIPAACgkEGtB2ysY445pvWEjp/97GetJyRJurq6Wk/omDFjRusJSZLp06e3nlDGgAF952tBf/qnf9p6QpLk+9//fusJHVdeeWXrCUmSr3/9660nbBbjx49vPSFJMnjw4NYTOmbOnNl6QpLk4x//eOsJHTfccEPrCUmSc889t/UEtoC+8u+6yy67rPWEjpEjR7aekCT54he/2HrCBus7/3oDAADgIxN5AAAAhYg8AACAQkQeAABAISIPAACgEJEHAABQiMgDAAAoROQBAAAUIvIAAAAKEXkAAACFiDwAAIBCRB4AAEAhIg8AAKAQkQcAAFCIyAMAAChE5AEAABQi8gAAAAoReQAAAIWIPAAAgEJEHgAAQCEiDwAAoBCRBwAAUIjIAwAAKETkAQAAFCLyAAAAChF5AAAAhYg8AACAQkQeAABAISIPAACgEJEHAABQiMgDAAAoROQBAAAUIvIAAAAKEXkAAACFDGo9YGPNnj279YSOBx98sPWEJMljjz3WekLHX//1X7eekCRZtWpV6wllHH300a0ndEycOLH1hCTJ5z73udYTOs4888zWE5Ikw4cPbz1hs7j44otbT0jSt/4OW7p0aesJSZLzzjuv9YSOE088sfWEJMk777zTegJbwH777dd6QpLkS1/6UusJHccff3zrCUmS3t7e1hM2mJM8AACAQkQeAABAISIPAACgEJEHAABQiMgDAAAoROQBAAAUIvIAAAAKEXkAAACFiDwAAIBCRB4AAEAhIg8AAKAQkQcAAFCIyAMAAChE5AEAABQi8gAAAAoReQAAAIWIPAAAgEJEHgAAQCEiDwAAoBCRBwAAUIjIAwAAKETkAQAAFCLyAAAAChF5AAAAhYg8AACAQkQeAABAISIPAACgEJEHAABQiMgDAAAoROQBAAAUIvIAAAAKEXkAAACFiDwAAIBCBrUesLFef/311hM6LrnkktYTkiSzZs1qPaFj9uzZrSckSf7pn/6p9YSPrKurq/WEJMlJJ53UekLH9OnTW09Ikqxbt671hI5XX3219YQkyXvvvdd6wmbxH//xH60nJEn+8i//svWEjj322KP1hCTJiSee2HpCx7/+67+2npCkb/1d1N9tu+22rSd03Hrrra0nJEmuvfba1hM6nnnmmdYT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cuXKTJ06NRMmTMjQoUPT1dWVm266qfUsKOv555/PGWeckT333DPbbbddhg0blqOOOip3331362lsgkGtB7DxnnrqqYwfPz4jR47M1KlTs27duvzjP/5jjj766DzxxBPZZ599Wk+EUq688sr853/+Z84444wceOCBWbJkSWbMmJHf+73fy2OPPZb999+/9UQoZ+nSpZk2bVpGjRqVgw46KA888EDrSVDaggULsmLFipxzzjnZfffd8+677+aOO+7Iqaeemuuuuy4XXHBB64lshK7e3t7e1iPYOCeffHIeffTRvPjii9lll12SJIsXL87ee++dE044IXfccUfjhVDLI488kt///d/PNtts07n24osv5oADDsikSZNy8803N1wHNa1ZsybLli3LiBEj8uSTT+bQQw/NjTfemHPPPbf1NNhq9PT05JBDDsnq1avzwgsvtJ7DRvDtmv3Qww8/nOOPP74TeEmy22675eijj85PfvKTrFy5suE6qGfcuHG/EnhJ8slPfjL77bdffvGLXzRaBbVtu+22GTFiROsZsFUbOHBgRo4cmeXLl7eewkYSef3QmjVr0t3dvd717bbbLmvXrs1zzz3XYBVsXXp7e/Paa69l2LBhracAwGazatWqLF26NHPnzs23v/3t3HPPPTnuuONaz2IjeU1eP7TPPvvkscceS09PTwYOHJgkWbt2bR5//PEkycKFC1vOg63CLbfckoULF2batGmtpwDAZnPZZZfluuuuS5IMGDAgp59+embMmNF4FRvLSV4/dNFFF2XOnDk5//zzM3v27Dz33HM5++yzs3jx4iTJe++913gh1PbCCy/k4osvzqc//emcc845recAwGYzZcqU3HffffnBD36QiRMnpqenJ2vXrm09i40k8vqhL37xi/n617+ef/7nf85+++2XAw44IHPnzs1XvvKVJMkOO+zQeCHUtWTJkpx88skZMmRIbr/99s5pOgBUsO++++b444/P2Wef3flZD6ecckr8rMb+ReT1U9OnT89rr72Whx9+OM8880xmzZqVdevWJUn23nvvxuugprfffjsTJ07M8uXLc++992b33XdvPQkAtqhJkyZl1qxZ3hu2n/GavH5s5513zvjx4zu/njlzZvbYY4/su+++DVdBTatXr84pp5ySOXPmZObMmfnUpz7VehIAbHH/+zKgt99+u/ESNoaT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y3XXXZckGTBgQE4//fTMmDGj8SqoZ5tttslnP/vZnHTSSRk2bFhmz56dq666KkceeWQeeeSRHHzwwa0nshFEHsAGePPNN/ONb3wjV1xxRYYPH956Dmw1pkyZkkmTJmXRokX50Y9+lJ6enqxdu7b1LChn3LhxGTduXOfXp556aiZNmpQDDzwwX/va13Lvvfc2XMfG8u2aABvg8ssvz9ChQzN58uTWU2Crsu++++b444/P2WefnZ/85CdZuXJlTjnllPi5cbDljR07Np/5zGdy//33p6enp/UcNoLIA/gQL774Yq6//vpceumlWbRoUebPn5/58+dn9erVef/99zN//vy89dZbrWfCVmHSpEmZNWtW5syZ03oKbBVGjhyZtWvXZtWqVa2nsBFEHsCHWLhwYdatW5dLL700Y8aM6Xw8/vjjmTNnTsaMGZNp06a1nglbhffeey9J8vbbbzdeAluHl19+OYMHD84OO+zQegobwWvyAD7E/vvvnzvvvHO965dffnlWrFiR73znO9lrr70aLIO6Xn/99ey6666/cu3999/PD3/4w3R3d+dTn/pUo2VQ0xtvvLHea85//vOf56677srEiRMzYICzof5E5PVjM2bMyPLly7No0aIkyd13351XX301STJ58uQMGTKk5TwoY9iwYTnttNPWu/6/75X36x4DPpoLL7ww77zzTo466qh84hOfyJIlS3LLLbfkhRdeyNVXX+1UATazs846K93d3Rk3blx23XXXzJ49O9dff3222267/O3f/m3reWykrl6vXO63Ro8enQULFvzax+bNm5fRo0f/ZgfBVuaYY47J0qVL89xzz7WeAuXcdtttueGGG/Lss8/mzTffzI477phDDjkkkydPzqmnntp6HpTz3e9+N7fcckteeumlvPPOOxk+fHiOO+64TJ06NWPHjm09j40k8gAAAArxzbUAAACFiDwAAIBCRB4AAEAhIg8AAKAQkQcAAFCIyAMAAChE5AEAABQyaEM/saura0vu6Jd22GGH1hP6nJUrV7ae0Ods6ltRuufYECNGjGg9IUmyevXq1hM6li1btsm/t6/cd31lR5LsueeerSckSQYN2uB/smxxc+bMaT0hyaY/v2wJnuvgN+vD7jkneQAAAIWIPAAAgEJEHgAAQCEiDwAAoBCRBwAAUIjIAwAAKETkAQAAFCLyAAAAChF5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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Visualise data\n", "images, labels = zip(*[train_dataset[i] for i in range(12)])\n", "\n", "fig, axes = plt.subplots(3, 4, figsize=(9, 12))\n", "for i, ax in enumerate(axes.flat):\n", " img = images[i].squeeze(0) # Remove the channel dimension (1,) -> (8, 8)\n", " ax.imshow(img, cmap='gray')\n", " ax.set_title(str(labels[i]), fontsize=12)\n", " ax.axis('off')\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "d01210b4", "metadata": {}, "source": [ "## Model Development (CNN)" ] }, { "cell_type": "code", "execution_count": 24, "id": "b4f05702", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "torch.Size([36, 10])\n" ] } ], "source": [ "# Convolutional block with batch normalization: ic=input channels; oc=output channels\n", "def conv(ic, oc, act=True):\n", " ks = 3\n", " layers = [\n", " nn.Conv2d(ic, oc, stride=2, kernel_size=ks, padding=ks//2),\n", " nn.BatchNorm2d(oc) # insert nn.BatchNorm2d layer after each convolution and before the activation (ReLU).\n", " ]\n", " return nn.Sequential(*layers)\n", "\n", "# Build the CNN model with layers of conv(ic,oc) and Dropout\n", "ks = 3\n", "simple_cnn = nn.Sequential(\n", " conv(1, 8), # convolution and batchnorm; Output: 4x4\n", " nn.Dropout2d(p=0.25), # Add 2D Dropout after the first conv layer (common for CNNs)\n", " nn.ReLU(), # activation layer\n", " conv(8, 16), # Output: 2x2\n", " nn.Dropout2d(p=0.25), # Add 2D Dropout after the second conv layer\n", " nn.ReLU(), # activation layer\n", " conv(16, 10, act=False), # Output: 1x1\n", " nn.Flatten(), # Use the predefined nn.Flatten layer\n", ")\n", "# Example \n", "xb = torch.randn(36, 1, 6, 6) \n", "output = simple_cnn(xb)\n", "print(output.shape) " ] }, { "cell_type": "code", "execution_count": 25, "id": "1456c4c3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "----------------------------------------------------------------\n", " Layer (type) Output Shape Param #\n", "================================================================\n", " Conv2d-1 [-1, 8, 3, 3] 80\n", " BatchNorm2d-2 [-1, 8, 3, 3] 16\n", " Dropout2d-3 [-1, 8, 3, 3] 0\n", " ReLU-4 [-1, 8, 3, 3] 0\n", " Conv2d-5 [-1, 16, 2, 2] 1,168\n", " BatchNorm2d-6 [-1, 16, 2, 2] 32\n", " Dropout2d-7 [-1, 16, 2, 2] 0\n", " ReLU-8 [-1, 16, 2, 2] 0\n", " Conv2d-9 [-1, 10, 1, 1] 1,450\n", " BatchNorm2d-10 [-1, 10, 1, 1] 20\n", " Flatten-11 [-1, 10] 0\n", "================================================================\n", "Total params: 2,766\n", "Trainable params: 2,766\n", "Non-trainable params: 0\n", "----------------------------------------------------------------\n", "Input size (MB): 0.00\n", "Forward/backward pass size (MB): 0.00\n", "Params size (MB): 0.01\n", "Estimated Total Size (MB): 0.02\n", "----------------------------------------------------------------\n" ] } ], "source": [ "from torchsummary import summary\n", "\n", "# Move the model to the selected device before summarizing\n", "simple_cnn.to(device)\n", "\n", "summary(simple_cnn, input_size=(1, 6, 6), device=str(device))" ] }, { "cell_type": "markdown", "id": "b5d2157f", "metadata": {}, "source": [ "## Model Training" ] }, { "cell_type": "code", "execution_count": 26, "id": "19bbd956", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "epoch: 1; time: 1750452493\n", "epoch: 1; accuracy: 0.7504332466839965\n", "epoch: 2; time: 1750452531\n", "epoch: 2; accuracy: 0.7994151169766047\n", "epoch: 3; time: 1750452565\n", "epoch: 3; accuracy: 0.8115960141305073\n", "epoch: 4; time: 1750452600\n", "epoch: 4; accuracy: 0.822002266213424\n", "epoch: 5; time: 1750452635\n", "epoch: 5; accuracy: 0.8263180697193894\n", "epoch: 6; time: 1750452669\n", "epoch: 6; accuracy: 0.8307921748983538\n", "epoch: 7; time: 1750452704\n", "epoch: 7; accuracy: 0.8346164100513231\n", "epoch: 8; time: 1750452739\n", "epoch: 8; accuracy: 0.8374075184963007\n", "epoch: 9; time: 1750452774\n", "epoch: 9; accuracy: 0.8381740318602946\n", "epoch: 10; time: 1750452826\n", "epoch: 10; accuracy: 0.8402319536092782\n" ] } ], "source": [ "# Computes the accuracy for a batch: outputs are probability-like values\n", "def compute_accuracy(outputs, labels):\n", " _, predicted = torch.max(outputs.data, 1)\n", " correct = (predicted == labels).sum().item()\n", " total = len(labels)\n", " return correct / total\n", "\n", "\n", "num_epochs = 10\n", "model = simple_cnn\n", "\n", "# Loss and optimizer\n", "criterion = nn.CrossEntropyLoss()\n", "optimizer = optim.Adam(model.parameters(), lr=0.005)\n", "\n", "model.to(device) #<<<<<<<<<< move model to device\n", "\n", "# History object to keep track of accuracy along epochs\n", "history = {'epoch': [], 'train_accuracy': [], 'val_accuracy': []}\n", "\n", "for epoch in range(num_epochs):\n", " print(f'epoch: {epoch+1}; time: {round(time.time())}')\n", " model.train()\n", " batch_accuracies=[] # to store estimated accuracy for each batch\n", "\n", " for images, labels in train_loader:\n", " images = images.to(device) \n", " labels = labels.to(device) \n", " outputs = model(images)\n", " loss = criterion(outputs, labels)\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", " # compute accuracy over the batch\n", " batch_accuracies.append(compute_accuracy(outputs, labels))\n", " history['epoch'].append(epoch+1)\n", " history['train_accuracy'].append(sum(batch_accuracies) / len(batch_accuracies))\n", " print(f'epoch: {epoch+1}; accuracy: {sum(batch_accuracies) / len(batch_accuracies)}')\n", " # save current model before next epoch\n", " model_filename=f'simple_cnn_epoch_{epoch+1}.pth'\n", " torch.save(model, model_filename)" ] }, { "cell_type": "markdown", "id": "8aff50b1", "metadata": {}, "source": [ "## Model VAlidation" ] }, { "cell_type": "code", "execution_count": 27, "id": "eef76993", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "epoch: 1; time: 1750452860\n", "epoch: 1; accuracy: 0.8890030832476875\n", "epoch: 2; time: 1750452862\n", "epoch: 2; accuracy: 0.9009649423318489\n", "epoch: 3; time: 1750452864\n", "epoch: 3; accuracy: 0.9083304784743633\n", "epoch: 4; time: 1750452865\n", "epoch: 4; accuracy: 0.9171519926915611\n", "epoch: 5; time: 1750452867\n", "epoch: 5; accuracy: 0.9172804613452096\n", "epoch: 6; time: 1750452869\n", "epoch: 6; accuracy: 0.9171519926915611\n", "epoch: 7; time: 1750452872\n", "epoch: 7; accuracy: 0.9193787826881352\n", "epoch: 8; time: 1750452873\n", "epoch: 8; accuracy: 0.9210488751855658\n", "epoch: 9; time: 1750452875\n", "epoch: 9; accuracy: 0.9220766244147538\n", "epoch: 10; time: 1750452877\n", "epoch: 10; accuracy: 0.9199783030718283\n" ] } ], "source": [ "for epoch in range(num_epochs):\n", " print(f'epoch: {epoch+1}; time: {round(time.time())}')\n", " \n", " # load model\n", " model_filename=f'simple_cnn_epoch_{epoch+1}.pth'\n", " model=torch.load(model_filename, weights_only=False) \n", " model.to(device) \n", "\n", " # Validation \n", " model.eval()\n", " batch_accuracies=[]\n", " with torch.no_grad():\n", " \n", " for images, labels in test_loader:\n", " images = images.to(device) \n", " labels = labels.to(device) \n", " outputs = model(images)\n", " # compute accuracy over the batch\n", " batch_accuracies.append(compute_accuracy(outputs, labels))\n", " history['val_accuracy'].append(sum(batch_accuracies) / len(batch_accuracies))\n", " print(f'epoch: {epoch+1}; accuracy: {sum(batch_accuracies) / len(batch_accuracies)}')" ] }, { "cell_type": "markdown", "id": "ea4afa8e", "metadata": {}, "source": [ "### Accuracy curve" ] }, { "cell_type": "code", "execution_count": 28, "id": "bfcfbe5b", "metadata": {}, "outputs": [ { "data": { "image/png": "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w0tspHNSqRRjxozJV25sbKz+Oed/fB06dEB6ejpu3LhR7HYHDx6s/h8poBp3AKh6iIqLRyxW/WooFAokJibCzMwM3t7euHDhQr76Y8aM0RhcnHc/f//9N548eYKJEydq1AsMDNT6f3qDBw+GoaGhxmWfI0eO4OHDh+rLa8Crn7McCoUC+/fvR79+/VCzZk11ef369eHv75+vfu79JicnIyEhAZ06dcLt27dL1eWfc87ee+89jbE2ffr0Qb169bBnz55860ycOFHjfYcOHYptawDIzs7Gli1bMHjwYHXvQc7lwk2bNqnrXbx4EXfu3MHUqVM1eq8AqNeLj4/H0aNHMXbsWI3zlrtOaXTq1AkNGjTIV577vP/3339ITk5Ghw4dND6nO3bsgFKpxPz589Wf67wxicViDB8+HLt27cKzZ8/Uyzdt2oS2bdvC09Oz0NhK0laDBw/G+fPnER0drS7bsmULpFIp3njjDQDApUuXcOvWLQwbNgyJiYlISEhAQkIC0tLS0LVrVxw9ejTfTRl527448+fPR3h4eL6XjY2NRr02bdrA19dX/b5mzZp44403sH//figUCigUChw4cAD9+vVDrVq11PWcnZ0xbNgwHD9+HCkpKQCA33//HU2aNEH//v3zxZP3s1Hc35Scvxv79+9Henp6iY6dtMcEiXTO1dW1wLuX/v33X/Tv3x+WlpawsLCAvb29eoC3Nl+6eb+gcpKl3OMcCqJUKvHll1+iTp06kEqlsLOzg729Pa5cuVLgfovbT86Yizp16mjUMzQ01PijWhRbW1v4+/tj+/btyMjIAKC6vGZgYIBBgwap673qOcsRHx+P58+f54sZQIHjUU6cOIFu3brB1NQUVlZWsLe3V1+eKk2ClHPOCtpXvXr18o1jkclksLe31yiztrYutq0B4MCBA4iPj0erVq0QFRWFqKgo3LlzB126dMEvv/yi/jLO+VLPubRSkJwvsKLqlEZhCcoff/yB1q1bQyaTwcbGBvb29li9erXGOY+OjoZYLC4wwcpt1KhReP78ObZv3w4AiIyMxPnz5zFy5Mgi1ytJW7311lsQi8XYsmULAEAQBGzdulU9fgdQja0BVOOi7O3tNV4//vgjMjMz832mikrgCuLj44Nu3brle+X9O1TQ579u3bpIT09HfHw84uPjkZ6eXuCx169fH0qlEvfv3wegagdtPxfF/U3x9PREcHAwfvzxR9jZ2cHf3x8rV67k+KMyxjFIpHO5/xecIykpCZ06dYKFhQUWL14MLy8vyGQyXLhwAR9++KFWt/XnHquTm1DMGIVPPvkE8+bNw9ixY7FkyRLY2NhALBZj6tSpBe63tPspqREjRuCPP/7AH3/8gddffx2///67eowQUDbnrDSio6PRtWtX1KtXDytWrICbmxuMjIzw559/4ssvv6yQKRgKawNt5PQS5U40czty5Ai6dOlS6u0XpLDepMIGlRf0O3Ls2DG8/vrr6NixI1atWgVnZ2cYGhoiNDS00AHmRWnQoAF8fX2xceNGjBo1Chs3boSRkVGh56U0XFxc0KFDB/z666+YPXs2Tp8+jZiYGHz22WfqOjmfly+++AJNmzYtcDtmZmYa7ws6P5WZNn9Tli9fjsDAQOzcuRMHDhzA+++/j6VLl+L06dOoUaNGRYVapTFBIr10+PBhJCYmYtu2bejYsaO6/M6dO+W+799++w1dunTB2rVrNcqTkpI0BlJqy93dHYDqf8avvfaaulwul+POnTto0qSJVtt5/fXXYW5ujrCwMBgaGuK///7TuLxWlucs5+6rnP/N5xYZGanxfvfu3cjMzMSuXbs0/uf7119/5VtX28tMOecsMjJS45zllOUsf1VpaWnYuXMnBg8eXOBt3++//z42bdqELl26wMvLCwBw9epVdOvWrcDt5fQIXr16tcj9WltbIykpKV95QXd4Feb333+HTCbD/v37IZVK1eWhoaEa9by8vKBUKnHt2rVCE44co0aNQnBwMB4/foywsDD06dNH4zJ1QUraVoMHD8Z7772HyMhIbNmyBSYmJggICNCIFwAsLCwKPc8VpaDP/82bN2FiYqL+j4mJiUm+3wlAdSejWCxW34Th5eVV7OeipHx8fODj44O5c+fi5MmTaNeuHdasWVPonGlUMrzERnop539Quf/HlJWVhVWrVlXIvvP2/mzdujXf7eXaatGiBezt7bFmzRpkZWWpy9evX1/gl2RhjI2N0b9/f/z5559YvXo1TE1N1eM2cuIGyuacSSQS+Pv7Y8eOHYiJiVGXX79+Hfv3789XN+9+k5OT831RA4CpqalWx9yiRQs4ODhgzZo1yMzMVJfv3bsX169f17hD61Vs374daWlpmDRpEt588818r759++L3339HZmYmmjdvDk9P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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(history['epoch'], history['train_accuracy'], label='Train Accuracy')\n", "plt.plot(history['epoch'], history['val_accuracy'], label='Validation Accuracy')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Accuracy (%)')\n", "plt.title('Train and Validation Accuracy over Epochs')\n", "plt.legend()\n", "plt.grid(True)\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.13.0" } }, "nbformat": 4, "nbformat_minor": 5 }