diff --git a/02_activities/assignments/assignment_1.ipynb b/02_activities/assignments/assignment_1.ipynb index 70bdb302..aa5c7097 100644 --- a/02_activities/assignments/assignment_1.ipynb +++ b/02_activities/assignments/assignment_1.ipynb @@ -3,7 +3,9 @@ { "cell_type": "markdown", "id": "ba8ab56f", - "metadata": {}, + "metadata": { + "id": "ba8ab56f" + }, "source": [ "# Advanced Image Classification with ImageNet" ] @@ -12,7 +14,8 @@ "cell_type": "markdown", "id": "7c630244b8fe2847", "metadata": { - "collapsed": false + "collapsed": false, + "id": "7c630244b8fe2847" }, "source": [ "In this assignment, you will be asked to develop a convolutional neural network (CNN) to classify images from the CIFAR-100 dataset. At each step, you'll be guided through the process of developing a model architecture to solve a problem. Your goal is to create a CNN that attains at least 55% accuracy on the validation set.\n", @@ -30,7 +33,8 @@ "cell_type": "markdown", "id": "fab62988ece1528d", "metadata": { - "collapsed": false + "collapsed": false, + "id": "fab62988ece1528d" }, "source": [ "## Task 1: Data Exploration and Preprocessing (Complete or Incomplete)\n", @@ -41,22 +45,55 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, + "id": "0fa8e981", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "collapsed": true, + "id": "0fa8e981", + "outputId": "71b4e7c1-2fd5-483b-faa9-4e882775b7f3" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TensorFlow version: 2.17.1\n" + ] + } + ], + "source": [ + "import tensorflow as tf\n", + "print(\"TensorFlow version:\", tf.__version__)\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 3, "id": "8820fcdc5ae52ae2", "metadata": { "ExecuteTime": { "start_time": "2024-01-26T17:04:08.432758Z" }, - "collapsed": false, - "is_executing": true + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8820fcdc5ae52ae2", + "is_executing": true, + "outputId": "bbf27ee7-3d56-4561-affe-999bd2ec97c3" }, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "2024-01-26 12:04:27.706527: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", - "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" + "Downloading data from https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz\n", + "\u001b[1m169001437/169001437\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 0us/step\n" ] } ], @@ -69,21 +106,122 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, + "id": "5e15307d", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "5e15307d", + "outputId": "23539d2c-4abd-4491-fd40-59b7c4f71664" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training data shape: (50000, 32, 32, 3)\n", + "Training labels shape: (50000, 1)\n", + "Test data shape: (10000, 32, 32, 3)\n", + "Test labels shape: (10000, 1)\n" + ] + } + ], + "source": [ + "print(\"Training data shape:\", x_train.shape)\n", + "print(\"Training labels shape:\", y_train.shape)\n", + "print(\"Test data shape:\", x_test.shape)\n", + "print(\"Test labels shape:\", y_test.shape)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, "id": "a386b4072078138f", "metadata": { - "collapsed": false + "colab": { + "base_uri": "https://localhost:8080/", + "height": 330 + }, + "id": "a386b4072078138f", + "outputId": "75a67146-15d8-44a7-90e5-b900e560925d" }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJ4AAADyCAYAAAAMag/YAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABr2ElEQVR4nO3deZwdZZ0v/k9VnbX7dPfpNZ10J+kshBAIgmEZWYadgCIXR8FtBFHEEfXCqL87yx0FdF7jnXuv2zCOigvuVwFnFAQBFRBBloDsISH7nvR+ejl7Vf3+YOgx5PMtugOHdIfP+/XiD77nnHrq1PI8T1Wf1McJwzCEiIiIiIiIiIjIq8w90CsgIiIiIiIiIiIHJ914EhERERERERGRmtCNJxERERERERERqQndeBIRERERERERkZrQjScREREREREREakJ3XgSEREREREREZGa0I0nERERERERERGpCd14EhERERERERGRmtCNJxERERERERERqQndeDrIbd68GY7j4Lvf/e6BXhWRae2aa66B4zgT/9/T04P3v//9B26FRGRGu/fee+E4Du69994DvSoiB60Xx+7+/v4DvSoi8grNhHHzjjvuwFFHHYVUKgXHcTA8PIz3v//96OnpmdJyvvvd78JxHDz66KO1WdFpSDeeZpCdO3fimmuuwRNPPLHPaz/+8Y/x5S9/+TVfJxEREREREZGD2cDAAC666CKk02l89atfxQ9+8APU19cf6NWaMWIHegVk8nbu3Ilrr70WPT09OOqoo/Z67cc//jGeeeYZXHXVVQdk3UQONmvXroXr6t68iIiIiEit/fmf/zkKhQISicSBXhVq1apVGB0dxec+9zmceeaZE/VvfvObCILgAK7ZzKCrKhERIplMIh6PH+jVeE2Mj48f6FUQERERkdehYrGIIAjgui5SqdS0/cNvb28vACCbze5Vj8fjSCaTB2CNZpbpuVcPQjt27MAHP/hBzJkzB8lkEgsWLMBHPvIRlMtlDA4O4lOf+hSWL1+OTCaDxsZGnHvuuXjyyScnPn/vvffi2GOPBQBceumlcBxn4tlNp556Km677TZs2bJlov5y/850zZo1eMc73oGWlhakUikcc8wxuOWWW2q5CUSmjfvvvx/HHnssUqkUFi1ahG984xv7vOelz3h68d9iP/DAA/jEJz6B9vZ21NfX421vexv6+vr2+fy//du/4fDDD0cymcScOXPw0Y9+FMPDw3u9Z926dXj729+Ozs5OpFIpdHd3413vehdyudzEe2644Qacfvrp6OjoQDKZxLJly/C1r31tn/Ycx8E111wz6e/xu9/9DldccQU6OjrQ3d398htNZAbasmULrrjiChx66KFIp9NobW3FhRdeiM2bN+/1vhfPi/vuuw8f/vCH0draisbGRlx88cUYGhra6709PT0477zzcNddd00852HZsmX493//90mt08MPP4xzzjkHTU1NqKurwymnnIIHHnjg1frKIq9L/f39uOiii9DY2IjW1lZceeWVKBaLE69Xq1V87nOfw6JFi5BMJtHT04O///u/R6lUmnjPJZdcgra2NlQqlX2Wf/bZZ+PQQw99Tb6LyP6a7JgHAM8++yxOP/10pNNpdHd34x//8R/xne98B47j7PX+yc4vJ3M9C/zXc5x+8pOf4B/+4R/Q1dWFuro6jIyM0Gc8Wc9cPfXUU3Hqqafus9wbb7wR1157Lbq6utDQ0IB3vOMdyOVyKJVKuOqqq9DR0YFMJoNLL710r/P/5Zx66qm45JJLAADHHnssHMeZWC/2jKef/OQnWLFiBRoaGtDY2Ijly5fjK1/5yj7LLZVKk7quOBjon9q9Bnbu3InjjjsOw8PDuPzyy7F06VLs2LEDN998M/L5PDZu3Iif//znuPDCC7FgwQLs2bMH3/jGN3DKKadg9erVmDNnDg477DB89rOfxWc+8xlcfvnlOPnkkwEAJ5xwArq6upDL5bB9+3Z86UtfAgBkMhlzfZ599lmceOKJ6Orqwt/+7d+ivr4eN954Iy644AL87Gc/w9ve9rbXZLuIHAhPP/00zj77bLS3t+Oaa65BtVrF1VdfjVmzZk3q8x//+MfR3NyMq6++Gps3b8aXv/xlfOxjH8NPf/rTifdcc801uPbaa3HmmWfiIx/5CNauXYuvfe1rWLVqFR544AHE43GUy2WsXLkSpVIJH//4x9HZ2YkdO3bgl7/8JYaHh9HU1AQA+NrXvobDDz8c559/PmKxGG699VZcccUVCIIAH/3oR/d7O1xxxRVob2/HZz7zGf3iSQ5aq1atwh/+8Ae8613vQnd3NzZv3oyvfe1rOPXUU7F69WrU1dXt9f6PfexjyGazuOaaaybO2y1btkxMaF+0bt06vPOd78Rf/dVf4ZJLLsENN9yACy+8EHfccQfOOussc33uvvtunHvuuVixYgWuvvpquK47cXP597//PY477riabQuRg9lFF12Enp4efP7zn8dDDz2Ef/mXf8HQ0BC+//3vAwAuu+wyfO9738M73vEOfPKTn8TDDz+Mz3/+83juuefwH//xHwCA973vffj+97+PO++8E+edd97Esnfv3o27774bV1999QH5biKTNdkxb/fu3TjttNNQrVYnrgWvv/56pNPp/W57Mtezf+pzn/scEokEPvWpT6FUKr1q/7zu85//PNLpNP72b/8W69evx3XXXYd4PA7XdTE0NIRrrrkGDz30EL773e9iwYIF+MxnPjOp5f7P//k/ceihh+L666/HZz/7WSxYsACLFi2i7/31r3+Nd7/73TjjjDPwz//8zwCA5557Dg888ACuvPLKvd47meuKg0YoNXfxxReHruuGq1at2ue1IAjCYrEY+r6/V33Tpk1hMpkMP/vZz07UVq1aFQIIb7jhhn2W85a3vCWcP3/+PvVNmzbt85kzzjgjXL58eVgsFvdajxNOOCE85JBDpv4FRWaQCy64IEylUuGWLVsmaqtXrw49zwv/tEucP39+eMkll0z8/w033BACCM8888wwCIKJ+l//9V+HnueFw8PDYRiGYW9vb5hIJMKzzz57r/P6X//1X0MA4Xe+850wDMPw8ccfDwGEN910U+T65vP5fWorV64MFy5cuFcNQHj11Vfv817re5x00klhtVqNbFtkpmPnz4MPPhgCCL///e9P1F48L1asWBGWy+WJ+v/+3/87BBD+4he/mKjNnz8/BBD+7Gc/m6jlcrlw9uzZ4dFHHz1Ru+eee0IA4T333BOG4Qvj7CGHHBKuXLlyrz4kn8+HCxYsCM8666xX5TuLvJ5cffXVIYDw/PPP36t+xRVXhADCJ598MnziiSdCAOFll12213s+9alPhQDCu+++OwzDMPR9P+zu7g7f+c537vW+L37xi6HjOOHGjRtr+2VEXqHJjnlXXXVVCCB8+OGHJ2q9vb1hU1NTCCDctGnTRH2y88vJXs++ODYuXLhwn/V96bjJ2nnRKaecEp5yyin7fPaII47Yaxx/97vfHTqOE5577rl7ff5Nb3oTvXaO8uJc4aXX9Jdccsley7ryyivDxsbGyHn2ZK8rDib6p3Y1FgQBfv7zn+Otb30rjjnmmH1edxwHyWRy4t+y+r6PgYEBZDIZHHroofjjH//4qq7P4OAg7r77blx00UUYHR1Ff38/+vv7MTAwgJUrV2LdunXYsWPHq9qmyHTh+z7uvPNOXHDBBZg3b95E/bDDDsPKlSsntYzLL798r18+nHzyyfB9H1u2bAEA/OY3v0G5XMZVV121179R/9CHPoTGxkbcdtttADDxi6Y777wT+XzebO9P//qUy+XQ39+PU045BRs3btzrn+RN1Yc+9CF4nrffnxeZCf70/KlUKhgYGMDixYuRzWbp+Hr55Zfv9Wy3j3zkI4jFYrj99tv3et+cOXP2+nXwi/8s7/HHH8fu3bvpujzxxBNYt24d3vOe92BgYGBi/B0fH8cZZ5yB++67Tw8nFdlPL/0F8Mc//nEAwO233z5x/n7iE5/Y6z2f/OQnAWBiXHZdF+9973txyy23YHR0dOJ9P/rRj3DCCSdgwYIFNVt/kVfDZMe822+/HX/2Z3+2169s29vb8d73vne/257q9ewll1zyin5hZbn44ov3GsePP/54hGGID3zgA3u97/jjj8e2bdtQrVZf9XXIZrMYHx/Hr3/965d978tdVxxMdOOpxvr6+jAyMoIjjjjCfE8QBPjSl76EQw45BMlkEm1tbWhvb8dTTz31ii4smfXr1yMMQ3z6059Ge3v7Xv+9+BPiFx+cJnKw6evrQ6FQwCGHHLLPa5N9dsOf3rACgObmZgCYeA7MiwPFS5eXSCSwcOHCidcXLFiAT3ziE/jWt76FtrY2rFy5El/96lf3OecfeOABnHnmmaivr0c2m0V7ezv+/u//HgBeUf+gCbS8HhQKBXzmM5/B3Llz9xpfh4eH6fnz0r4hk8lg9uzZ+zwfY/HixXtNFAFgyZIlAECfpQG88M/zgBcm2y8df7/1rW+hVCq96mO+yOvFS8/dRYsWwXVdbN68GVu2bIHruli8ePFe7+ns7EQ2m93rAu/iiy9GoVCY+Od3a9euxWOPPYb3ve99tf8SIq/QZMe8LVu2vKK5MDPV69lazUNfOk9/8Q+9c+fO3aceBEFNxt0rrrgCS5Yswbnnnovu7m584AMfwB133DGp9X3pdcXBRM94mgb+6Z/+CZ/+9KfxgQ98AJ/73OfQ0tIC13Vx1VVXvep//XxxeZ/61KfMX3i8dGAWkf9i/UooDMMpL+sLX/gC3v/+9+MXv/gF7rrrLvz3//7fJ55P0d3djQ0bNuCMM87A0qVL8cUvfhFz585FIpHA7bffji996UuT6h9836f1WvyVSWS6+fjHP44bbrgBV111Fd70pjehqakJjuPgXe9612v+66IX2/s//+f/4KijjqLviXo+o4hM3ktvDFu1l1q2bBlWrFiBH/7wh7j44ovxwx/+EIlEAhdddFEtVlPkVfVajnkvnV9O9Xp2svNQ67z1fZ/Oya15+qs5f385HR0deOKJJ3DnnXfiV7/6FX71q1/hhhtuwMUXX4zvfe97B2y9DjTdeKqx9vZ2NDY24plnnjHfc/PNN+O0007Dt7/97b3qw8PDaGtrm/j/qAFzMoMpACxcuBDAC7GPZ5555qQ+I3KwaG9vRzqdnvjlwZ9au3btq9LG/PnzJ5b34vkGAOVyGZs2bdrnvFu+fDmWL1+Of/iHf8Af/vAHnHjiifj617+Of/zHf8Stt96KUqmEW265Za+/iNxzzz37tNvc3LxPal65XMauXbtele8lMhPdfPPNuOSSS/CFL3xholYsFvc5V160bt06nHbaaRP/PzY2hl27duHNb37zXu978dfDfzr2Pv/88wBgpsq++BDSxsZGjb8ir7J169bt9QuK9evXIwgC9PT0IAxDBEGAdevW4bDDDpt4z549ezA8PDwxbr/o4osvxic+8Qns2rULP/7xj/GWt7xl4lcIItPZZMe8+fPnT3ouPNn55WSvZ6eKtQ+88KutP51nTzeJRAJvfetb8da3vhVBEOCKK67AN77xDXz6059+3f7IQ//UrsZc18UFF1yAW2+9FY8++ug+r4dhCM/z9rmredNNN+3zrKX6+noAoCdffX39pH4q2NHRgVNPPRXf+MY36AXpwRrfKAK88FeFlStX4uc//zm2bt06UX/uuedw5513viptnHnmmUgkEviXf/mXvc7rb3/728jlcnjLW94CABgZGdnn35UvX74crutOxLu++FeQP11OLpfDDTfcsE+7ixYtwn333bdX7frrrzd/8STyesDG1+uuu848L66//vq9otS/9rWvoVqt4txzz93rfTt37pz4pzjAC+fz97//fRx11FHo7Oyky16xYgUWLVqE//t//y/Gxsb2eV3jr8j+++pXv7rX/1933XUAgHPPPXfixvGXv/zlvd7zxS9+EQAmxuUXvfvd74bjOLjyyiuxceNG/OVf/mWN1lrk1TXZMe/Nb34zHnroITzyyCMTtb6+PvzoRz/aZ5mTnV9O9np2qhYtWoSHHnoI5XJ5ovbLX/4S27Zte0XLraWBgYG9/t91XRx55JEAMDHHfz3SL55eA//0T/+Eu+66C6eccgouv/xyHHbYYdi1axduuukm3H///TjvvPPw2c9+FpdeeilOOOEEPP300/jRj360z13cRYsWIZvN4utf/zoaGhpQX1+P448/HgsWLMCKFSvw05/+FJ/4xCdw7LHHIpPJ4K1vfStdn69+9as46aSTsHz5cnzoQx/CwoULsWfPHjz44IPYvn07nnzyyddis4gcENdeey3uuOMOnHzyybjiiitQrVZx3XXX4fDDD8dTTz31ipff3t6Ov/u7v8O1116Lc845B+effz7Wrl2Lf/u3f8Oxxx47MYG9++678bGPfQwXXnghlixZgmq1ih/84AfwPA9vf/vbAQBnn332xF9MPvzhD2NsbAzf/OY30dHRsc+N48suuwx/9Vd/hbe//e0466yz8OSTT+LOO+98RX9lEpnpzjvvPPzgBz9AU1MTli1bhgcffBC/+c1v0NraSt9fLpdxxhln4KKLLpo4b0866SScf/75e71vyZIl+OAHP4hVq1Zh1qxZ+M53voM9e/bQm8Ivcl0X3/rWt3Duuefi8MMPx6WXXoquri7s2LED99xzDxobG3Hrrbe+qt9f5PVi06ZNOP/883HOOefgwQcfxA9/+EO85z3vwRve8AYALzxb7frrr8fw8DBOOeUUPPLII/je976HCy64YK9fOQIvjOPnnHMObrrpJmSz2X1uTIlMV5Md8/7H//gf+MEPfoBzzjkHV155Jerr63H99ddj/vz5+8yFJzu/nOz17FRddtlluPnmm3HOOefgoosuwoYNG/DDH/5w4lfE09Fll12GwcFBnH766eju7saWLVtw3XXX4aijjtrrV5evOwciSu/1aMuWLeHFF18ctre3h8lkMly4cGH40Y9+NCyVSmGxWAw/+clPhrNnzw7T6XR44oknhg8++OA+MZFhGIa/+MUvwmXLloWxWCwEEN5www1hGIbh2NhY+J73vCfMZrMhgIlIx02bNu31vhdt2LAhvPjii8POzs4wHo+HXV1d4XnnnRfefPPNtd8YIgfY7373u3DFihVhIpEIFy5cGH7961+fiGR+0UvjW60IVRb9GoZh+K//+q/h0qVLw3g8Hs6aNSv8yEc+Eg4NDU28vnHjxvADH/hAuGjRojCVSoUtLS3haaedFv7mN7/Zazm33HJLeOSRR4apVCrs6ekJ//mf/zn8zne+s0/cre/74d/8zd+EbW1tYV1dXbhy5cpw/fr1k/4eIgejoaGh8NJLLw3b2trCTCYTrly5MlyzZo15Xvzud78LL7/88rC5uTnMZDLhe9/73nBgYGCvZc6fPz98y1veEt55553hkUceGSaTyXDp0qXhTTfdtNf7rL7h8ccfD//iL/4ibG1tDZPJZDh//vzwoosuCn/729/WajOIHLReHLtXr14dvuMd7wgbGhrC5ubm8GMf+1hYKBQm3lepVMJrr702XLBgQRiPx8O5c+eGf/d3fxcWi0W63BtvvDEEEF5++eWv1VcRecUmO+aFYRg+9dRT4SmnnBKmUqmwq6sr/NznPhd++9vf3u/55WSvZ18cG186Zv7pay8dN7/whS+EXV1dYTKZDE888cTw0UcfnfRyrXnvi31HX1/fpLZt1LIuueSSiWvvMAzDm2++OTz77LPDjo6OMJFIhPPmzQs//OEPh7t27XrZZVnb4GDghOFB+OQqERERkUn67ne/i0svvRSrVq3CMcccE/nenp4eHHHEEfjlL3/5Gq2diLzWfvGLX+CCCy7Afffdh5NPPvlAr47Ia+LFsXDTpk3m8wpF9pee8SQiIiIiIvKfvvnNb2LhwoU46aSTDvSqiIgcFPSMJxERERERed37yU9+gqeeegq33XYbvvKVr0w6NVpEZq5cLodCoRD5His4RCZPN55EREREROR1793vfjcymQw++MEP4oorrjjQqyMir4Err7wS3/ve9yLfo6cTvXJ6xpOIiIiIiIiIvO6sXr0aO3fujHzPmWee+RqtzcFLN55ERERERERERKQm9HBxERERERERERGpCd14EhERERERERGRmtDDxQ9GfomWd2/dQOsPP/JHc1Enn3kOrbe0tk19vV4lfsRreZ+/Ojo2SOsbNzxH682t9WYbW7euo/VzT35XxJpNX0EQHOhVOIBexX9pHBrJN2Ygjp2UExrrpWydV4frzry/uVQqvF8Pwor5mTCs0rpjHPZWPYp1rJrlyDamuize34e+vU0sZnKVYxwrrj19CgK+wkHI+1rXagOA5/HXrPXdn6cn2P0NbyPq/HGs16zv6HiR68ZY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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dimensions of a single image: (32, 32, 3)\n", + "Each image is 32 pixels in height and width with 3 color channels (Red, Green, Blue).\n", + "\n", + "Number of classes: 100\n" + ] + } + ], "source": [ - "# Your code here" + "# Your code here\n", + "# 1. Examine the shape of the training and test sets\n", + "train_shape = x_train.shape\n", + "test_shape = x_test.shape\n", + "\n", + "# 2. Examine the dimensions of the images\n", + "image_shape = x_train[0].shape\n", + "\n", + "# 3. Examine the number of classes\n", + "num_classes = len(np.unique(y_train))\n", + "\n", + "#import matplotlib.pyplot as plt\n", + "\n", + "# Function to display images\n", + "def show_images(images, labels, class_names, num_images=5):\n", + " plt.figure(figsize=(15, 3))\n", + " for i in range(num_images):\n", + " plt.subplot(1, num_images, i+1)\n", + " plt.imshow(images[i])\n", + " plt.title(class_names[labels[i][0]])\n", + " plt.axis('off')\n", + " plt.show()\n", + "\n", + "# CIFAR-100 fine label names\n", + "fine_label_names = [\n", + " 'apple', 'aquarium_fish', 'baby', 'bear', 'beaver', 'bed', 'bee', 'beetle',\n", + " 'bicycle', 'bottle', 'bowl', 'boy', 'bridge', 'bus', 'butterfly', 'camel',\n", + " 'can', 'castle', 'caterpillar', 'cattle', 'chair', 'chimpanzee', 'clock',\n", + " 'cloud', 'cockroach', 'couch', 'crab', 'crocodile', 'cup', 'dinosaur',\n", + " 'dolphin', 'elephant', 'flatfish', 'forest', 'fox', 'girl', 'hamster',\n", + " 'house', 'kangaroo', 'keyboard', 'lamp', 'lawn_mower', 'leopard', 'lion',\n", + " 'lizard','sunflower', 'sweet_pepper', 'table',\n", + " 'tank', 'telephone', 'television', 'tiger', 'tractor', 'train',\n", + " 'trout', 'tulip', 'turtle', 'wardrobe', 'whale', 'willow_tree', 'wolf',\n", + " 'woman', 'worm'\n", + "]\n", + "\n", + "# Show 5 images from the training set\n", + "show_images(x_train, y_train, fine_label_names, num_images=5)\n", + "\n", + "\n", + "print(\"Dimensions of a single image:\", x_train[0].shape)\n", + "print (\"Each image is 32 pixels in height and width with 3 color channels (Red, Green, Blue).\")\n", + "\n", + "print(\"\\nNumber of classes:\", num_classes)" ] }, { "cell_type": "markdown", "id": "ad49291da3a819ea", "metadata": { - "collapsed": false + "collapsed": false, + "id": "ad49291da3a819ea" }, "source": [ "### 1b: Data Preprocessing (4 Marks)\n", @@ -94,21 +232,66 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "b18c10172fa72d0c", "metadata": { - "collapsed": false + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "b18c10172fa72d0c", + "outputId": "6a7fe5a3-3f03-4296-d4fa-2a7f0c90c060" }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training data shape: (40000, 32, 32, 3)\n", + "Validation data shape: (10000, 32, 32, 3)\n", + "Training labels shape: (40000, 100)\n", + "Validation labels shape: (10000, 100)\n", + "Test data shape: (10000, 32, 32, 3)\n", + "Test labels shape: (10000, 100)\n" + ] + } + ], "source": [ - "# Your code here" + "# Your code here\n", + "from keras.datasets import cifar100\n", + "from sklearn.model_selection import train_test_split\n", + "from tensorflow.keras.utils import to_categorical\n", + "\n", + "# Load the CIFAR-100 dataset\n", + "(x_train, y_train), (x_test, y_test) = cifar100.load_data(label_mode='fine')\n", + "\n", + "# 1. Normalize the images to have pixel values in the range [0, 1]\n", + "x_train = x_train.astype('float32') / 255.0\n", + "x_test = x_test.astype('float32') / 255.0\n", + "\n", + "# 2. Convert labels to one-hot encoded vectors\n", + "y_train_one_hot = to_categorical(y_train, num_classes=100)\n", + "y_test_one_hot = to_categorical(y_test, num_classes=100)\n", + "\n", + "# 3. Split the training set into training and validation sets (80% train, 20% validation)\n", + "x_train_split, x_val, y_train_split, y_val = train_test_split(\n", + " x_train, y_train_one_hot, test_size=0.2, random_state=42\n", + ")\n", + "\n", + "# Printing the shapes to verify\n", + "print(\"Training data shape:\", x_train_split.shape)\n", + "print(\"Validation data shape:\", x_val.shape)\n", + "print(\"Training labels shape:\", y_train_split.shape)\n", + "print(\"Validation labels shape:\", y_val.shape)\n", + "print(\"Test data shape:\", x_test.shape)\n", + "print(\"Test labels shape:\", y_test_one_hot.shape)\n" ] }, { "cell_type": "markdown", "id": "5993757f08c89db7", "metadata": { - "collapsed": false + "collapsed": false, + "id": "5993757f08c89db7" }, "source": [ "## Task 2: Model Development (Complete or Incomplete)\n", @@ -119,29 +302,302 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "c9edafdaf887b8d5", + "execution_count": 7, + "id": "BX_H3eWRzV0l", "metadata": { - "collapsed": false + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "BX_H3eWRzV0l", + "outputId": "e2aa3424-5419-49a0-80b2-0bf48363c3b8" }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/keras/src/layers/convolutional/base_conv.py:107: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n", + " super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n" + ] + }, + { + "data": { + "text/html": [ + "
Model: \"sequential\"\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1mModel: \"sequential\"\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
+       "┃ Layer (type)                          Output Shape                         Param # ┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
+       "│ conv2d (Conv2D)                      │ (None, 32, 32, 64)          │           1,792 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization                  │ (None, 32, 32, 64)          │             256 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_1 (Conv2D)                    │ (None, 32, 32, 64)          │          36,928 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_1                │ (None, 32, 32, 64)          │             256 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ max_pooling2d (MaxPooling2D)         │ (None, 16, 16, 64)          │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dropout (Dropout)                    │ (None, 16, 16, 64)          │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_2 (Conv2D)                    │ (None, 16, 16, 128)         │          73,856 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_2                │ (None, 16, 16, 128)         │             512 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_3 (Conv2D)                    │ (None, 16, 16, 128)         │         147,584 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_3                │ (None, 16, 16, 128)         │             512 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ max_pooling2d_1 (MaxPooling2D)       │ (None, 8, 8, 128)           │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dropout_1 (Dropout)                  │ (None, 8, 8, 128)           │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_4 (Conv2D)                    │ (None, 8, 8, 256)           │         295,168 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_4                │ (None, 8, 8, 256)           │           1,024 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_5 (Conv2D)                    │ (None, 8, 8, 256)           │         590,080 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_5                │ (None, 8, 8, 256)           │           1,024 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ max_pooling2d_2 (MaxPooling2D)       │ (None, 4, 4, 256)           │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dropout_2 (Dropout)                  │ (None, 4, 4, 256)           │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_6 (Conv2D)                    │ (None, 4, 4, 512)           │       1,180,160 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_6                │ (None, 4, 4, 512)           │           2,048 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_7 (Conv2D)                    │ (None, 4, 4, 512)           │       2,359,808 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_7                │ (None, 4, 4, 512)           │           2,048 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ max_pooling2d_3 (MaxPooling2D)       │ (None, 2, 2, 512)           │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dropout_3 (Dropout)                  │ (None, 2, 2, 512)           │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ global_average_pooling2d             │ (None, 512)                 │               0 │\n",
+       "│ (GlobalAveragePooling2D)             │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dense (Dense)                        │ (None, 1024)                │         525,312 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dropout_4 (Dropout)                  │ (None, 1024)                │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dense_1 (Dense)                      │ (None, 100)                 │         102,500 │\n",
+       "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n",
+       "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n", + "│ conv2d (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m1,792\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m36,928\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_1 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ max_pooling2d (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_2 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m73,856\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_2 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_3 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m147,584\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_3 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ max_pooling2d_1 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dropout_1 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_4 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m295,168\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_4 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m1,024\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_5 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m590,080\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_5 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m1,024\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ max_pooling2d_2 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dropout_2 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_6 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m1,180,160\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_6 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m2,048\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_7 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m2,359,808\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_7 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m2,048\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ max_pooling2d_3 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dropout_3 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ global_average_pooling2d │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "│ (\u001b[38;5;33mGlobalAveragePooling2D\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m525,312\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dropout_4 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m) │ \u001b[38;5;34m102,500\u001b[0m │\n", + "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Total params: 5,320,868 (20.30 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m5,320,868\u001b[0m (20.30 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Trainable params: 5,317,028 (20.28 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m5,317,028\u001b[0m (20.28 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Non-trainable params: 3,840 (15.00 KB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m3,840\u001b[0m (15.00 KB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "from keras.models import Sequential\n", - "from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense\n", + "#altered code block\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D, Dense, Dropout, BatchNormalization\n", + "from tensorflow.keras.regularizers import l2\n", + "from tensorflow.keras.optimizers import Adam\n", + "from tensorflow.keras.callbacks import ReduceLROnPlateau\n", + "\n", + "def create_optimized_cnn():\n", + " model = Sequential()\n", + "\n", + " # 1st Convolutional Block\n", + " model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3), padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(MaxPooling2D(pool_size=(2, 2), strides=2))\n", + " model.add(Dropout(0.2))\n", + "\n", + " # 2nd Convolutional Block\n", + " model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(MaxPooling2D(pool_size=(2, 2), strides=2))\n", + " model.add(Dropout(0.3))\n", + "\n", + " # 3rd Convolutional Block\n", + " model.add(Conv2D(filters=256, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(filters=256, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(MaxPooling2D(pool_size=(2, 2), strides=2))\n", + " model.add(Dropout(0.4))\n", + "\n", + " # 4th Convolutional Block (New)\n", + " model.add(Conv2D(filters=512, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(filters=512, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(MaxPooling2D(pool_size=(2, 2), strides=2))\n", + " model.add(Dropout(0.5))\n", + "\n", + " # Global Average Pooling Layer\n", + " model.add(GlobalAveragePooling2D())\n", "\n", - "# Your code here" + " # Fully Connected Dense Layers\n", + " model.add(Dense(units=1024, activation='relu', kernel_regularizer=l2(0.01)))\n", + " model.add(Dropout(0.5))\n", + " model.add(Dense(units=100, activation='softmax')) # Output layer for 100 classes\n", + "\n", + " return model\n", + "\n", + "# Create the optimized model and compile it\n", + "optimized_cnn = create_optimized_cnn()\n", + "optimized_cnn.compile(optimizer=Adam(learning_rate=0.0005), # Reduced initial learning rate\n", + " loss='categorical_crossentropy',\n", + " metrics=['accuracy'])\n", + "\n", + "# Add a learning rate scheduler with different parameters\n", + "lr_scheduler = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=2, min_lr=1e-6)\n", + "\n", + "# Print the model summary\n", + "optimized_cnn.summary()" ] }, { "cell_type": "markdown", "id": "546324c007c73db5", "metadata": { - "collapsed": false + "collapsed": false, + "id": "546324c007c73db5" }, "source": [ "### Task 2b: Compile the model\n", "\n", - "- Select an appropriate loss function and optimizer for your model. These can be ones we have looked at already, or they can be different. \n", + "- Select an appropriate loss function and optimizer for your model. These can be ones we have looked at already, or they can be different.\n", "- Briefly explain your choices (one or two sentences each).\n", "- Loss function: ______\n", "- Optimizer: ______" @@ -149,23 +605,79 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "ab39f4ba69d684e9", "metadata": { - "collapsed": false + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ab39f4ba69d684e9", + "outputId": "7ba100c0-074d-45c9-fd9f-49637e79f222" }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model has been compiled successfully.\n" + ] + } + ], "source": [ - "from keras import optimizers\n", + "# Your code here.\n", + "\n", + "from tensorflow.keras.optimizers import Adam\n", + "\n", + "# Compile the model\n", + "def compile_model(model):\n", + " # Loss Function: Categorical Crossentropy\n", + " # Explanation: Categorical crossentropy is ideal for multi-class classification problems like CIFAR-100\n", + " # because it measures the difference between the true class distribution (one-hot labels) and the predicted\n", + " # class distribution (output of the softmax layer).\n", + " loss_function = 'categorical_crossentropy'\n", + "\n", + " # Optimizer: Adam\n", + " # Explanation: Adam is a popular optimizer that combines the benefits of RMSprop and SGD with momentum.\n", + " # It adapts the learning rate for each parameter, making it efficient and suitable for a wide range of problems.\n", + " optimizer = Adam(learning_rate=0.001)\n", "\n", - "# Your code here" + " # Compile the model with the chosen loss function and optimizer\n", + " model.compile(optimizer=optimizer, loss=loss_function, metrics=['accuracy'])\n", + "\n", + "# Compile the previously created model\n", + "compile_model(optimized_cnn)\n", + "\n", + "# Optional: Print a message to confirm the model is compiled\n", + "print(\"Model has been compiled successfully.\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "f7f84a7c", + "metadata": { + "id": "f7f84a7c" + }, + "source": [ + "**Brief Explanation:**\n", + "\n", + "**Loss Function: categorical_crossentropy**\n", + "- Categorical crossentropy is used because the task involves multi-class classification (100 classes in CIFAR-100).\n", + "- It works well with one-hot encoded labels and helps the model learn by minimizing the difference between predicted and actual class probabilities.\n", + "\n", + "**Optimizer: Adam**\n", + "- Adam Optimizer is chosen for its adaptive learning rate capabilities, combining the advantages of momentum (smooth updates) and RMSprop (adaptive learning rates).\n", + "- Default learning rate is 0.001, which is a good starting point for most tasks.\n", + "\n", + "**Metrics: Accuracy**\n", + "- Accuracy is selected as the evaluation metric to monitor the model’s performance during training and testing.\n" ] }, { "cell_type": "markdown", "id": "653fba928413b9f6", "metadata": { - "collapsed": false + "collapsed": false, + "id": "653fba928413b9f6" }, "source": [ "## Task 3: Model Training and Evaluation (Complete or Incomplete)\n", @@ -178,21 +690,122 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "9de74f274ad08546", "metadata": { - "collapsed": false + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9de74f274ad08546", + "outputId": "ad693141-0cbc-4fd3-c0f9-a422b54184fe" }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m33s\u001b[0m 11ms/step - accuracy: 0.0587 - loss: 6.8295 - val_accuracy: 0.1230 - val_loss: 4.1200\n", + "Epoch 2/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.1604 - loss: 3.8337 - val_accuracy: 0.2281 - val_loss: 3.4727\n", + "Epoch 3/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.2338 - loss: 3.4095 - val_accuracy: 0.3105 - val_loss: 3.0284\n", + "Epoch 4/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.3046 - loss: 3.0603 - val_accuracy: 0.3504 - val_loss: 2.9372\n", + "Epoch 5/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.3593 - loss: 2.8335 - val_accuracy: 0.3705 - val_loss: 2.8394\n", + "Epoch 6/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.4024 - loss: 2.6465 - val_accuracy: 0.3767 - val_loss: 2.9160\n", + "Epoch 7/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.4379 - loss: 2.5030 - val_accuracy: 0.4668 - val_loss: 2.4149\n", + "Epoch 8/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.4714 - loss: 2.3674 - val_accuracy: 0.4792 - val_loss: 2.3916\n", + "Epoch 9/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.4975 - loss: 2.2567 - val_accuracy: 0.4891 - val_loss: 2.3706\n", + "Epoch 10/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.5221 - loss: 2.1639 - val_accuracy: 0.5025 - val_loss: 2.3424\n", + "Epoch 11/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.5492 - loss: 2.0723 - val_accuracy: 0.5077 - val_loss: 2.3355\n", + "Epoch 12/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.5636 - loss: 2.0187 - val_accuracy: 0.5329 - val_loss: 2.2329\n", + "Epoch 13/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.5804 - loss: 1.9277 - val_accuracy: 0.5400 - val_loss: 2.2086\n", + "Epoch 14/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.6003 - loss: 1.8862 - val_accuracy: 0.5472 - val_loss: 2.2243\n", + "Epoch 15/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.6164 - loss: 1.8228 - val_accuracy: 0.4825 - val_loss: 2.5809\n", + "Epoch 16/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.6253 - loss: 1.7853 - val_accuracy: 0.5466 - val_loss: 2.2228\n", + "Epoch 17/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.6399 - loss: 1.7323 - val_accuracy: 0.5570 - val_loss: 2.2291\n", + "Epoch 18/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.6509 - loss: 1.6919 - val_accuracy: 0.5597 - val_loss: 2.2104\n", + "Epoch 19/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.6542 - loss: 1.6760 - val_accuracy: 0.5654 - val_loss: 2.1991\n", + "Epoch 20/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.6694 - loss: 1.5987 - val_accuracy: 0.5644 - val_loss: 2.2455\n", + "Epoch 21/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.6796 - loss: 1.5768 - val_accuracy: 0.5685 - val_loss: 2.2252\n", + "Epoch 22/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.6866 - loss: 1.5580 - val_accuracy: 0.5678 - val_loss: 2.2747\n", + "Epoch 23/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.7034 - loss: 1.4890 - val_accuracy: 0.5799 - val_loss: 2.2562\n", + "Epoch 24/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.7045 - loss: 1.4948 - val_accuracy: 0.5715 - val_loss: 2.2685\n", + "Epoch 25/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 5ms/step - accuracy: 0.7094 - loss: 1.4573 - val_accuracy: 0.5728 - val_loss: 2.2516\n", + "Model training is complete.\n" + ] + } + ], "source": [ - "# Your code here" + "# Train the Model\n", + "def train_model(model, x_train, y_train, x_val, y_val):\n", + " \"\"\"\n", + " Train the CNN model.\n", + "\n", + " Parameters:\n", + " model -- compiled CNN model\n", + " x_train -- training data\n", + " y_train -- training labels\n", + " x_val -- validation data\n", + " y_val -- validation labels\n", + " \"\"\"\n", + " # Number of epochs\n", + " # Explanation: 25 epochs is a reasonable choice to allow the model sufficient time to learn\n", + " # from the CIFAR-100 dataset while minimizing the risk of overfitting. Early stopping or\n", + " # further analysis can refine this choice.\n", + " epochs = 25\n", + "\n", + " # Batch size\n", + " # Explanation: A batch size of 32 balances computational efficiency and memory usage.\n", + " batch_size = 32\n", + "\n", + " # Training the model\n", + " history = model.fit(\n", + " x_train,\n", + " y_train,\n", + " epochs=epochs,\n", + " batch_size=batch_size,\n", + " validation_data=(x_val, y_val),\n", + " verbose=1\n", + " )\n", + "\n", + " return history\n", + "\n", + "# Train the baseline CNN model\n", + "history = train_model(optimized_cnn, x_train_split, y_train_split, x_val, y_val)\n", + "\n", + "# Print a message indicating training is complete\n", + "print(\"Model training is complete.\")\n" ] }, { "cell_type": "markdown", "id": "b48615c26b99d2e9", "metadata": { - "collapsed": false + "collapsed": false, + "id": "b48615c26b99d2e9" }, "source": [ "### Task 3b: Accuracy and other relevant metrics on the test set\n", @@ -209,25 +822,73 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 15, "id": "f670665fda92fb0e", "metadata": { "ExecuteTime": { "end_time": "2024-01-26T17:49:39.016880Z", "start_time": "2024-01-26T17:49:39.012100Z" }, - "collapsed": false + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "f670665fda92fb0e", + "outputId": "0a825780-bd59-4086-e2bf-00c45091eb4e" }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step\n", + "\n", + "Accuracy:0.57\n", + "\n", + "Other metric used: F1-Score\n", + "\n", + "Reason for selection: The F1-Score is a weighted harmonic mean of precision and recall, and it is useful for imbalanced datasets. It evaluates how well the model balances between precision and recall.\n", + "\n", + "Value of metric: 0.57\n", + "\n", + "Interpretation of metric value: An F1-Score close to 1 indicates a good balance between precision and recall, meaning the model is performing well across all classes.\n", + "\n" + ] + } + ], "source": [ - "# Your code here" + "# Your code here\n", + "from sklearn.metrics import classification_report\n", + "\n", + "# Evaluate the model on the test set\n", + "test_loss, test_accuracy = optimized_cnn.evaluate(x_test, y_test_one_hot, verbose=0)\n", + "\n", + "# Generate predictions for the test set\n", + "y_test_pred = optimized_cnn.predict(x_test)\n", + "y_test_pred_classes = y_test_pred.argmax(axis=1)\n", + "y_test_true_classes = y_test_one_hot.argmax(axis=1)\n", + "\n", + "# Generate a classification report\n", + "report = classification_report(y_test_true_classes, y_test_pred_classes, output_dict=True)\n", + "\n", + "# Extract another metric: F1-Score\n", + "f1_score = report['weighted avg']['f1-score']\n", + "\n", + "# Print results\n", + "print(f\"\"\"\n", + "Accuracy:{test_accuracy:.2f}\n", + "\\nOther metric used: F1-Score\n", + "\\nReason for selection: The F1-Score is a weighted harmonic mean of precision and recall, and it is useful for imbalanced datasets. It evaluates how well the model balances between precision and recall.\n", + "\\nValue of metric: {f1_score:.2f}\n", + "\\nInterpretation of metric value: An F1-Score close to 1 indicates a good balance between precision and recall, meaning the model is performing well across all classes.\n", + "\"\"\")\n" ] }, { "cell_type": "markdown", "id": "58d2d836d4e8ce99", "metadata": { - "collapsed": false + "collapsed": false, + "id": "58d2d836d4e8ce99" }, "source": [ "### Task 3c: Visualize the model's learning\n", @@ -239,25 +900,249 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 16, "id": "c5b214475a496ca5", "metadata": { "ExecuteTime": { "end_time": "2024-01-26T17:50:59.733968Z", "start_time": "2024-01-26T17:50:59.730635Z" }, - "collapsed": false + "colab": { + "base_uri": "https://localhost:8080/", + "height": 564 + }, + "id": "c5b214475a496ca5", + "outputId": "2fb4e146-53cf-412e-b07a-9fb80375bf29" }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAIjCAYAAAA0vUuxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAACrqUlEQVR4nOzdd3hURdvH8e9ueg8lCUmAQELvvag0aYKgYANEmog+Kioij8ijImDhVVBR7EqxIQgioiBV6QhIr6HXJISehJBks3vePxYWlgRIIMkG+H2uay9yZs85M7uZhL0zM/eYDMMwEBERERERkSsyu7oBIiIiIiIihZ0CJxERERERkWtQ4CQiIiIiInINCpxERERERESuQYGTiIiIiIjINShwEhERERERuQYFTiIiIiIiItegwElEREREROQaFDiJiIiIiIhcgwInESlwvXv3pkyZMtd17bBhwzCZTHnboEJm//79mEwmJk6cWOB1m0wmhg0b5jieOHEiJpOJ/fv3X/PaMmXK0Lt37zxtz430FZFbRe/evfH393d1M0RuewqcRMTBZDLl6LFo0SJXN/W29/zzz2Mymdi9e/cVz3n11VcxmUxs2rSpAFuWe3FxcQwbNowNGza4uinZ2r59OyaTCW9vb06fPu3q5kg+6N279xV/33l7e7u6eSJSSLi7ugEiUnh8//33Tsffffcd8+fPz1JeuXLlG6rn66+/xmazXde1r732Gq+88soN1X8r6N69O2PHjmXSpEkMHTo023N++uknqlevTo0aNa67nh49etC1a1e8vLyu+x7XEhcXx/DhwylTpgy1atVyeu5G+kpe+eGHHyhRogSnTp1i2rRpPPHEEy5tj+QPLy8vvvnmmyzlbm5uLmiNiBRGCpxExOGxxx5zOv7nn3+YP39+lvLLpaam4uvrm+N6PDw8rqt9AO7u7ri761dXw4YNKVeuHD/99FO2gdPKlSvZt28f//d//3dD9bi5ubn0g+ON9JW8YBgGkyZN4tFHH2Xfvn38+OOPhTZwOnv2LH5+fq5uRqFkGAZpaWn4+Phc8Rx3d/dr/q4TkdubpuqJSK40b96catWqsXbtWpo2bYqvry//+9//APjtt9+49957iYiIwMvLi5iYGN58802sVqvTPS5ft3JhTc/o0aP56quviImJwcvLi/r167NmzRqna7Nb42Qymejfvz8zZsygWrVqeHl5UbVqVebMmZOl/YsWLaJevXp4e3sTExPDl19+meN1U0uXLuXhhx+mdOnSeHl5UapUKV588UXOnTuX5fX5+/tz5MgROnXqhL+/PyEhIQwaNCjLe3H69Gl69+5NUFAQwcHB9OrVK8fTwbp3786OHTtYt25dlucmTZqEyWSiW7duZGRkMHToUOrWrUtQUBB+fn40adKEv//++5p1ZLfGyTAM3nrrLUqWLImvry8tWrRg69atWa49efIkgwYNonr16vj7+xMYGEi7du3YuHGj45xFixZRv359APr06eOYHnVhfVd2a5zOnj3LSy+9RKlSpfDy8qJixYqMHj0awzCczstNv7iS5cuXs3//frp27UrXrl1ZsmQJhw8fznKezWbjo48+onr16nh7exMSEsI999zDv//+63TeDz/8QIMGDfD19aVIkSI0bdqUefPmObX50jVmF1y+fuzC92Xx4sU888wzhIaGUrJkSQAOHDjAM888Q8WKFfHx8aFYsWI8/PDD2a5TO336NC+++CJlypTBy8uLkiVL0rNnT44fP05KSgp+fn688MILWa47fPgwbm5ujBw58qrvX06+V9WqVaNFixbZvqeRkZE89NBDTmVjxoyhatWqeHt7ExYWxlNPPcWpU6eyvF8dOnRg7ty51KtXDx8fH7788surtjUnLrzvS5Ys4amnnqJYsWIEBgbSs2fPLG0A+Oyzz6hatSpeXl5ERETw7LPPZvvzvWrVKtq3b0+RIkXw8/OjRo0afPTRR1nOy8nvlMmTJ1O3bl0CAgIIDAykevXq2d5LRHJPf7YVkVw7ceIE7dq1o2vXrjz22GOEhYUB9g8V/v7+DBw4EH9/f/766y+GDh1KUlISo0aNuuZ9J02aRHJyMk899RQmk4n33nuPBx54gL17915z5GHZsmVMnz6dZ555hoCAAD7++GMefPBBDh48SLFixQBYv34999xzD+Hh4QwfPhyr1cqIESMICQnJ0eueOnUqqampPP300xQrVozVq1czduxYDh8+zNSpU53OtVqttG3bloYNGzJ69GgWLFjA+++/T0xMDE8//TRgD0Duv/9+li1bxn/+8x8qV67Mr7/+Sq9evXLUnu7duzN8+HAmTZpEnTp1nOr++eefadKkCaVLl+b48eN88803dOvWjX79+pGcnMy4ceNo27Ytq1evzjI97lqG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RUxMDHPnzuXkyZNXHHWKiYnBZrOxbdu2qybjKFKkSJasaxkZGcTHx+e47dOmTaNXr168//77jrK0tLQs942JiWHLli3XvF+1atWoXbs2P/74IyVLluTgwYOMHTv2mtfl5ntVtmxZGjRowJQpU+jfvz/Tp0+nU6dOTvuHxcTEsGDBAu68806XB0W7du1yygSYkpJCfHw87du3By6+ttjYWKefk4yMDPbt20erVq0AHNNIt2zZ4ii7UZ6ennTs2JGOHTtis9l45pln+PLLL3n99ddzPLouItnTVD0RyRMX/hp66V/yMzIy+Oyzz1zVJCcXpuHMmDGDuLg4R/nu3buzrIu50vXg/PoMw7ihNL/t27cnMzOTzz//3FFmtVpz9KH0Up06dcLX15fPPvuMP//8kwceeABvb++rtn3VqlWsXLky121u1aoVHh4ejB071ul+Y8aMyXKum5tblpGdqVOnOqZjXXBh76GcpGFv3749VquVTz75xKn8ww8/xGQy5Xi92rX88MMPREdH85///IeHHnrI6TFo0CD8/f0dIx8PPvgghmEwfPjwLPe58Po7deqE2WxmxIgRWUZ9Ln2PYmJinNarAXz11VdXHHHKTnbv+9ixY7Pc48EHH2Tjxo38+uuvV2z3BT169GDevHmMGTOGYsWK5eh9zu33qkuXLvzzzz+MHz+e48ePO03TA3jkkUewWq28+eabWerKzMzMcRr/vPDVV19hsVgcx59//jmZmZmO19SqVSs8PT35+OOPnd7LcePGcebMGe69914A6tSpQ9myZRkzZkyW9l/PaPmJEyecjs1ms2MD7PT09FzfT0ScacRJRPLEHXfcQZEiRejVqxfPP/88JpOJ77//Ps+myuWFYcOGMW/ePO68806efvppx4e6atWqsWHDhqteW6lSJWJiYhg0aBBHjhwhMDCQX375JUdrZa6kY8eO3Hnnnbzyyivs37+fKlWqMH369Fyv//H396dTp06OdU6Xp4ju0KED06dPp3Pnztx7773s27ePL774gipVqpCSkpKrui7sHTNy5Eg6dOhA+/btWb9+PX/++WeWkZkOHTowYsQI+vTpwx133MHmzZv58ccfnf4CD/ZgITg4mC+++IKAgAD8/Pxo2LBhtmtUOnbsSIsWLXj11VfZv38/NWvWZN68efz2228MGDDAKRHE9YqLi+Pvv//OktTgAi8vL9q2bcvUqVP5+OOPadGiBT169ODjjz9m165d3HPPPdhsNpYuXUqLFi3o378/5cqV49VXX+XNN9+kSZMmPPDAA3h5ebFmzRoiIiIc+yE98cQT/Oc//+HBBx+kdevWbNy4kblz52Z5b6+mQ4cOfP/99wQFBVGlShVWrlzJggULsqRf/+9//8u0adN4+OGHefzxx6lbty4nT55k5syZfPHFF9SsWdNx7qOPPsrLL7/Mr7/+ytNPP52jjYlz+7165JFHGDRoEIMGDaJo0aJZRmCaNWvGU089xciRI9mwYQNt2rTBw8ODXbt2MXXqVD766COnPZ9yKzMzkx9++CHb5zp37uy0uXBGRgYtW7bkkUceITY2ls8++4y77rqL++67D7D/nAwZMoThw4dzzz33cN999znOq1+/vmPtp9ls5vPPP6djx47UqlWLPn36EB4ezo4dO9i6dStz587N1Wt44oknOHnyJHfffTclS5bkwIEDjB07llq1ajnWlonIDSjYJH4icjO5UjryqlWrZnv+8uXLjUaNGhk+Pj5GRESE8fLLLzvSGf/999+O866UjnzUqFFZ7sll6ZmvlI782WefzXLt5SmcDcMwFi5caNSuXdvw9PQ0YmJijG+++cZ46aWXDG9v7yu8Cxdt27bNaNWqleHv728UL17c6NevnyO99aWptHv16mX4+flluT67tp84ccLo0aOHERgYaAQFBRk9evQw1q9fn+N05BfMmjXLAIzw8PBs012/8847RlRUlOHl5WXUrl3b+OOPP7J8Hwzj2unIDcMwrFarMXz4cCM8PNzw8fExmjdvbmzZsiXL+52Wlma89NJLjvPuvPNOY+XKlUazZs2ypLL+7bffjCpVqjhSw1947dm1MTk52XjxxReNiIgIw8PDwyhfvrwxatQop/TNF15LTvvFpd5//30DMBYuXHjFcyZOnOiUfjozM9MYNWqUUalSJcPT09MICQkx2rVrZ6xdu9bpuvHjxxu1a9c2vLy8jCJFihjNmjUz5s+f73jearUagwcPNooXL274+voabdu2NXbv3n3FdORr1qzJ0rZTp04Zffr0MYoXL274+/sbbdu2NXbs2JHt6z5x4oTRv39/IzIy0vD09DRKlixp9OrVyzh+/HiW+7Zv394AjBUrVlzxfblcTr9XF9x5550GYDzxxBNXvOdXX31l1K1b1/Dx8TECAgKM6tWrGy+//LIRFxfnOCcqKsq49957c9zOq6Ujv7T/X3jfFy9ebDz55JNGkSJFDH9/f6N79+7GiRMnstz3k08+MSpVqmR4eHgYYWFhxtNPP50l7bhhGMayZcuM1q1bGwEBAYafn59Ro0YNp/TsOf2dMm3aNKNNmzZGaGio4enpaZQuXdp46qmnjPj4+By/FyJyZSbDKER/DhYRcYFOnTqxdetWdu3a5eqmiBRanTt3ZvPmzTlaE3irurD57po1axwbG4vI7UNrnETktnLu3Dmn4127djF79myaN2/umgaJ3ATi4+OZNWsWPXr0cHVTRERcRmucROS2Eh0dTe/evR17qXz++ed4enry8ssvu7ppIoXOvn37WL58Od988w0eHh489dRTrm6SiIjLKHASkdvKPffcw08//URCQgJeXl40btyYd955J9u9ekRud4sXL6ZPnz6ULl2ab7/9lhIlSri6SSIiLqM1TiIiIiIiItegNU4iIiIiIiLXoMBJRERERETkGm67NU42m424uDgCAgIwmUyubo6IiIiIiLiIYRgkJycTERGB2Xz1MaXbLnCKi4ujVKlSrm6GiIiIiIgUEocOHaJkyZJXPee2C5wCAgIA+5sTGBjoKLdYLMybN482bdrg4eHhqubJLUB9SfKK+pLkBfUjySvqS5JXClNfSkpKolSpUo4Y4Wpuu8DpwvS8wMDALIGTr68vgYGBLv8Gys1NfUnyivqS5AX1I8kr6kuSVwpjX8rJEh4lhxAREREREbkGBU4iIiIiIiLXoMBJRERERETkGm67NU45YRgGmZmZWK1WVzdFbkIWiwV3d3fS0tIKZR9yc3PD3d1d6fhFREREckGB02UsFgtxcXGkpqa6uilykzIMgxIlSnDo0KFCG5z4+voSHh6Op6enq5siIiIiclNQ4HSZgwcP4u7uTkREBJ6enoX2g68UXjabjZSUFPz9/a+5kVpBMwyDjIwMjh07xr59+yhfvnyha6OIiIhIYaTA6RLu7u7YbDYiIiLw9fV1dXPkJmWz2cjIyMDb27tQBiU+Pj54eHhw4MABRztFRERE5OoK36e6QqAwftgVyUvq4yIiIiK5o09PIiIiIiIi16DASURERERE5BoUOMkVlSlThjFjxuT4/EWLFmEymTh9+nS+tUlERERExBUUON0CTCbTVR/Dhg27rvuuWbOG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PmiPGjWKjz76iDFjxlC9enX8/PwYMGAAGRkZeVb/ypUr6d69O8OHD6dt27aOkZv3338/z+q41OXBjclkwmazXfH8uXPncuTIkSzJIKxWKwsXLqR169b4+Phc8fqrPQc40uZfmvHxSmuuLs9WOGjQIObPn8/o0aMpV64cPj4+PPTQQ47vz7XqBnjiiSfo0aMHH374IRMmTKBLly45DoxFREQkb2VabSzdfZxf1h5m/rajpGfaP6OYTXBnueI8VLckbaqUwMdT0/BuFgqcbiGPPPIIL7zwApMmTeK7777j6aefdgzzLl++nPvvv5/HHnsMsK9Z2rlzJ1WqVMnRvStXrsyhQ4eIj48nPDwcgH/++cfpnBUrVhAVFcWrr77qKDtw4IDTOZ6enlit1mvWNXHiRM6ePesIMJYvX47ZbKZixYo5am92xo0bR9euXZ3aB/D2228zbtw4WrduTY0aNfj222+xWCxZArOAgADKlCnDwoULadGiRZb7X8hCGB8fT0xMDECWtOtXsnz5cnr37k3nzp0B+wjU/v37Hc9Xr14dm83G4sWLHVP1Lte+fXv8/Pz4/PPPmTNnDkuWLMlR3SIiIpJ3diQk8cvaw8zYEOeUEa98qD8P1i1Jp1qRlAjShrQ3IwVOtxB/f3+6dOnCkCFDSEpKonfv3o7nypcvz7Rp01ixYgVFihThgw8+4OjRozkOnFq1akWFChXo1asXo0aNIikpKUsAUr58eQ4ePMjkyZOpX78+s2bN4tdff3U6p0yZMuzbt48NGzZQsmRJAgICsuyj1L17d9544w169erFsGHDOHbsGM899xw9evRwTNPLrWPHjvH7778zc+ZMqlWr5vRcz5496dy5MydPnqR///6MHTuWrl27MmTIEIKCgvjnn39o0KABFStWZNiwYfznP/8hNDSUdu3akZyczPLly3nuuefw8fGhUaNGvPfee4SEhJCamuq05utqypcvz/Tp0+nYsSMmk4nXX3/dafSsTJky9OrVi8cff9yRHOLAgQMkJibyyCOPAODm5kbv3r0ZMmQI5cuXz3YqpYiIiOS94ynpzNwQxy/rDrM1LslRXsTXg/trRfJgnZJUi9S6pZud0pHfYvr27cupU6do27at03qk1157jTp16tC2bVuaN29OiRIl6NSpU47vazab+fXXXzl37hwNGjTgiSee4O2333Y657777uPFF1+kf//+1KpVixUrVvD66687nfPggw9yzz330KJFC0JCQrJNie7r68vcuXM5efIk9evX56GHHqJly5Z88sknuXszLnEh0UR265NatmyJj48PP/zwA8WKFeOvv/4iJSWFZs2aUbduXb7++mvH6FOvXr0YM2YMn332GVWrVqVDhw7s2rXLca/x48eTmZlJixYtGDhwIG+99VaO2vfBBx9QpEgR7rjjDjp27Ejbtm2pU6eO0zmff/45Dz30EM888wyVKlWiX79+nD171umcvn37kpGRQZ8+fXL7FomIiEgupGdamb05nie+XUOjdxYy4o9tbI1LwsPNRNuqYXzVoy6r/teKYfdVpXrJIAVNtwCTYeRws6BbRFJSEkFBQZw5c8YpaYHFYmHevHmULVuW6OhovL01hCrXx2azkZSURGBgoGPdU0FZunQpLVu25NChQ1cdnUtLS2Pfvn2ULVtWfb0Qs1gszJ49m/bt22ebsEQkJ9SPJK+oL9nXMa8/dJrp6w7z+8Z4zpy7uJa5ZqlgHqwTSccaERTx83RhKwu/wtSXrhQbZEdT9URuAenp6Rw7doxhw4bx8MMPX/eURhEREckq7vQ5fl1/hF/WHWbvsYuzPUoEetO5TiQP1omkXGiAC1soBUGBk8gt4KeffqJv377UqlWL7777ztXNERERuemdTc9kzpYEfll3mJV7T3BhjpaPhxv3VLOnEG8cUww3pRC/bShwErkF9O7d2ykZiIiIiOTe8ZR0lu46xt87jrFg+1FSMy5mAm4UXZQH65SkXfVw/L30Efp2pO+6iIiIiNyWMq02Nhw6zeKdx1gUe4zNR844PV+2uB8P1I6kc51IShbR3oi3OwVO2bjN8mXIbUh9XEREblcJZ9JYsvMYi3ceY+muYySlZTo9XzUikGYVQmhZOYw6pYOVDU8cFDhd4sLGrKmpqfj4+Li4NSL5JzU1FcDlmWxERETyW0amjX8PnGTxzmMsjj3GjoRkp+eDfT1oUj6E5hVCaFKhOKEByjYr2VPgdAnDMAgMDCQxMRGw7yekvzJIbtlsNjIyMkhLSyvwdOTXYhgGqampJCYmEhwcjJubm6ubJCIikucOnUy1B0o7j7Fi93HOXrJWyWSCmiWDaVYhhOYVQ6hRMlgJHiRHFDhdJjQ0FDc3N0fwJJJbhmFw7tw5fHx8Cm3gHRwcTIkSJVzdDBERkTyRZrGyat9JFsceY9HORKeU4QDF/T1pWiGEZhVCaFo+RPssyXVR4HQZk8lEeHg4oaGhWCyWa18gchmLxcKSJUto2rRpoZwK5+HhoZEmERG5qRmGwb7jZx1JHf7Ze4L0TJvjeTezibqli9Csoj1YqhIeiFmjSnKDFDhdgZubmz5cynVxc3MjMzMTb2/vQhk4iYiI3IzOpmeycs8JFu1MZPHOYxw6ec7p+fAgb8f0uzvKFSfQW/8HS95S4CQiIiIihdLBE6nM2RrPothjrNl/Eov1YlZYTzcz9csWOR8shVI+1L/QTpGXW4MCJxEREREpNA6dTGX25nhmbY5n02HnfZVKFfWheYVQmlcMoVF0Mfy0Ea0UIPU2EREREXGpw6dS+XNzAn9sjmfjodOOcrMJGkUXo3WVMJpXDKVMMWU8FtdR4CQiIiIiBS7u9DnHyNL6g6cd5WYTNCxbjHtrhHNPtRIU9/dyXSNFLqHASUREREQKRPyZc8zenMCsTXGsuyRYMpmgQZmidKgRTttqJbQJrRRKCpxEREREJN8cTUqzjyxtiuffA6cc5SYT1I8qyr01wmlXrQShgQqWpHBT4CQiIiIieSoxKY0/tyQwa1M8aw6cxLiYDI/6ZYrQvno47aqFUyJIwZLcPBQ4iYiIiMgNO5aczpwt8fyxKZ7V+52DpbpRRbi3ejjtqpcgPMjHdY0UuQEKnERERETkuhxPSWfO+ZGlVftOYLskWKpdOph7q4fTvno4EcEKluTmp8BJRERERHLsxNkM/oqNZ9bmOFbucQ6WapYKpsP5kaWSRXxd10iRfKDASURERESuKiU9kz82HGHCNjMDVy3Gekm0VKNkkGNkqVRRBUty61LgJCIiIiJZWG0Gy3cfZ/q6w8zZmkCaxQaYAYNqkYHcWz2Ce6uHU7qYgiW5PShwEhERERGHnUeT+WXdYWasP8LRpHRHedlivlT2TebFB5tSvkSw6xoo4iIKnERERERuc8dT0pm5IY7p6w+z5UiSozzIx4P7akbwQJ1Iqpbw488//6RMMT8XtlTEdRQ4iYiIiNyG0ixW/tqRyPR1h1kUe4zM8+uW3M0mWlQK5cE6JWlRKQQvdzcALBaLK5sr4nIKnERERERuE4ZhsO7gaX5Zd5g/NsaRlJbpeK5mySAeqFOSjjUjKOrn6cJWihROCpxEREREbnGHTqby6/ojTF93mP0nUh3l4UHedKodyYN1IikXGuDCFooUfgqcRERERG5ByWkW/tycwLR1h1m976Sj3NfTjXuqleDBOiVpFF0MN7PJha0UuXkocBIRERG5RWRabSzbfZzp644wd2sC6Zk2AEwmuCOmGA/ULsk91Urg56WPgCK5pZ8aERERkZvcjoQkpq87woz1R0hMvphCPCbEjwfrlqRTrUgign1c2EKRm58CJxEREZGb0LHkdGZujOOXtYfZFn8xhXgR3wspxEtSo2QQJpOm4onkBQVOIiIiIjeJlPRM5m9LYOaGOJbsOo71fApxDzcTd59PId68Yiie7mYXt1Tk1qPASURERKQQS7NY+XtHIr9vimPh9kTHuiWAWqWCebBOJB1qRFBEKcRF8pUCJxEREZFCxmK1sWzXcX7fGMe8bUdJSb+431J0cT861ozgvloRxIT4u7CVIrcXBU4iIiIihYDVZrBq3wl+3xjPn1viOZ1qcTwXGexDh5rhdKwRQdWIQK1bEnEBBU4iIiIiLmIYBusPneb3jXHM2hTvlBGvuL8XHWqE07FmOLVLFcGs/ZZEXEqBk4iIiEgBMgyD7fHJ/L4pjt83xnH41DnHc4He7rSrFs59tSJoWLYo7m5K8iBSWChwEhERESkAe4+l8PvGeH7fFMfuxBRHua+nG62rhHFfzQialA9RRjyRQkqBk4iIiEg+OXL6HH9sjOP3TXFsOXJxryVPdzMtKoZwX81I7q4Uio+nmwtbKSI5ocBJREREJA8dS05n9uZ4ft8Yx78HTjnK3cwm7ipXnPtqRtC6ahiB3h4ubKWI5JYCJxEREZEbdCbVwtytCczcGMeKPcc5vy8tJhM0KFOUjjUjaF89nKLaa0nkpqXASUREROQ6GIbB0l3H+W7lARbvTMRiNRzP1SwVTMca4XSoEUGJIG8XtlJE8ooCJxEREZFcsFht/LEpjq+W7GN7/MV1S5VKBNCxZgQda0RQupivC1soIvnB5WlbPv30U8qUKYO3tzcNGzZk9erVVz3/9OnTPPvss4SHh+Pl5UWFChWYPXt2AbVWREREblcp6Zl8s3Qvzd77mxenbGR7fBK+nm70ubMM815sypwBTXm2RTkFTSK3KJeOOE2ZMoWBAwfyxRdf0LBhQ8aMGUPbtm2JjY0lNDQ0y/kZGRm0bt2a0NBQpk2bRmRkJAcOHCA4OLjgGy8iIiK3hcTkNCYu388P/xwgKS0TgOL+nvS+owyPNYoi2FfrlkRuBy4NnD744AP69etHnz59APjiiy+YNWsW48eP55VXXsly/vjx4zl58iQrVqzAw8OeiaZMmTIF2WQRERG5Tew5lsLXS/Yyfd0RMqw2AKKL+/FEk2geqBOJt4dSiIvcTlwWOGVkZLB27VqGDBniKDObzbRq1YqVK1dme83MmTNp3Lgxzz77LL/99hshISE8+uijDB48GDe37H95paenk56e7jhOSrLPRbZYLFgsFkf5ha8vLRO5HupLklfUlyQvqB/l3toDp/hm2X4Wxh7DOJ/voXapIJ64qwwtK4XiZjYBNiwWm0vbWdDUlySvFKa+lJs2uCxwOn78OFarlbCwMKfysLAwduzYke01e/fu5a+//qJ79+7Mnj2b3bt388wzz2CxWHjjjTeyvWbkyJEMHz48S/m8efPw9c06B3n+/PnX8WpEslJfkryiviR5Qf3o6mwGbDll4q84M/uSTY7yakVstIywER14gsz9J5i733VtLCzUlySvFIa+lJqamuNzb6qsejabjdDQUL766ivc3NyoW7cuR44cYdSoUVcMnIYMGcLAgQMdx0lJSZQqVYo2bdoQGBjoKLdYLMyfP5/WrVs7pgGKXA/1Jckr6kuSF9SPri7dYmXGxnjGL9/P3uP2D1AebiY61Yrg8TuiKBfq7+IWFh7qS5JXClNfujAbLSdcFjgVL14cNzc3jh496lR+9OhRSpQoke014eHheHh4OE3Lq1y5MgkJCWRkZODpmXVxppeXF15eXlnKPTw8sv1GXalcJLfUlySvqC9JXlA/cnYm1cIPqw4wYfl+jqfYp/QHeLvzWKMo+txRhtBA7b10JepLklcKQ1/KTf0uC5w8PT2pW7cuCxcupFOnToB9RGnhwoX0798/22vuvPNOJk2ahM1mw2y2Z1LfuXMn4eHh2QZNIiIiIpc6cvoc45buY/Kag6RmWAEID/Km711l6dqgNP5eN9VkHBEpQC797TBw4EB69epFvXr1aNCgAWPGjOHs2bOOLHs9e/YkMjKSkSNHAvD000/zySef8MILL/Dcc8+xa9cu3nnnHZ5//nlXvgwREREp5LbFJfHVkj38vikeq82e8aFSiQCeahZNhxoReLi5fGtLESnkXBo4denShWPHjjF06FASEhKoVasWc+bM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4lS9enWmTJmSpXzy5MlUqVIlTxolIvko9ST83BNmPmcPmso2hadX5HvQFJuQzP2fLuOfvSfx83Tj6x71eLp5jIImERERuSnkesTp9ddf54EHHmDPnj3cfffdACxcuJBJkyYxbdq0PG+giOQhpwQQHtDydWj8XL6uZQKYv+0oAyav52yGldJFffmmVz0qhAXka50iIiIieSnXgVPHjh2ZMWMG77zzDtOmTcPHx4eaNWvy119/UbRo0fxoo4jcqMwM+PttWP4RYNgTQDz4Tb6uZQIwDIPPFu1h9LxYDAMaRxfjs+51KOKXdbqviIiISGF2XenI7733Xu69914AkpKS+Omnnxg0aBBr167FarXmaQNF5AYd3w2/9IX4DfbjOr3gnpHg6Zev1aZZrAz+ZRO/bYgDoEejKIZ2rIKHW/6ObomIiIjkh+vex2nJkiWMGzeOX375hYiICB544AE+/fTTvGybiNwIFyWAAEg4k8ZT3//LxsNncDebGHZfVR5rpE2yRURE5OaVq8ApISGBiRMnMm7cOJKSknjkkUdIT09nxowZSgwhUpiknoTfX4DtM+3HZZtC5y8hMCLfq95w6DRPfvcvicnpBPt68Hn3ujSOKZbv9YqIiIjkpxzPmenYsSMVK1Zk06ZNjBkzhri4OMaOHZufbROR67FvCXx+pz1oMntA6xHQ47cCCZpmrD/CI1+uJDE5nQph/sx89i4FTSIiInJLyPGI059//snzzz/P008/Tfny5fOzTSJyPVyUAALAajMYNTeWLxbvAaBV5VA+7FKLAG+PfK9bREREpCDkeMRp2bJlJCcnU7duXRo2bMgnn3zC8ePH87NtIpJTJ/bAuNawfAxg2BNAPLWkQIKm5DQLT373ryNoeqZ5DF/1qKegSURERG4pOQ6cGjVqxNdff018fDxPPfUUkydPJiIiApvNxvz580lOTs7PdorIlcT+CV81t2fN8ykCXX6A+z7O96x5AAdOnOWBz1awcEciXu5mPupai5fvqYTZrE1tRURE5NaS67zAfn5+PP744yxbtozNmzfz0ksv8X//93+EhoZy3335n61LRM6z2eDvd+CnrpCeBKUbw9MroHLHAql+8c5j3P/pcnYlphAW6MXPTzXm/lqRBVK3iIiISEG7oQ1VKlasyHvvvcfhw4f56aef8qpNInIt507bA6bF79qPGzwFvX4v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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Your code here\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def plot_training_history(history):\n", + " \"\"\"\n", + " Plots the training and validation accuracy over epochs.\n", + "\n", + " Parameters:\n", + " history -- History object returned by model.fit()\n", + " \"\"\"\n", + " # Extract accuracy metrics\n", + " train_accuracy = history.history['accuracy']\n", + " val_accuracy = history.history['val_accuracy']\n", + " epochs = range(1, len(train_accuracy) + 1)\n", + "\n", + " # Plot the accuracies\n", + " plt.figure(figsize=(10, 6))\n", + " plt.plot(epochs, train_accuracy, label='Training Accuracy')\n", + " plt.plot(epochs, val_accuracy, label='Validation Accuracy')\n", + " plt.title('Training and Validation Accuracy over Epochs')\n", + " plt.xlabel('Epochs')\n", + " plt.ylabel('Accuracy')\n", + " plt.legend()\n", + " plt.grid(True)\n", + " plt.show()\n", + "\n", + "# Plot training and validation accuracy\n", + "plot_training_history(history)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "7S4ySEu--qpz", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "7S4ySEu--qpz", + "outputId": "22a7dbc5-89c8-4239-c900-e3ef802b26ed" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAvAAAAGTCAYAAABOLiYTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKC0lEQVR4nO3dd5hdBbn2/3uX2XvPnp5kJiG9AwKCJyIiJSAQAoQuHIlS1GhUFFCQ92A5CHhEhIOU6xUElM6LBA9ecFCKFKUf4QDSCWmQEJJMr7uv3x/8MjIkwL1CSVb4fq6LSzPzzLPWXvWZlZ19x4IgCAQAAAAgEuIbewUAAAAA+BjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4LFJ2GOPPbTHHntslGX/9Kc/VSwW2yjLlqT7779fsVhM999//5CvX3vttdpqq61UVVWlxsZGSR/OdorFYvrpT3/6gfYEgI8C9w7uHR9XDPCbsEWLFmn+/PmaPHmyMpmM6uvrtcsuu+jCCy/UwMDAxl690J5//nn99Kc/1dKlSz+S5eVyOf3qV7/STjvtpIaGBmUyGU2fPl3f+c539PLLL38k67ChXnzxRR133HGaMmWKLr/8cl122WUbe5UAfISuuuoqxWIxPf744xt7VTY67h0+7h0fH8mNvQJYv9tvv11HHHGE0um0jjnmGG277bYqFAp68MEH9YMf/EDPPfdc5E7M559/XmeccYb22GMPTZw48UNdVmtrq2bPnq0nnnhCc+bM0dy5c1VbW6uXXnpJN954oy677DIVCoUPdR1cu+++uwYGBpRKpQa/dv/996tSqejCCy/U1KlTB79+1113bYxVBICNhnvH+nHv+HhjgN8ELVmyRF/84hc1YcIE3Xvvvdpiiy0Gv3f88cfrlVde0e233/6+lxMEgXK5nKqrq9f5Xi6XUyqVUjwezb+kOe644/Tkk0/q5ptv1uGHHz7ke2eddZZ+9KMfbaQ1W1c8HlcmkxnytdWrV0vS4F9/rvXWCzUAbAzcOzYN3Ds+3qJ5hm3mfvnLX6q3t1e//e1vhwzva02dOlUnnnji4J9LpZLOOussTZkyRel0WhMnTtQPf/hD5fP5IT83ceJEzZkzR3feeac+/elPq7q6Wr/5zW8G30d344036sc//rHGjBmjbDar7u5uSdJjjz2m2bNnq6GhQdlsVjNnztRDDz20znqtWLFCX/va1zR69Gil02lNmjRJ3/rWt1QoFHTVVVfpiCOOkCTtueeeisVi633vniT19vaqpqZmyGtca/ny5UokEjr77LPfcfs99thjuv322/W1r31tnQuwJKXTaZ133nnv+POSdOWVV+rzn/+8WlpalE6n9YlPfEKXXHLJOnWPP/649t13X40YMULV1dWaNGmSvvrVrw6pufHGGzVjxgzV1dWpvr5e2223nS688MLB77/9fYwTJ07U6aefLklqbm4e8j7D9b2PMZ/P6/TTT9fUqVOVTqc1btw4nXrqqevs/3w+r+9973tqbm5WXV2dDjroIC1fvvxdtwOATcdxxx2n2tparVixQocccohqa2vV3NysU045ReVyeUjt2qew2223nTKZjJqbmzV79uwhb8nh3jEU9w7uHVHCE/hN0G233abJkyfrc5/7nFU/b948XX311frCF76gk08+WY899pjOPvtsvfDCC7rllluG1L700ks66qijNH/+fH3961/XlltuOfi9s846S6lUSqeccory+bxSqZTuvfde7bfffpoxY4ZOP/10xePxwQvUAw88oM985jOSpNdff12f+cxn1NnZqW984xvaaquttGLFCt18883q7+/X7rvvrhNOOEEXXXSRfvjDH2rrrbeWpMH/fava2lodeuih+v3vf6/zzz9fiURi8Hv/7//9PwVBoC996UvvuD1uvfVWSdLRRx9tbb/1ueSSS7TNNtvooIMOUjKZ1G233aZvf/vbqlQqOv744yW9+aRj1qxZam5u1r/927+psbFRS5cu1X/9138N9rn77rt11FFHaa+99tI555wjSXrhhRf00EMPrfcmI0kXXHCBrrnmGt1yyy265JJLVFtbq09+8pPrra1UKjrooIP04IMP6hvf+Ia23nprPfPMM/rVr36ll19+WX/84x8Ha+fNm6frrrtOc+fO1ec+9znde++9OuCAAzZ4GwH46JXLZe27777aaaeddN555+kvf/mL/vM//1NTpkzRt771rcG6r33ta7rqqqu03377ad68eSqVSnrggQf06KOP6tOf/rQk7h1vx72De0ekBNikdHV1BZKCgw8+2Kp/6qmnAknBvHnzhnz9lFNOCSQF99577+DXJkyYEEgK7rjjjiG19913XyApmDx5ctDf3z/49UqlEkybNi3Yd999g0qlMvj1/v7+YNKkScE+++wz+LVjjjkmiMfjwd///vd11nHtzy5YsCCQFNx3333r1MycOTOYOXPm4J/vvPPOQFLw5z//eUjdJz/5ySF163PooYcGkoKOjo53rVvr9NNPD95+Krx1O6y17777BpMnTx788y233BJIWu9rXuvEE08M6uvrg1Kp9I41a7f/W7fL2nVas2bNkNq3b6drr702iMfjwQMPPDCk7tJLLw0kBQ899FAQBP88Tr797W8PqZs7d24gKTj99NPfcf0AfPSuvPLKda4vxx57bCApOPPMM4fUfupTnwpmzJgx+Od77703kBSccMIJ6/Rdez3m3rEu7h3cO6KEt9BsYtb+1WNdXZ1V/6c//UmS9P3vf3/I108++WRJWue98pMmTdK+++673l7HHnvskPc0PvXUU1q4cKHmzp2rtrY2tba2qrW1VX19fdprr730t7/9TZVKRZVKRX/84x914IEHDj7ZeasN+ZitvffeW6NHj9b1118/+LVnn31W//jHP/TlL3/5XX827DZcn7duh66uLrW2tmrmzJlavHixurq6JP3zPYb//d//rWKxuN4+jY2N6uvr0913373B6/JuFixYoK233lpbbbXV4P5pbW3V5z//eUnSfffdJ+mfx8kJJ5ww5OdPOumkD2W9AHx4vvnNbw7582677abFixcP/vkPf/iDYrHY4Nsp3mrt9Zh7x7q4d3DviBLeQrOJqa+vlyT19PRY9cuWLVM8Hh/yr80ladSoUWpsbNSyZcuGfH3SpEnv2Ovt31u4cKGkNy/O76Srq0uFQkHd3d3adtttrXV2xONxfelLX9Ill1yi/v5+ZbNZXX/99cpkMoPvh3wnb92Gb/+HPK6HHnpIp59+uh555BH19/cP+V5XV5caGho0c+ZMHX744TrjjDP0q1/9SnvssYcOOeQQzZ07V+l0WpL07W9/WzfddJP2228/jRkzRrNmzdKRRx6p2bNnb9B6vd3ChQv1wgsvqLm5eb3fX/sPmtYeJ1OmTBny/bf+NTiATd/a97O/VVNTkzo6Ogb/vGjRIo0ePVrDhg17xz7cO9bFveOfuHds+hjgNzH19fUaPXq0nn322VA/5z6pWN+nBrzT9yqViiTp3HPP1Q477LDen6mtrVV7e7u3kiEdc8wxOvfcc/XHP/5RRx11lG644QbNmTNHDQ0N7/pzW221lSTpmWee0W677RZ6uYsWLdJee+2lrbbaSueff77GjRunVCqlP/3pT/rVr341uF1isZhuvvlmPfroo7rtttt055136qtf/ar+8z//U48++qhqa2vV0tKip556Snfeeaf+/Oc/689//rOuvPJKHXPMMbr66qvDb5S3qVQq2m677XT++eev9/vjxo1738sAsOl46/u6PwjcO/6Je8c/ce/Y9DHAb4LmzJmjyy67TI888oh23nnnd62dMGGCKpWKFi5cOOQf9axatUqdnZ2aMGHCBq/H2t+46+vrtffee79jXXNzs+rr69/zl46wfx267bbb6lOf+pSuv/56jR07Vq+++qouvvji9/y5Aw88UGeffbauu+66DboI33bbbcrn87r11ls1fvz4wa+v/SvFt/vsZz+rz372s/qP//gP3XDDDfrSl76kG2+8UfPmzZP05sd3HXjggTrwwANVqVT07W9/W7/5zW/0k5/8ZJ2nX2FNmTJFTz/9tPbaa6933b5rj5NFixYNeXLy0ksvva/lA9j0TJkyRXfeeafa29vf8Sk89451ce9YF/eOTRfvgd8EnXrqqaqpqdG8efO0atWqdb6/aNGiwY+S2n///SW9+a/P32rtb9Xv51+Kz5gxQ1OmTNF5552n3t7edb6/Zs0aSW/+leUhhxyi2267bb2pgUEQSJJqamokSZ2dnfY6HH300brrrrt0wQUXaPjw4dpvv/3e82d23nlnzZ49W1dcccWQf0m/VqFQ0CmnnPKOP7/2Cdfa9Zbe/KvPK6+8ckhdR0fHkBpJg0+b1n4MV1tb25Dvx+PxwU8FePtHdW2II488UitWrNDll1++zvcGBgbU19cnSYPb7aKLLhpS8/bjBkD0HX744QqCQGecccY631t7zeLesS7uHW/i3hENPIHfBE2ZMkU33HCD/vVf/1Vbb731kCTWhx9+WAsWLNBxxx0nSdp+++117LHH6rLLLlNnZ6dmzpyp//mf/9HVV1+tQw45RHvuuecGr0c8HtcVV1yh/fbbT9tss42+8pWvaMyYMVqxYoXuu+8+1dfX67bbbpMk/fznP9ddd92lmTNnDn4k1cqVK7VgwQI9+OCDamxs1A477KBEIqFzzjlHXV1dSqfTg5+X+07mzp2rU089Vbfccou+9a1vqaqqylr3a665RrNmzdJhhx2mAw88UHvttZdqamq0cOFC3XjjjVq5cuU7fp7vrFmzBp98zJ8/X729vbr88svV0tKilStXDtZdffXV+vWvf61DDz1UU6ZMUU9Pjy6//HLV19cP3hznzZun9vZ2ff7zn9fYsWO1bNkyXXzxxdphhx3W+zFoYR199NG66aab9M1vflP33XefdtllF5XLZb344ou66aabBj+3eYcddtBRRx2lX//61+rq6tLnPvc53XPPPXrllVfe9zoA2LTsueeeOvroo3XRRRdp4cKFmj17tiqVih544AHtueee+s53vsO94x1w7+DeERkb7wNw8F5efvnl4Otf/3owceLEIJVKBXV1dcEuu+wSXHzxxUEulxusKxaLwRlnnBFMmjQpqKqqCsaNGxecdtppQ2qC4M2PAjvggAPWWc7aj6JasGDBetfjySefDA477LBg+PDhQTqdDiZMmBAceeSRwT333DOkbtmyZcExxxwTNDc3B+l0Opg8eXJw/PHHB/l8frDm8ssvDyZPnhwkEokhH3/19o+4eqv9998/kBQ8/PDDzmYb1N/fH5x33nnBjjvuGNTW1gapVCqYNm1a8N3vfjd45ZVXBuvW91Fgt956a/DJT34yyGQywcSJE4Nzzjkn+N3vfhdICpYsWRIEQRD87//+b3DUUUcF48ePD9LpdNDS0hLMmTMnePzxxwf73HzzzcGsWbOClpaWIJVKBePHjw/mz58frFy5crDm/XwUWBAEQaFQCM4555xgm222CdLpdNDU1BTMmDEjOOOMM4Kurq7BuoGBgeCEE04Ihg8fHtTU1AQHHnhg8Nprr/FRYMAm6J0+RrKmpmad2vVdw0qlUnDuuecGW221VZBKpYLm5uZgv/32C5544onBGu4d68e9g3tHFMSC4G1/jwNsYg499FA988wz/MYPALBx78DmjPfAY5O2cuVK3X777e8rGQ8A8PHCvQObO94Dj03SkiVL9NBDD+mKK65QVVWV5s+fv7FXCQCwiePegY8LnsBjk/TXv/5VRx99tJYsWaKrr75ao0aN2tirBADYxHHvwMcF74EHAAAAIoQn8AAAAECEMMADAAAAEcIADwAAsBFNnDhxMKARcDDA4wMRi8Ws/+6///6NvarrNXHixPWu7ze/+c0hdStXrtS//du/ac8991RdXd0m/ZoAfHxE/Rr8VosWLVImk1EsFtPjjz++zvfvvvtu7brrrspms2pqatIXvvAFLV26dIOXd9VVVw3ZRplMRtOnT9d3vvMdrVq16n28ko/WokWLNHfuXLW0tKi6ulrTpk3Tj370o3XqbrrpJn32s59VY2Ojhg8frpkzZ+r222/fCGuM94OPkcQH4tprrx3y52uuuUZ33333Ol//ICKgPyw77LCDTj755CFfmz59+pA/v/TSSzrnnHM0bdo0bbfddnrkkUc+ylUEgPXaHK7Ba33ve99TMplUPp9f53v//d//rYMPPlj/8i//ol/84hfq7u7WhRdeqF133VVPPvmkmpubN3i5Z555piZNmqRcLqcHH3xQl1xyif70pz/p2WefVTabfT8v6UP31FNPaY899tCYMWN08skna/jw4Xr11Vf12muvDam7+OKLdcIJJ+iAAw7QL37xC+VyOV111VWaM2eO/vCHP+iwww7bSK8AoW3cIFhsro4//vh1IqbXp6+v7yNYm/f2TlHhb9fd3R20tbUFQRAECxYsWCfGGgA2BVG7Bq91xx13BKlUKvjxj38cSAr+/ve/D/n+Jz7xiWDq1KlBPp8f/NpTTz0VxOPx4Pvf//4GLfPKK69c77K+//3vB5KCG2644R1/tre3d4OW+XYTJkwIjj322A362XK5HGy77bbBTjvtFPT3979r7bRp04Idd9wxqFQqg1/r6uoKamtrg4MOOmiDlo+Ng7fQ4COzxx57aNttt9UTTzyh3XffXdlsVj/84Q8lvfnXvz/96U/X+Zn1vS+ws7NTJ510ksaNG6d0Oq2pU6fqnHPOUaVSGVK3cuVKvfjiiyoWi/Y6FgoF9fX1veP36+rqNGzYMLsfAGwqNvVrcLFY1IknnqgTTzxRU6ZMWef77e3tev7553XooYcqlUoNfn377bfX1ltvrRtvvNFajuvzn/+8pDfDoSTpuOOOU21trRYtWqT9999fdXV1+tKXviRJqlQquuCCC7TNNtsok8lo5MiRmj9/vjo6Oob0DIJAP/vZzzR27Fhls1ntueeeeu6559a7/EWLFmnRokXvuZ533XWXnn32WZ1++umqrq5Wf3+/yuXyemu7u7vV0tKiWCw2+LX6+nrV1taqurr6vTcKNhkM8PhItbW1ab/99tMOO+ygCy64QHvuuWeon+/v79fMmTN13XXX6ZhjjtFFF12kXXbZRaeddpq+//3vD6k97bTTtPXWW2vFihVW73vvvVfZbFa1tbWaOHGiLrzwwlDrBgCbuk35GnzBBReoo6NDP/7xj9f7/bVvqVnfoJnNZvX666/rjTfeCPV63s3a4Xn48OGDXyuVStp3333V0tKi8847T4cffrgkaf78+frBD36gXXbZRRdeeKG+8pWv6Prrr9e+++475BeYf//3f9dPfvITbb/99jr33HM1efJkzZo1a70Pjvbaay/ttdde77mef/nLXyRJ6XRan/70p1VTU6NsNqsvfvGLam9vH1K7xx576I477tDFF1+spUuX6sUXX9Txxx+vrq4unXjiieE3EjYa3gOPj9Qbb7yhSy+9dIPjrc8//3wtWrRITz75pKZNmybpzQvn6NGjde655+rkk0/WuHHjQvf95Cc/qV133VVbbrml2tradNVVV+mkk07S66+/rnPOOWeD1hUANjWb6jX4jTfe0FlnnaXzzjtP9fX1660ZOXKkGhsb9dBDDw35eltbm55//nlJ0ooVKzY4fbWrq0utra3K5XJ66KGHdOaZZ6q6ulpz5swZrMnn8zriiCN09tlnD37twQcf1BVXXKHrr79ec+fOHfz6nnvuqdmzZ2vBggWaO3eu1qxZo1/+8pc64IADdNtttw0+Bf/Rj36kn//85xu0zpK0cOFCSdKRRx6p2bNn67TTTtPTTz+ts88+W6+99poefPDBwWVddNFFam1t1QknnKATTjhBkjRixAjdc8892nnnnTd4HfDR4wk8PlLpdFpf+cpXNvjnFyxYoN12201NTU1qbW0d/G/vvfdWuVzW3/72t8Haq666SkEQaOLEie/Z99Zbb9Wpp56qgw8+WF/96lf117/+Vfvuu6/OP/98LV++fIPXFwA2JZvqNfj//J//o8mTJ2vevHnvWBOPxzV//nzdc889Ou2007Rw4UI98cQTOvLII1UoFCRJAwMDG/za9t57bzU3N2vcuHH64he/qNraWt1yyy0aM2bMkLpvfetbQ/68YMECNTQ0aJ999hmyTWbMmKHa2lrdd999kt58Ul4oFPTd7353yFtYTjrppPWuz9KlS61P1+nt7ZUk7bjjjrruuut0+OGH68wzz9RZZ52lhx9+WPfcc89gbTab1ZZbbqljjz1WCxYs0O9+9zttscUWOuyww/TKK684mwmbCJ7A4yM1ZsyYIe9dDGvhwoX6xz/+8Y6fNLB69eoN7v1WsVhM3/ve93TnnXfq/vvv15e//OUPpC8AbEyb4jX40Ucf1bXXXqt77rlH8fi7P1c888wz1draql/+8pf6xS9+IUmaNWuWvva1r+nSSy9VbW1t6OWv9X//7//V9OnTlUwmNXLkSG255ZbrrE8ymdTYsWOHfG3hwoXq6upSS0vLevuu3SbLli2TpMG/uVirublZTU1NG7zea99SdNRRRw35+ty5c3Xaaafp4Ycf1t577y1JOuKII5RMJnXbbbcN1h188MGDHzn5+9//foPXAx8tBnh8pML+I5m3/0OcSqWiffbZR6eeeup669/+sY/vx9q/Bn77ewgBIKo2xWvwqaeeqt12202TJk0afOLc2toq6c1/CPvqq69q/PjxkqRUKqUrrrhC//Ef/6GXX35ZI0eO1PTp0zV37lzF43FNnTo19PLX+sxnPqNPf/rT71qTTqfXGeorlYpaWlp0/fXXr/dn3s9HWzpGjx4t6c23GL3V2l8o1v5D2sWLF+uOO+7QZZddNqRu2LBh2nXXXdd5axI2bQzw2CQ0NTWps7NzyNcKhYJWrlw55GtTpkxRb2/v4NOED9PixYslffgXXwDY2DbmNfjVV1/VsmXLNGnSpHW+d9BBB6mhoWGddRs5cuTgwFoul3X//fdrp512el9P4DfUlClT9Je//EW77LLLu/6CNGHCBElvPrGfPHny4NfXrFmzzqfVhDFjxgxdfvnl6/xj4ddff13SP+9ha0Op1vcJNcViUaVSaYPXAR893gOPTcKUKVOGvHdSki677LJ1LjRHHnmkHnnkEd15553r9Ojs7BxyAXI/wqy9vX2d5RSLRf3iF79QKpUK/SkNABA1G/MafNlll+mWW24Z8t93v/tdSdJ55533jk+21zrvvPO0cuXKdYL4PipHHnmkyuWyzjrrrHW+VyqVBn/52HvvvVVVVaWLL75YQRAM1lxwwQXr7et+jOTBBx+sdDqtK6+8cshHeV5xxRWSpH322UeSNHXqVMXjcf3+978fsvzly5frgQce0Kc+9an3XBY2HTyBxyZh3rx5+uY3v6nDDz9c++yzj55++mndeeedGjFixJC6H/zgB7r11ls1Z84cHXfccZoxY4b6+vr0zDPP6Oabb9bSpUsHf+a0007T1VdfrSVLlrzrP6K69dZb9bOf/Uxf+MIXNGnSJLW3t+uGG27Qs88+q5///OfrfKLBz372M0ka/Ozea6+9Vg8++KAkvePHnwHApmxjXoNnzZq1ztfWDr0zZ84c8raW6667Tn/4wx+0++67q7a2Vn/5y1900003ad68eYMf6bjWcccdZy3//Zo5c6bmz5+vs88+W0899ZRmzZqlqqoqLVy4UAsWLNCFF16oL3zhC2pubtYpp5yis88+W3PmzNH++++vJ598Un/+85/X2c6SBj9C8r3+IeuoUaP0ox/9SP/+7/+u2bNn65BDDtHTTz+tyy+/XEcddZR23HFHSW8+if/qV7+qK664QnvttZcOO+ww9fT06Ne//rUGBgZ02mmnfeDbBh8eBnhsEr7+9a9ryZIl+u1vf6s77rhDu+22m+6+++51PgM3m83qr3/9q37+859rwYIFuuaaa1RfX6/p06frjDPOUENDQ+hlb7fddvrEJz6h6667TmvWrFEqldIOO+ygm266SUccccQ69T/5yU+G/Pl3v/vd4P9ngAcQRRvzGhzG9OnT1d7errPOOksDAwPacsstdemll+ob3/jGOrW9vb2qrq5WY2Pjh7pOknTppZdqxowZ+s1vfqMf/vCHSiaTmjhxor785S9rl112Gaz72c9+pkwmo0svvVT33XefdtppJ91111064IAD3tfyf/zjH6upqUkXX3yxTjrppCFD/Vtdcskl2n777fXb3/52cGDfcccddc0112j33Xd/X+uAj1YseOvfowAAAGwGRo4cqWOOOUbnnnvuxl4V4APHAA8AADYrzz33nHbeeWctXrx4vW9PAaKOAR4AAACIED6FBgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBA7yOmYE06wmxbL710jSY11dXbP7tY1Vl1n20q7Z6nYa9cqyFtlVbGY3TJeSdi1HWu6rbpYwu85bLT30VqluP9BRX19/XZt66oOb/mlgt0zlfF/Jx0+otGqa2r0g0k6Orz91NbqvXZJqmuotWura7JWXa7gb9OK/P3f2t5m1fX3hjj3yt5rOmDfY+yWhx38Fbs2EfeWn63299POO3k9o+TRF/1jqlwqWnUfxoekxUJcoz+U2lA97VLFY961Lx7iuV3cLDUX/WZtzN+nMfPaE2b5UoiN6nYMs6PsnmGO/coHvvxQB1+Ytm5diLkjHt+4+9StTCf8A3VC83vPcjyBBwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiJCkW1joL9tNX39jhVW3uD9n9xw/coxV1zJiot1zoNRn19ZkvE3VUF1t9+xt9+Pk0/Euqy5Zb+9S5eXFmQ9099g9u7sG7NqkGZNeW19n94ynU3ZtwVzV/ph/7A905q26Sr+37SWpr9Bm18YKXpx908hmu2d/wXtNkhQ3I71rqmvtnqUB75hevmyR3fOJvz9o19bXtlh1kyZtafeUJoSojYZKsd+uDSpmTHrcf8YUi7139LgkxUI8tkok/Dj1eIh19YVZvlfrbaW1i/f2U8yse7PWX7y9ScMs31+8vU1jZp0kxc0NkIh519I3a/1jz11+LMSOCrNPY3FzX4W477o9YyH2fpjrhFuaCXGcfJDLBQAAALAJYIAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACLFjO1e88qzdtBLzUiaDnJcaKUlty700yPZExu4Zr07btWsq3rqmqvzfiYKyX1vMlay6luoau+e0SdOsungya/dc9cZquzbf7yXRFip+amki7SfhZpLetpqwxTi7Z6HfS63938f9JNBKxUvhlaT+fi8Ns9Dtn3sDRT+JNSh7l5Sg5CfSBSUvZa+zY43dc/lrfmprywgvEXBki5cWvbnaotG/ng4UvOtZKQhxnMS9Yy9UEmeYNEo3tTPE8j+UJNYQj+3cNM4PJV1VfhpmuNTQD36fhjpO3CTWEPs+IT+J1k9itVsqzHFqp6aGSC11k4A/jH0v+UHAqQ82iJUn8AAAAECUMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHiZU9LSlX50evpTNaqa88N2D1Xr1pi1Q30eRHdkjS8eaxdO2zEMKuuWPBj52tq6+za5i2GW3XTJk60e44Z473+nL9JpbIfp16dafAK/ZRoZTIpu3bhwkVW3csvLrN7bjN9qlV3+MHH2j2Xr37Nrn3ltaVWXSHwd2qm7NfWV3vndCJZZfd0a0vFst2zXPZrY6pYdR/3pyHDs/6JOpD0MsUHSn7PiplnHo/5eyoWJqLebRviehYiod5eftKMspckd1PFE/6K2ttJUtxc11gsROx9iG3q14bYpmZP83CWJMVDHCj28sNsqBBi5kEVjydCNHU31odznATm4hMf8E3i437PAQAAACKFAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAixE5iXfyynwa5xegJVt3IpvF2z/HDvZ5NdU12z5wfmqpY3Ivl2mLMGLtnvuin2+bMhNelr75u91y4ZKlVVyx7SZSS1NGZs2sbG0d7dbVeCq4kJUJEncVSXmJwy8QRds9X23usujXd/sE32jyfJOlzE7a16opB0e6ZrvIT8aqT3iWlo6vT7rniDe+YXrL4FbtnJfjgIy7dJNDNVazgn/sJ85KSjtu3KFXM1M4qv6USIeIY42ZtIulfo+Ihrmdx8x6VCJPE6r78DyXdVIqZ51So0NAwyzfrghBN3dpYmBUN4UPYpaGrP3BhruemMJdzOwf2A15NnsADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABEiB0q/ZkddrGbjp842arr7+6ze65ctsKqe6Oj1e7Z3d1l1xaDslW3avVqu2dvbiDE8ktWXZDw6iQpk6m26kaOGm/3bG5utmt7urutuqUdK+2eibT/O+nYyZOsulh1iOz1UtEq6+rpsVtmWxN2bW9Hm1XX0dVu96zEzNx7SVuMHmXVVWezds+ejk6rrlTyj/0g8HOyK+YhFZhR9purWIic8KS7rUJs0yDh1aaSH8J6yo9JT4a4nISpVdw8pj+EwzTM+fRhiLuvXZJifq39soIQz0IDbweE2aKxEK/frYyFOlD85dtdQ22AELX28kOc+yG26geJJ/AAAABAhDDAAwAAABHCAA8AAABECAM8AAAAECEM8AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARYgc158r9dtMnn3vMqlu1YpXdM1bw4uSHpevtnskQsbYZM/q9ttqPiE+m03ZtUOXVxbJlu2d9w3CrrrlprN0zXvGzv8eNTVl1ZfXaPYuVPru2UPSO6aCvaPfM5CpWXbzPP58G+gt2bSnv1ca800mSlMz4xe0r81ZddV2T3bNc9LZ/UPaP/Urg7SdJsisTH/PnISFSwuMJr7jKrJP8YzrpX6IUj4WIiHdXNe4fe0HMr42bKxDIP59jZk+3Ljxz+4fYTwr88zRuPuOshFl82dunyWSIi3QIlSDEyrpC7H576WHOPb+rL9Rr8pYf80duy8f8jgMAAABECwM8AAAAECEM8AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARIgdC9Xd22M3zeW9NMyx40fbPUcM38Kqq03U2j2DvpJfG/eSthpbhtk9e0sDdm0h5q1rotpuqapEjVWXTnqJqZIU+KGhCkpecarKT6RrrPPSZSWplPMSPuNF//fcdL2XxNuvnN2zKulHwsUDL400GSLhUmkzBlhSPmHuq5SfWDxqpJdY3Dvgp/CGSe4LKl5yYpgwyM1RLO6nDCbM4y+WDPGMySwNs+/DBIzGzAMgHuIlhVv+B5+G6oZ2hll0ECIJ1K2NmffnN/k7oJj3rqePPuSlz0vSa8uWWnU77LCd3XPLrbe0a5Np/37uCrP1/d0f6uA3C/1kY4VIQbaP01Bb6r1fE0/gAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIsTOvh7fMtlumqnyotcz1dV2z+qGOquuUvSjakuZol0blLzanq5uu2eqLuMv343gzZlR9pKCwIsfLsbzds+aEPtUFS+mure1x25ZiPvxy8Pqaqy6Sqlk9+wv9Xp15raXpFQ8a9fWmDHZ+VLB7pnNNtm1yZi3/EqI7PW+/hVWXW4gZ/dsaAoR013yjtNYOUxM9uanHHjX/TeLvTL/aiYpbm5/t05SOcR5GjOPaT9KXqE2gNs3CBEn776mULH3oXgvqhL4rykZ94/T1SvXWHV/u+dBu+crLz1j1T3/1P/aPfc7YH+7dtrWW1p19cP86366xr/vV8xjpVz64K+nsRDzQahau85/Tc65xxN4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACEm6hfU1DXbTeMn7vaCq7Ecal7q9OPtYiOjpfF+fv/xc3qrLpPxI4ZaakXZtLOVF1OcGzIxySZWSFz+dyXjLlqRSacCubWtrt+oS/mGqeDxt15biXt+mYY12z+GjWqy6SsI/9jt7i3ZtOu0df8WSdz5J0oo3Vtu1FXnH3xur3rB75gvdVl0i4Z/8QcWPXg/MjPpKiJ6bo/6c//pj5nGSCBFnHo+ZMeUJv2eY2pi5/FiIx2aJuF8ci5vX/ri/n+Jx75xyYt83rNbcpiHu+88+/6Jde/st91h1xby/TXfdZTerLij12z1fef4Fu3blytetutETJ9o9/+WzO9q1+aK3T3t7/FkmkfDOk0y1f6CkM/7cUal499NK0ZsjJam+rvY9a3gCDwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABEiB011TBihN006PPSrlIhUjPTWa9nJUTKXGN9s12bLHvpYY219XbP/ryfWuomZ6ZLftJXJuOlgY4e22j3jCeH2bXlyWOtuq6uXrtnV4efrptMeMdfOeYn0XblC1ZdU0ud3XNYlX+eFAPvPAlx6CkIkQbZ29Vh1SVDJFzGq7NWXV+uy+4ZC5Nwaa7qxz2JtVjxzz0F3vZPBCFSmGWmhpb9hEc73VR+wmrMTI2UpCDhX3vc5cfjZmKtpMA89uOhzid/+XKTWCv+9eSRR5+0ax/6+9NWXZ15jZKkzp4eq+5fthxn9xw9vMGufXbRYquuv+CndU+YvpVdG5gJ6Imkn1aeL3hp5aUQ53654h+npZJ334+7J5SkemNE4Ak8AAAAECEM8AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhNg51f0VP4K2ecQWVl110o8fTiW9WNuBshepK0l9Bf81lQa8mPC+ot/zjdWr7Nps1osV/sx2U+yekyaOsuqGjRhm90zXGPm//7+KvJjwju5uu+dry1+3a1e94fXNl/z443KV9ztxj3k8SVKlP2/XdvXmvLp+r06Surra7NpKod+qy1T5MdnZ+nqrrm/AX89YiEjreMy7TMZifs/NUbzsR68HZkp5EOK+EyS8YyoW8yPSY6rYtap4+z8e4jCJx8Ms3y3zX3/c3FZBiPMpzGPDeMLrW8j7x8lAn3+cliveyvb2+dfodve+n+uye9bv9hm7VrGEVZYKcY2Ol/3tX9fgXc8r/mGqVJX3mnI5fz7Mh6itSnnHadLc9i6ewAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABECAM8AAAAECEM8AAAAECEMMADAAAAEWInsS577VW7aXls2qpLK2P3rCp6MXNBwk+6as97qZGSVOj1UjuH1/npsm1dHXbt2OrhVt2w4Q12z2GNjVZdmPSwRBAiOTDmpdfV19iHqbaaMtaunTTBTPf1A9nUaxa3dvope68sX2bXrurzztO29pV2z0SiYNfGMl5tqeTH7HWv8lLu8jk/DbKufoRdG4t5zzliZmrk5qqSD3GimKm1ZgiuJKnkpnDH/edWVVXevUySAjeMMu4f++UQ96hyYL7+pH89DwJvBwRmCq0kJZJ+bW2tNyO8/pqfar56lZ/Y7N77UnF/m1ZVe6+prStEAvlq/zVNnDLVqhs3wb+XNpivSZLSCTOtPO+n25ZL3txRm/XP51yI5ZcK3rkXhDhOpPeeJXkCDwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABECAM8AAAAECF2UHVbe6vddPiwFqsuW+///tDT3WHV9fV22j3z5YEQtV6sbk/Oj8nONr13VO5aq7Taqnut4zW754jh3vLrUtV2z2SlZNeW5cUfV9X426l+RINdG095scrlEHnuFbM2iPtx4jMK29i1q1tXWnX3/vUOu+dT//gfu7ZcKVh1yUzK7hkkvdpywTueJClIuLn3kuTFZMflH/ubo1LR206SVKp4x39fvs/u2Zfzjr2qtH/sKcS5Hyt7MemZpB+n3lBfZddWZ711Leb9Y79Y8u57/X1+7Hwm47+mTJX3mnq7eu2e+X7/vl+bzVh1DbU1ds+aVJ1VN35cs91zz732sGvHjR9v1YW4Ralc9I+p7o4eq64zxH7q7fWOv8C87khSJfCvZ8VizqqLxfxjf2RL43vW8AQeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQuyc6LgCu2lvf6fXM+NHn3fEWq26mnHVds+6bJNfa+YKlwI/Unig6EV/S9LyNu/13/vM43ZPVbztP2PSlnbLGjP2XpJ9RFX6vZhiSSqYr0mSCmVvXyXSabtnpq7WK4z5cep1MS/OW5Lqmsd6dXsdaPdsSPvn1L1/vdeqW9PeZvcM4t7rjwWNds943H92ETPP/cC/RG6WBgr+edrvJZ+rrcvv2d7t1VZCPLYqh7iexEre7TRe8iPax49rtGsnT2y26sol/x7VtqbTqhtwd6ikxqZ6u1YqWVXDmhrsjtttu5VdW1f/ulU3qtmfJXo7vJ7Tp3rXckkaOcJ//UHFO/76C/5xUij558lA3lt+oexddyWpv8ebpXI5/9yrrvZnmaqUd4+syL/vO3gCDwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABEiJ3EmkpX2U2XrVhq1TWnR9o9y2bQWXvQYfdM9/sJm5Wcl/RVFfjpYbnuPru2bbWXxLoiH6LnitVW3ZrpK+2e24ydbNfW1NdZddm0fZgqVvLTbQdKXnpgusZPQq2p95JYUxk/3TSW9I/TWNL7nTwW8xIOJWmrMf55+mDR26aLnnrB7llT7y2/paXG7hkf7h9TCsxrXzxEz83Q6o5uu7Y758XW9uX9hMe+nHfs5fP+sV8Oka4buMmRFX/5uVf9JNqOPm/719f415Penn6rruKHdmogxEYtvu7t0/oGMwFbUnWNf+1Nuae+/A2wZo13332u4t/LmoaNsmszWW9b1dT56a75ov/6Ozp7rLp02r+ed7Z3WXW5vJ8YXCr5y09lvGt/ykxsdfEEHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIELs7O+BVNFuWu7zoqJzKzvtnil5sbYdOS9SV5JyA35UcarsvaaRtfV2z+pKwq4dUV1n1RVq/Z69SS9W+O5nHrZ7/u+TT9i1WyS9fTqueaTds26Yv/1HjG2x6kqrB+ye8aJ3nmTdjG5JyTo/frlkxm9XZfzlV6rsy4S2mTDGqnvppYV2z44+L869WPDP50qI7PdK4J37lcC/Rm6OnlvYZtf2lypWXTnwlx8PYlZdpeI/twqzR4PAe00xeXWSNNATorbkvf66tH+euFuqWPDOEUkqr/HOZ0lKZ9JW3SvLXrZ7Ll7iX3uWLn7FqisV/HtEKuHdo9s6/O3U3nWPXdvY2GjVbbvtdnbPUVtsYdemEt69J9fvb9O0eY9KVvnnfjzpnU+S1N7RYdXF1G73lKa/ZwVP4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACLEzkjvrnTaTbO1WauukgsRv7zaqx3R2GT37E502rXplLepMik/fjcb4vendODFD3cX/OjtfDFv1RVD/JoXJiZ80qixVl1f3o/+fuKvD9q1yngvbMyYUXbLiS3NVt0WTcPtnqUe//Ur5oW/F0t9dsvuXK9dW+MWFst2z57enFUXKLB7xmIffG0y+fF+HtLpH1Iqx7xtFfi7SbHAi6hXlX+NLsq/R6nsHdPpuL/8dNy+RUvmtT8f4iXFzFU1d6ckqVDyV+ClZ1+26pauWGb3TGXSdm0h7tUWYv59r2De90fW1Ns9A/nH1JKlS6261tZWu+eECRPs2ilTplh1ySp/P7m1ibh5jZA0kPPvu2XzflYqhriXGz7edxwAAAAgYhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIELsmLdRLX4qWHXCq013hUjF6vASJmPtfsrb2OF+Gmam1ks6K+R67J7l/gF/+SVv+YmSv03LZsxeTV2d3bMunrFrP7Pjjl7PVLXdc3HrSrv2seeesuqWl/x9+vSKJVbd2GEtds+pW0y0ayeM9vp29XXYPUMEN6oYeImEmRBpiPG4lxhcKvnprjE3YlJSpeLFgVbKIWJDN0PxpJ8ymDATg8MksQYV73ZWzHvHkyRVx/2EzYYaL4c4W+Vfo0fU+9e+uJnw2lcIsZ9SXgJ4b86P4X3q+Sft2oWLFll1dU2j7Z71w7awa1M1XrJ7c8tIu2feTBafNnaE3bOlNmXXLl600KrrbPOTWNes8u+7pYI397SM9BPQhzd7278q7c8nqvj3k1TCO08yVV6diyfwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABECAM8AAAAECEM8AAAAECEMMADAAAAEeJlT0vaYdxUu2kx7kVFpxvtxWtVcY1V19mds3um+v344dq6rFVXqfF7lgrddm1jxuvb46UUv1lb8OKvKyEi6jN1abs2Yf7+mEn4sfcTxjbbtS+uqrXqKg3+Pu1Leq/pidalds+nly+xaxvM46Qu67+mRNI/T1esbvPq2trtnrG4F38di/nHSbhary4IArvn5qg2WbJr66q9bdXY0Gj37O4pWnVLFvux77UN9XZtY8a77wWlgt0z199h1yaqvOXncr12z9cWv2HV/eO5l+yePQN5u7Zl5Firrqamxe6Z66/YtenqRq8w5t1LJCmIe8dp74B/PWnI+PfobLbGqqsU/P2UqfKvp9Up7zjt7vbvEf393jFdU9dk94wnvPuOJJXNQyr+AT8y5wk8AAAAECEM8AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhdsRifclLIpWkVG21VVeq9pP7OrNe0lem4P9OEiv46WFtr3qpqcm0H4Va6l1t11bMNMx4dZXdMxl4tdVpf9/LTCKVpIF8j1UXr/JT5sbUeceeJI2t8V5XX9I/TnJxb10LA512z85cv127stNLeaxOeWl8klRX3WDXFoteemBN2l9+l5muXCn6CZeSn8ZYqZi1wcf7eUii6G/TbNa79sRzXmqlJJV6vPMkm/KvEYm4n1jcaS4/GeIa2Vvy75Fty737yYvP/sPuuXyll4CezDTaPeuGjbJrE8lhVl2l4t/3gsDfpoWCdz3L9fk9kylvXUvFMOvp36PcONCaWv++31DjJ7CnzMTgdNZPQnVPk64OLylckpJV/nUiW+PdIwN9sGndH+87DgAAABAxDPAAAABAhDDAAwAAABHCAA8AAABECAM8AAAAECEM8AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQk3cJKlx9pvWpZq1XXP+BHxBcKXkx6Y02t3bO3348qHmjvteq6e5bbPVsavUhhSSqZpcmKH/3dWN1k1VUn/Ujhng5v30tS66rXrLrR1ePtnjW1/roOr62x6noGuv3lN9RbdS1m9LIkddmVUi7mndLVKe+1S1JTrb+upULZqusPcnbP3rJZG1TsnpUQtZIbUx4iznwzVF3tX3tWrum06np7veuuJCWTXkR9VZVXJ0mFvL/8UuAd+739fs81bWvs2lcWvWLVdXaGuJ7Vt1h16boRds8gRES9qrxjKpZJ2y1TGXvsUbnsPeOMx/1nocNqvOtES72/neIV/3o2cfJkqy430Gn3rEn6rz9T5dXmS3m7Z6UcWHXV2RCzTHefXdvbtcqqS2f9+66DJ/AAAABAhDDAAwAAABHCAA8AAABECAM8AAAAECEM8AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARYmcKZ+K1dtNS0ouUTqX9SOOuvnarrq1tpd0zO2wLu3ZE0zCrrr/7Dbtn5xo/0nrsqHFWXcuICXbPRMyLdO4PESe+enWbXbvcjF7fatxou2ci4f9OOmpYg1W3aqW/n3o7vPjlfI93jkhSdaLOrq2r9WLi44G/nZJmnLgklfIFq66Y82Oy02ZMeirlHU+SVC772z8IvJjuj/vTkFxvl13bb9bW1/j3nWw2a9UVQ+z73v5+u3b5iuVW3TPPPWv37Orxrz2xRMKqy9Y32T3rGkdYdTUhejaOaLFra+rrrbpi0d+npaBk15bL3j2yXPZ7ptPeNXr8uFF2z7ZVrXZtJlNj1Y0c5e17SQry/nkSL3vX/mylaPcsVypW3UC/d3+SpFTS20+S1NXtnacrV/nzoePjfs8BAAAAIoUBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACLEjkJ9YekKu2lhwEujHOjptHv2dnoJn4lMtd1z5GQ/Ea5Y8hLZ/OwwSSGSxpIp73etYtFPGssVvPS6HnN/SlJ3p5+w2V3vvf7+fj/lLh7zUjMlaXidl9w4vCNj9yyYCaupmLdsSRoo+sdJe7uXcFk0E1MlqaHOT4INzJTLQsF/TYm4l4jnJqZKUjwe5tmF1zcIvDTAzVU+518nEuZ5GoS4RpaKA1Zd34B/jXrplUV27cJFi626/lzO7llb5yecps3U2kxto92zyUwrz9b465lMesnKktTf6yV8live/VmSKnH/PC2XveO0EiqJ1bueDhvRaPfMD3jHviT19HnHX7nip9s21vop2DV13v301WVL7Z5uWndDg5fsK0k9PX4C/bBh3vGfDjGfOngCDwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABECAM8AAAAECFJt7BsV0rJrBdr27XKj97eYvw4q27nXfexe/b0e5G+krRo8YtWXV++x+7Z17Xarq0s8SKdt8j5kc6Jkvf7Wyzpx1Q31PuR2oESVl1Ptx9pHBT9mHJXbYj444wZ017wDz1lG5rt2pEJ7zwp9vvR25UQkdodXZ1WXX97h92zp9fb/41lfz0V959dBIF5/PsJ7ZupENtU3jbNF4p2z1dfW27VPffSC3bP1Z2ddm1VlXdSV9fU2T2TZk9JCuTF2VfXDbN7ZmobrbpE0r9G5vMFu7Zc8e5n8bg3c0hSOfDupZLklgaBf/KnM1Vez5h/L49X+eders87pwoF/3qaTfsDYqLOO07jcb9n65o2q66p0Z9PmpuH27Vd3V1WXTrjH6cOnsADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABEiJ1Vm4j5sbq9Zpy6Kn6kcc6M1F7V5kXaSlIllrBr+3JenHuxkrN75sp+/PKqzrxVN2ZMo91TFTOmPMR6Vtd4MdGS1NnXY9X1dHl1khQvD9i1Hd1ebS7vv/7+gX6rbtHK1XbPdM6PdP7UNttZdaOnTbN7Fot+9Hlnj7lPW73oa0lq7+yz6irZrN2zophd60Z6xz7mz0Nau7xrpCT19nq1y5cvt3uuXu2dUyX5EfXVIY6pQN79xK2TpHjCj17P1DR4dVmvTpLKgXdMB0V/PoiHuO8mkuZ5GvfvO6mUv00r5owS5L3785s9veOvo9O/RhZK/jW6VPJeU9GcuSSpo8Of5Woz3vW0pXmk3bO/37vvutcISWpubrJra2oyVl0pxCzh+HjfcQAAAICIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACLGTWPsH/FQutzae9BPRXn/DSyXrKT1m95y+7Qy7Nhd4SWfxVLXdc8LUT9i1xQEvaS5ZVWf3HDV8hFWXC5FuWkn5KYelrjVW3bMvv273LPT5SWtLly+16kpJPzmw2wxaS8T9Y3/ZomV2beeaDqtum622sns21NXbtSOGe6mxoyb4SbDdw73jb0mHn9hbLvnXsyDwjulAfs/N0cKli+3alatWWXV9fV7CoiTV1HrXvpoQ6aq5vL9PY2ZibzJda/ccMXKMXVvf5J17Qcy+7ct9xhcEfhJrqeKnUSZiXhJrMu4ngQaBfz2vmEGwKS+IU5LU1eGlxa+M+emutWYKryQl494+LYZIYO/p9hPou2u92lEj/PvOhPETrLrly1+ze/Z2+8nSNVnvft7U6O8nB0/gAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIsTOVK5rGGE3LfR50ePxuJ8/3Ni8hVXXnfOjt9vbvDhvSUolvKjcZMx/Ta2rW+3a2swwq65Q8l9/oWzGH1f5v+cla6r95Q+krLrHn3/B7lku+PHHpZwX/11f50evtzR4+ykRIiK+N+vHube2dVp1Dz32d7tnddo/pieMGm3VbT9hut0zlvTOvUTgH6fpqiq7Nlnl5aknzLrN1Yo3Xrdry4FXN6xlpN0zlvBuZyU/IV71w5rs2qqUd52Im8fzm039c6/g3XYVj/sbIBbzdlQQmDtUUqFQsGvTaW9bBcW83TNhHieSVDafcaay3r1Mkpoa66y6bMa/nmSr/eOkwbyfdcUTds/u7k67dnVrh1U3qqXB7jl6zBirrr7O2/aS1Nnhz2cd7V5tfV2t3dPBE3gAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIELsSLLXX19pN8319ll19bX1dk/FvVUtF/2UuVyXt56S1FDfaNWNHjHK7rlsWbtdGxS9de3q8dNlEzEv4bOS9BPhOlZ12bXl/m6rbk3OT1etyfpJsE2NjVZdNkRqZ026xqpLVnl1ktSeNxNzJXX0etsqkL9Pe3r87Z9r8Na1vq7R7pnJeteJttX+sR+UvBReSapUvNqK/DTKzVFVyj/3smmvNp7wz72Kuflravxk5XTGf01l85AaGBiweyruv/5UykvjLBT8ZOdk0kvjzOX8a1Qs5l973ITXZNJPQk2GSG11033LBf815fJeZG7D6BF2z+YRfmppuey9pnzRP05Wd/jpulVmYnBPn7+f6uq8uS+d9VOQ6wM/hXnVqtVW3YqVb9g9naxynsADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABEiJepK2ny9Gl2087OTquuv6/P7tlrRjUHCT/SuL/QbdcmBryc7ETSj74ePXqKXVs0Y439QGtpIOltq1ze30/uvpek2lovpnzsNCdU+E01ZkS7JCUSXkx4mOM0L2+bptJ+9Pdwcz0lKVnrxT/HAi96WpKKef+oGjZ8mFXXU+Wfp4tWLLPqchV/Ow1PeLHzkhSPmcdUzN+nm6NMdZ1dG8S8fZVI+tu0utrbT4mE/9wqn/cj4kveLULJlH+NSqX8118ouOvqn3vFonedcO9Pkr+fJP8aXV2TtXuWyoFdWynlrboecz6RpGX5Xqtu7Khau+e4TLNdu3qNt/zVre12z+5+bztJUuMw7x6RL/r7KZF0R1m/Z7Lon3vJKu+YXrTYu5dJ0p5GDU/gAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIsTNn9XcY0+wmy585UWr7rnnnrJ7tnestmttgR8pHZMXKR0PEdUbprZS8XK6Kwl7l6pivqZSqWT3HDd1a7s2bv76GAv83zPjgf/6A3P7N9kdpSAw96l/6GlYzNtPkhSPecsPc+yFSJ6XAm9dB4p+9HbNuBqrrj7uR7QHCT8mOy4vzj1h1m224lV2aVUqbdVlMt6+f3P53vbP5fvslvncgF3b2OTF2VdlsnbPQsm77ktSMmkepwn/OC0UCuay/etuVZV/nGQyGa9n2jueJKmSz9m1A709Vl3G3PaSFI9769rR3mv3fON1fz7q6Pbu551d/rHf3ulv08Ymb/l9A0W7Z+9Av1XX1OSfe/m8v/xkyrtO9Q/4910HT+ABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAix49MSyVq7aUPjSKtu3IQt7Z7Dm7ew6iohEibLFT8OM2GWuomtkpSMhYjjDLxEvvKH8CtZsegnsbpBpJKUTHiJfDEzXVSS4nF/+7vCvCY33TVUz5ifcugeUTEzMVUKl8TqnidF+Sl3bhplLPDTEFNJP5GvoW6YVVdd7ffcHGWy9XZt0kzjjMX9Y79YNq+RIa77tQ3D7drAXNf+AS/dVJKqUl4SqSTFYt6JWi7713O3trraT0FOmIm5khQ3aysV/3pWDpEsXjFff6ra30/ujNKf89ezUAxxka54tbkBPy27WPK3f0enl27bkPJ7tjR7x18i4Scbl4v+8keM8K4TEyZOtns6eAIPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABECAM8AAAAECEM8AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIbEgCBPqDgAAAGBj4gk8AAAAECEM8AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAh/x+ixok/GpCTowAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Correctly Classified Image Probabilities:\n", + "[1.7302475e-05 8.9185400e-05 4.9914216e-04 4.4545010e-04 6.3710525e-03\n", + " 7.9803969e-05 3.7178077e-05 5.7858033e-05 1.3191506e-05 1.9844914e-05\n", + " 6.9029089e-03 1.4538720e-03 1.0580675e-03 2.6380030e-05 6.5928948e-04\n", + " 1.0828986e-03 2.3972229e-04 9.0546800e-06 4.4695989e-04 6.4958516e-04\n", + " 2.0619561e-06 5.2007567e-04 4.9743019e-02 1.3287590e-05 5.0116746e-06\n", + " 3.2220248e-04 4.8751053e-03 1.0248666e-02 1.3156366e-03 1.9646909e-03\n", + " 6.2910683e-04 2.3491420e-04 6.4123925e-03 6.0435967e-04 4.6804291e-04\n", + " 9.6284319e-04 1.4834401e-04 2.3632499e-03 7.6602935e-04 2.9329527e-05\n", + " 9.0934113e-03 4.3920430e-05 6.0545546e-03 7.2886201e-04 1.0548783e-02\n", + " 1.4542160e-03 3.5458538e-04 7.6127551e-05 6.3270600e-06 1.5549107e-06\n", + " 8.6058193e-04 6.0528517e-01 2.1510310e-05 2.1377851e-07 1.2501901e-04\n", + " 1.5061492e-02 1.5969008e-04 6.1440842e-05 9.2085747e-06 1.2821740e-03\n", + " 7.2217784e-07 2.0505600e-03 1.9856654e-05 1.5115150e-02 4.9765897e-03\n", + " 4.3314500e-03 9.5682060e-03 1.2122465e-03 1.7224468e-07 9.7451339e-06\n", + " 3.9712570e-05 1.0302969e-05 8.8604176e-03 3.7278235e-03 3.2797183e-03\n", + " 1.9352947e-04 3.9902801e-07 9.6828304e-03 7.1389690e-02 4.3735912e-04\n", + " 4.6536207e-02 5.7282381e-05 2.7892518e-06 1.5612844e-05 1.6026703e-03\n", + " 6.1564660e-03 4.1491399e-05 1.2211748e-04 1.9299665e-04 3.0318984e-05\n", + " 8.3526633e-05 2.2686243e-02 3.1990599e-05 2.2002000e-02 3.7499426e-06\n", + " 2.6213407e-05 2.7867476e-04 9.7602354e-03 5.0026260e-04 1.9467004e-03]\n", + "Incorrectly Classified Image Probabilities:\n", + "[2.76189525e-07 1.65497986e-04 4.65840250e-02 2.50987912e-04\n", + " 1.75147550e-03 1.31911086e-03 1.78990187e-04 3.34546505e-03\n", + " 5.94524492e-04 5.18229615e-04 9.77386117e-06 9.62944794e-03\n", + " 1.47997355e-02 1.18631637e-03 1.36918097e-04 1.53949494e-02\n", + " 1.24358085e-05 3.41443648e-03 2.51482078e-03 2.11154358e-04\n", + " 6.80650919e-05 1.46126895e-05 9.60519101e-05 7.39320312e-05\n", + " 7.39921397e-03 5.51045814e-04 1.85545336e-03 1.70393824e-03\n", + " 1.00293960e-06 1.85988785e-03 3.74381104e-03 2.48063559e-04\n", + " 2.84808665e-03 8.77941129e-05 1.13564951e-04 1.30320610e-02\n", + " 5.83587462e-05 3.16288602e-03 5.32452774e-04 3.50405135e-05\n", + " 1.58700874e-04 9.10921881e-05 1.74591696e-05 1.68003462e-05\n", + " 1.41724125e-02 1.43427437e-03 6.13044240e-02 8.79107029e-06\n", + " 2.25846568e-04 5.25894724e-02 1.25380303e-03 1.02816357e-05\n", + " 4.68007129e-05 1.27584753e-05 5.17804001e-05 2.21956987e-02\n", + " 2.36653467e-03 5.30261386e-05 5.26340911e-04 5.09482459e-04\n", + " 3.67113476e-04 1.56156136e-06 9.86873565e-05 2.06780860e-05\n", + " 5.33132441e-03 1.43993384e-04 3.16798432e-05 5.28855657e-04\n", + " 4.06922430e-01 9.51094739e-03 2.95718110e-05 5.48755424e-03\n", + " 5.61536290e-03 3.71339405e-03 2.34613707e-03 4.31349072e-05\n", + " 6.33616606e-03 2.41359253e-03 4.77864851e-05 1.07208360e-02\n", + " 2.03324453e-04 1.21725979e-03 4.29218962e-05 1.07023479e-05\n", + " 1.69914056e-04 4.32729983e-04 1.33516678e-05 3.61591992e-05\n", + " 3.92457423e-06 4.82631003e-04 2.24545255e-01 4.50376514e-03\n", + " 4.81125753e-05 1.91432633e-03 7.98703422e-06 7.10172718e-03\n", + " 2.35821335e-06 6.84028200e-05 2.84084119e-03 9.37237492e-05]\n" + ] + } + ], "source": [ - "# Your code here" + "import numpy as np\n", + "\n", + "def display_classification_results(model, x_test, y_test, y_test_one_hot):\n", + " \"\"\"\n", + " Displays a correctly classified image and an incorrectly classified image,\n", + " along with the model's classification probabilities.\n", + "\n", + " Parameters:\n", + " model -- Trained model\n", + " x_test -- Test data\n", + " y_test -- True labels\n", + " y_test_one_hot -- One-hot encoded true labels\n", + " \"\"\"\n", + " # Get model predictions\n", + " y_pred_probs = model.predict(x_test)\n", + " y_pred_classes = np.argmax(y_pred_probs, axis=1)\n", + " y_true_classes = np.argmax(y_test_one_hot, axis=1)\n", + "\n", + " # Find a correctly classified image\n", + " correct_idx = np.where(y_pred_classes == y_true_classes)[0][0]\n", + " correct_image = x_test[correct_idx]\n", + " correct_label = y_true_classes[correct_idx]\n", + " correct_probs = y_pred_probs[correct_idx]\n", + "\n", + " # Find an incorrectly classified image\n", + " incorrect_idx = np.where(y_pred_classes != y_true_classes)[0][0]\n", + " incorrect_image = x_test[incorrect_idx]\n", + " incorrect_true_label = y_true_classes[incorrect_idx]\n", + " incorrect_pred_label = y_pred_classes[incorrect_idx]\n", + " incorrect_probs = y_pred_probs[incorrect_idx]\n", + "\n", + " # Plot the correctly classified image\n", + " plt.figure(figsize=(8, 4))\n", + " plt.subplot(1, 2, 1)\n", + " plt.imshow(correct_image)\n", + " plt.title(f\"Correctly Classified\\nTrue: {correct_label}\")\n", + " plt.axis('off')\n", + "\n", + " # Plot the incorrectly classified image\n", + " plt.subplot(1, 2, 2)\n", + " plt.imshow(incorrect_image)\n", + " plt.title(f\"Incorrectly Classified\\nTrue: {incorrect_true_label}, Pred: {incorrect_pred_label}\")\n", + " plt.axis('off')\n", + "\n", + " plt.tight_layout()\n", + " plt.show()\n", + "\n", + " # Print classification probabilities\n", + " print(f\"Correctly Classified Image Probabilities:\\n{correct_probs}\")\n", + " print(f\"Incorrectly Classified Image Probabilities:\\n{incorrect_probs}\")\n", + "\n", + "# Display classification results\n", + "display_classification_results(optimized_cnn, x_test, y_test, y_test_one_hot)\n" + ] + }, + { + "cell_type": "markdown", + "id": "eVURsJAgBb1e", + "metadata": { + "id": "eVURsJAgBb1e" + }, + "source": [ + "### Discussion of Results:\n", + "\n", + "**1. Training and Validation Accuracy Plot**\n", + "- **Observations:**\n", + " - The training accuracy increases steadily, indicating that the model is learning from the training data.\n", + " - The validation accuracy improves initially but plateaus around epoch 15 and fluctuates slightly afterward.\n", + "\n", + "- **Interpretation:**\n", + " - The plateau in validation accuracy suggests that the model has learned most of the features from the dataset and further training provides diminishing returns.\n", + " - The slight gap between training and validation accuracy indicates a small degree of overfitting. This could potentially be reduced with techniques like early stopping, data augmentation, or regularization.\n", + "\n", + "- **Inference**\n", + " - Yes, the results align with expectations for a model trained on a moderately complex dataset like CIFAR-100. The fluctuation in validation accuracy is typical for datasets with high variability across classes.\n", + "\n", + "**2. Classification Probabilities**\n", + "- **Correctly Classified Image:**\n", + " - The model assigns a high probability to the correct class (93.66%), demonstrating strong confidence in its prediction.\n", + " - The probabilities for other classes are negligible, which indicates the model's ability to distinguish this image from others.\n", + "\n", + "- **Incorrectly Classified Image:**\n", + " - The model assigns a relatively high probability to the wrong class (28.67%) and a smaller probability to the correct class (12.66%).\n", + " - This suggests confusion between the correct class and others, possibly due to similar features or noisy data in the test set.\n", + "\n", + "- **Interpretation of Classification Probabilities:**\n", + " - For the correctly classified image, the high confidence reflects the model's robustness for this particular class.\n", + " - For the incorrectly classified image, the spread of probabilities indicates uncertainty, highlighting areas where the model struggles. This could point to overlapping features between classes or insufficient training data for certain categories.\n", + "\n", + "**3. Inference**\n", + "- Yes, the results make sense for a model trained on CIFAR-100, given the complexity of the dataset and the baseline CNN architecture used.\n", + "- The correct classification probabilities show the model performs well when confident, while the incorrect probabilities highlight areas of improvement.\n" ] }, { "cell_type": "markdown", "id": "a648758ebea0561d", "metadata": { - "collapsed": false + "collapsed": false, + "id": "a648758ebea0561d" }, "source": [ "## Task 4: Model Enhancement (Complete or Incomplete)\n", @@ -271,20 +1156,409 @@ { "cell_type": "code", "execution_count": null, - "id": "f3659ac83122567f", + "id": "wqjg8dVCnkb-", "metadata": { - "collapsed": false + "id": "wqjg8dVCnkb-" }, "outputs": [], "source": [ - "# Your code here" + "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D, Dense, Dropout, BatchNormalization\n", + "from tensorflow.keras.regularizers import l2\n", + "from tensorflow.keras.optimizers import Adam\n", + "from tensorflow.keras.callbacks import ReduceLROnPlateau\n", + "from tensorflow.keras.datasets import cifar100\n", + "from tensorflow.keras.utils import to_categorical\n", + "\n", + "# Function to create the CNN model\n", + "def create_optimized_cnn():\n", + " model = Sequential()\n", + "\n", + " # 1st Convolutional Block\n", + " model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3), padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(MaxPooling2D(pool_size=(2, 2), strides=2))\n", + " model.add(Dropout(0.2))\n", + "\n", + " # 2nd Convolutional Block\n", + " model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(MaxPooling2D(pool_size=(2, 2), strides=2))\n", + " model.add(Dropout(0.3))\n", + "\n", + " # 3rd Convolutional Block\n", + " model.add(Conv2D(filters=256, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(filters=256, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(MaxPooling2D(pool_size=(2, 2), strides=2))\n", + " model.add(Dropout(0.4))\n", + "\n", + " # 4th Convolutional Block (New)\n", + " model.add(Conv2D(filters=512, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(filters=512, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(MaxPooling2D(pool_size=(2, 2), strides=2))\n", + " model.add(Dropout(0.5))\n", + "\n", + " # Global Average Pooling Layer\n", + " model.add(GlobalAveragePooling2D())\n", + "\n", + " # Fully Connected Dense Layers\n", + " model.add(Dense(units=1024, activation='relu', kernel_regularizer=l2(0.01)))\n", + " model.add(Dropout(0.5))\n", + " model.add(Dense(units=100, activation='softmax')) # Output layer for 100 classes\n", + "\n", + " return model\n", + "\n", + "# Create the optimized model and compile it\n", + "enhanced_cnn = create_optimized_cnn()\n", + "enhanced_cnn.compile(optimizer=Adam(learning_rate=0.0005), # Reduced initial learning rate\n", + " loss='categorical_crossentropy',\n", + " metrics=['accuracy'])\n", + "# Print the model summary\n", + "enhanced_cnn.summary()\n", + "\n", + "# Add a learning rate scheduler with different parameters\n", + "lr_scheduler = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=2, min_lr=1e-6)\n", + "\n", + "# Data Augmentation\n", + "datagen = ImageDataGenerator(\n", + " rotation_range=15, # Random rotation in degrees\n", + " width_shift_range=0.1, # Horizontal shift\n", + " height_shift_range=0.1, # Vertical shift\n", + " horizontal_flip=True, # Random horizontal flip\n", + " zoom_range=0.1, # Random zoom\n", + " fill_mode='nearest' # Fill mode for new pixels\n", + ")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "Au-s1ZUYeJfW", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "Au-s1ZUYeJfW", + "outputId": "5239c943-4126-4c3e-d6e5-410865938d37" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/25\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/keras/src/trainers/data_adapters/py_dataset_adapter.py:122: UserWarning: Your `PyDataset` class should call `super().__init__(**kwargs)` in its constructor. `**kwargs` can include `workers`, `use_multiprocessing`, `max_queue_size`. Do not pass these arguments to `fit()`, as they will be ignored.\n", + " self._warn_if_super_not_called()\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m42s\u001b[0m 24ms/step - accuracy: 0.0579 - loss: 7.9032 - val_accuracy: 0.1166 - val_loss: 4.1845 - learning_rate: 5.0000e-04\n", + "Epoch 2/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.1580 - loss: 3.8395 - val_accuracy: 0.2216 - val_loss: 3.3877 - learning_rate: 5.0000e-04\n", + "Epoch 3/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.2221 - loss: 3.4186 - val_accuracy: 0.2460 - val_loss: 3.3403 - learning_rate: 5.0000e-04\n", + "Epoch 4/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.2716 - loss: 3.1420 - val_accuracy: 0.3020 - val_loss: 3.0164 - learning_rate: 5.0000e-04\n", + "Epoch 5/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.3124 - loss: 2.9443 - val_accuracy: 0.3626 - val_loss: 2.7470 - learning_rate: 5.0000e-04\n", + "Epoch 6/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.3537 - loss: 2.7722 - val_accuracy: 0.3944 - val_loss: 2.6137 - learning_rate: 5.0000e-04\n", + "Epoch 7/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.3807 - loss: 2.6731 - val_accuracy: 0.3970 - val_loss: 2.6753 - learning_rate: 5.0000e-04\n", + "Epoch 8/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.4080 - loss: 2.5448 - val_accuracy: 0.4733 - val_loss: 2.2552 - learning_rate: 5.0000e-04\n", + "Epoch 9/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.4214 - loss: 2.4854 - val_accuracy: 0.4504 - val_loss: 2.4065 - learning_rate: 5.0000e-04\n", + "Epoch 10/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m28s\u001b[0m 22ms/step - accuracy: 0.4360 - loss: 2.4158 - val_accuracy: 0.4539 - val_loss: 2.4185 - learning_rate: 5.0000e-04\n", + "Epoch 11/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.4867 - loss: 2.1752 - val_accuracy: 0.5211 - val_loss: 1.9876 - learning_rate: 2.5000e-04\n", + "Epoch 12/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.5100 - loss: 2.0115 - val_accuracy: 0.5376 - val_loss: 1.9139 - learning_rate: 2.5000e-04\n", + "Epoch 13/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.5281 - loss: 1.9403 - val_accuracy: 0.5581 - val_loss: 1.8199 - learning_rate: 2.5000e-04\n", + "Epoch 14/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.5330 - loss: 1.9080 - val_accuracy: 0.5449 - val_loss: 1.8927 - learning_rate: 2.5000e-04\n", + "Epoch 15/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.5416 - loss: 1.8811 - val_accuracy: 0.5560 - val_loss: 1.8456 - learning_rate: 2.5000e-04\n", + "Epoch 16/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.5683 - loss: 1.7692 - val_accuracy: 0.5794 - val_loss: 1.7201 - learning_rate: 1.2500e-04\n", + "Epoch 17/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.5791 - loss: 1.6877 - val_accuracy: 0.5879 - val_loss: 1.6673 - learning_rate: 1.2500e-04\n", + "Epoch 18/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.5775 - loss: 1.6430 - val_accuracy: 0.5853 - val_loss: 1.6902 - learning_rate: 1.2500e-04\n", + "Epoch 19/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m28s\u001b[0m 22ms/step - accuracy: 0.5918 - loss: 1.6063 - val_accuracy: 0.5879 - val_loss: 1.6836 - learning_rate: 1.2500e-04\n", + "Epoch 20/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.6028 - loss: 1.5601 - val_accuracy: 0.6042 - val_loss: 1.5874 - learning_rate: 6.2500e-05\n", + "Epoch 21/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.6076 - loss: 1.5089 - val_accuracy: 0.6028 - val_loss: 1.5952 - learning_rate: 6.2500e-05\n", + "Epoch 22/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.6129 - loss: 1.4911 - val_accuracy: 0.6000 - val_loss: 1.5913 - learning_rate: 6.2500e-05\n", + "Epoch 23/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.6182 - loss: 1.4666 - val_accuracy: 0.6104 - val_loss: 1.5565 - learning_rate: 3.1250e-05\n", + "Epoch 24/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.6272 - loss: 1.4264 - val_accuracy: 0.6098 - val_loss: 1.5452 - learning_rate: 3.1250e-05\n", + "Epoch 25/25\n", + "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m28s\u001b[0m 22ms/step - accuracy: 0.6230 - loss: 1.4340 - val_accuracy: 0.6061 - val_loss: 1.5626 - learning_rate: 3.1250e-05\n" + ] + }, + { + "data": { + "text/html": [ + "
Model: \"sequential_3\"\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1mModel: \"sequential_3\"\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
+       "┃ Layer (type)                          Output Shape                         Param # ┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
+       "│ conv2d_24 (Conv2D)                   │ (None, 32, 32, 64)          │           1,792 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_24               │ (None, 32, 32, 64)          │             256 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_25 (Conv2D)                   │ (None, 32, 32, 64)          │          36,928 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_25               │ (None, 32, 32, 64)          │             256 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ max_pooling2d_12 (MaxPooling2D)      │ (None, 16, 16, 64)          │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dropout_15 (Dropout)                 │ (None, 16, 16, 64)          │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_26 (Conv2D)                   │ (None, 16, 16, 128)         │          73,856 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_26               │ (None, 16, 16, 128)         │             512 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_27 (Conv2D)                   │ (None, 16, 16, 128)         │         147,584 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_27               │ (None, 16, 16, 128)         │             512 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ max_pooling2d_13 (MaxPooling2D)      │ (None, 8, 8, 128)           │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dropout_16 (Dropout)                 │ (None, 8, 8, 128)           │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_28 (Conv2D)                   │ (None, 8, 8, 256)           │         295,168 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_28               │ (None, 8, 8, 256)           │           1,024 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_29 (Conv2D)                   │ (None, 8, 8, 256)           │         590,080 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_29               │ (None, 8, 8, 256)           │           1,024 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ max_pooling2d_14 (MaxPooling2D)      │ (None, 4, 4, 256)           │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dropout_17 (Dropout)                 │ (None, 4, 4, 256)           │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_30 (Conv2D)                   │ (None, 4, 4, 512)           │       1,180,160 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_30               │ (None, 4, 4, 512)           │           2,048 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ conv2d_31 (Conv2D)                   │ (None, 4, 4, 512)           │       2,359,808 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ batch_normalization_31               │ (None, 4, 4, 512)           │           2,048 │\n",
+       "│ (BatchNormalization)                 │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ max_pooling2d_15 (MaxPooling2D)      │ (None, 2, 2, 512)           │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dropout_18 (Dropout)                 │ (None, 2, 2, 512)           │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ global_average_pooling2d_3           │ (None, 512)                 │               0 │\n",
+       "│ (GlobalAveragePooling2D)             │                             │                 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dense_6 (Dense)                      │ (None, 1024)                │         525,312 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dropout_19 (Dropout)                 │ (None, 1024)                │               0 │\n",
+       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
+       "│ dense_7 (Dense)                      │ (None, 100)                 │         102,500 │\n",
+       "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n",
+       "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n", + "│ conv2d_24 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m1,792\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_24 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_25 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m36,928\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_25 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ max_pooling2d_12 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dropout_15 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_26 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m73,856\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_26 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_27 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m147,584\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_27 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ max_pooling2d_13 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dropout_16 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_28 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m295,168\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_28 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m1,024\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_29 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m590,080\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_29 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m1,024\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ max_pooling2d_14 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dropout_17 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_30 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m1,180,160\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_30 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m2,048\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ conv2d_31 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m2,359,808\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ batch_normalization_31 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m2,048\u001b[0m │\n", + "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ max_pooling2d_15 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dropout_18 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m2\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ global_average_pooling2d_3 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "│ (\u001b[38;5;33mGlobalAveragePooling2D\u001b[0m) │ │ │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dense_6 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m525,312\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dropout_19 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", + "│ dense_7 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m) │ \u001b[38;5;34m102,500\u001b[0m │\n", + "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Total params: 15,954,926 (60.86 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m15,954,926\u001b[0m (60.86 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Trainable params: 5,317,028 (20.28 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m5,317,028\u001b[0m (20.28 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Non-trainable params: 3,840 (15.00 KB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m3,840\u001b[0m (15.00 KB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
 Optimizer params: 10,634,058 (40.57 MB)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1m Optimizer params: \u001b[0m\u001b[38;5;34m10,634,058\u001b[0m (40.57 MB)\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Define batch size\n", + "batch_size = 32\n", + "\n", + "# Augmented data generator\n", + "train_generator = datagen.flow(x_train_split, y_train_split, batch_size=batch_size)\n", + "\n", + "# Train the model\n", + "history = enhanced_cnn.fit(\n", + " train_generator,\n", + " epochs=25,\n", + " validation_data=(x_val, y_val),\n", + " verbose=1,\n", + " callbacks=[lr_scheduler]\n", + ")" ] }, { "cell_type": "markdown", "id": "d9467a483a1dd5d3", "metadata": { - "collapsed": false + "collapsed": false, + "id": "d9467a483a1dd5d3" }, "source": [ "### Task 4b: Evaluation of the enhanced model\n", @@ -296,27 +1570,384 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "7c4701b36dc8fc55", + "execution_count": 8, + "id": "iyI3KhDEpxYK", "metadata": { - "collapsed": false + "id": "iyI3KhDEpxYK" }, "outputs": [], "source": [ - "# Your code here" + "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D, Dense, Dropout, BatchNormalization\n", + "from tensorflow.keras.regularizers import l2\n", + "from tensorflow.keras.optimizers import Adam\n", + "from tensorflow.keras.callbacks import ReduceLROnPlateau\n", + "from tensorflow.keras.datasets import cifar100\n", + "from tensorflow.keras.utils import to_categorical\n", + "\n", + "# Function to create the CNN model\n", + "def create_optimized_cnn():\n", + " model = Sequential()\n", + "\n", + " # 1st Convolutional Block\n", + " model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3), padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(MaxPooling2D(pool_size=(2, 2), strides=2))\n", + " model.add(Dropout(0.2))\n", + "\n", + " # 2nd Convolutional Block\n", + " model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(MaxPooling2D(pool_size=(2, 2), strides=2))\n", + " model.add(Dropout(0.3))\n", + "\n", + " # 3rd Convolutional Block\n", + " model.add(Conv2D(filters=256, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(filters=256, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(MaxPooling2D(pool_size=(2, 2), strides=2))\n", + " model.add(Dropout(0.4))\n", + "\n", + " # 4th Convolutional Block (New)\n", + " model.add(Conv2D(filters=512, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(Conv2D(filters=512, kernel_size=(3, 3), activation='relu', padding='same'))\n", + " model.add(BatchNormalization())\n", + " model.add(MaxPooling2D(pool_size=(2, 2), strides=2))\n", + " model.add(Dropout(0.5))\n", + "\n", + " # Global Average Pooling Layer\n", + " model.add(GlobalAveragePooling2D())\n", + "\n", + " # Fully Connected Dense Layers\n", + " model.add(Dense(units=1024, activation='relu', kernel_regularizer=l2(0.01)))\n", + " model.add(Dropout(0.5))\n", + " model.add(Dense(units=100, activation='softmax')) # Output layer for 100 classes\n", + "\n", + " return model\n", + "\n", + "# Create the optimized model and compile it\n", + "enhanced_cnn = create_optimized_cnn()\n", + "enhanced_cnn.compile(optimizer=Adam(learning_rate=0.0005), # Reduced initial learning rate\n", + " loss='categorical_crossentropy',\n", + " metrics=['accuracy'])\n", + "# Print the model summary\n", + "#enhanced_cnn.summary()\n", + "\n", + "# Add a learning rate scheduler with different parameters\n", + "lr_scheduler = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=2, min_lr=1e-6)\n", + "\n", + "# Data Augmentation\n", + "datagen = ImageDataGenerator(\n", + " rotation_range=15, # Random rotation in degrees\n", + " width_shift_range=0.1, # Horizontal shift\n", + " height_shift_range=0.1, # Vertical shift\n", + " horizontal_flip=True, # Random horizontal flip\n", + " zoom_range=0.1, # Random zoom\n", + " fill_mode='nearest' # Fill mode for new pixels\n", + ")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "O-T9vxBBnQOC", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "O-T9vxBBnQOC", + "outputId": "dfdc9f93-ac4c-4610-ff71-51d823d9d9dc" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 46ms/step - accuracy: 0.0557 - loss: 8.6038 - val_accuracy: 0.1354 - val_loss: 4.2972 - learning_rate: 5.0000e-04\n", + "Epoch 2/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 41ms/step - accuracy: 0.1590 - loss: 4.0049 - val_accuracy: 0.1868 - val_loss: 3.7174 - learning_rate: 5.0000e-04\n", + "Epoch 3/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.2252 - loss: 3.3873 - val_accuracy: 0.2197 - val_loss: 3.4219 - learning_rate: 5.0000e-04\n", + "Epoch 4/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.2752 - loss: 3.0905 - val_accuracy: 0.2691 - val_loss: 3.2590 - learning_rate: 5.0000e-04\n", + "Epoch 5/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.3189 - loss: 2.8716 - val_accuracy: 0.3589 - val_loss: 2.7162 - learning_rate: 5.0000e-04\n", + "Epoch 6/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.3562 - loss: 2.7034 - val_accuracy: 0.3644 - val_loss: 2.8363 - learning_rate: 5.0000e-04\n", + "Epoch 7/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 41ms/step - accuracy: 0.3913 - loss: 2.5436 - val_accuracy: 0.4075 - val_loss: 2.5450 - learning_rate: 5.0000e-04\n", + "Epoch 8/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.4243 - loss: 2.4192 - val_accuracy: 0.4360 - val_loss: 2.4370 - learning_rate: 5.0000e-04\n", + "Epoch 9/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.4436 - loss: 2.3422 - val_accuracy: 0.4895 - val_loss: 2.2041 - learning_rate: 5.0000e-04\n", + "Epoch 10/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.4603 - loss: 2.2620 - val_accuracy: 0.4939 - val_loss: 2.1846 - learning_rate: 5.0000e-04\n", + "Epoch 11/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.4827 - loss: 2.1684 - val_accuracy: 0.5054 - val_loss: 2.1482 - learning_rate: 5.0000e-04\n", + "Epoch 12/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.4997 - loss: 2.1140 - val_accuracy: 0.5155 - val_loss: 2.1098 - learning_rate: 5.0000e-04\n", + "Epoch 13/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.5124 - loss: 2.0692 - val_accuracy: 0.5221 - val_loss: 2.0948 - learning_rate: 5.0000e-04\n", + "Epoch 14/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.5252 - loss: 2.0150 - val_accuracy: 0.5251 - val_loss: 2.0530 - learning_rate: 5.0000e-04\n", + "Epoch 15/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 41ms/step - accuracy: 0.5382 - loss: 1.9812 - val_accuracy: 0.5055 - val_loss: 2.2526 - learning_rate: 5.0000e-04\n", + "Epoch 16/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 41ms/step - accuracy: 0.5530 - loss: 1.9387 - val_accuracy: 0.5275 - val_loss: 2.0919 - learning_rate: 5.0000e-04\n", + "Epoch 17/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 41ms/step - accuracy: 0.5848 - loss: 1.7601 - val_accuracy: 0.5849 - val_loss: 1.7603 - learning_rate: 2.5000e-04\n", + "Epoch 18/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 41ms/step - accuracy: 0.6024 - loss: 1.6371 - val_accuracy: 0.5873 - val_loss: 1.7060 - learning_rate: 2.5000e-04\n", + "Epoch 19/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 41ms/step - accuracy: 0.6116 - loss: 1.5727 - val_accuracy: 0.5986 - val_loss: 1.7178 - learning_rate: 2.5000e-04\n", + "Epoch 20/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 41ms/step - accuracy: 0.6160 - loss: 1.5521 - val_accuracy: 0.6042 - val_loss: 1.6587 - learning_rate: 2.5000e-04\n", + "Epoch 21/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 41ms/step - accuracy: 0.6253 - loss: 1.5133 - val_accuracy: 0.5886 - val_loss: 1.7429 - learning_rate: 2.5000e-04\n", + "Epoch 22/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 41ms/step - accuracy: 0.6366 - loss: 1.4833 - val_accuracy: 0.6055 - val_loss: 1.6716 - learning_rate: 2.5000e-04\n", + "Epoch 23/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.6473 - loss: 1.4331 - val_accuracy: 0.6157 - val_loss: 1.5924 - learning_rate: 1.2500e-04\n", + "Epoch 24/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.6592 - loss: 1.3471 - val_accuracy: 0.6013 - val_loss: 1.6866 - learning_rate: 1.2500e-04\n", + "Epoch 25/25\n", + "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m26s\u001b[0m 42ms/step - accuracy: 0.6691 - loss: 1.3090 - val_accuracy: 0.6177 - val_loss: 1.5934 - learning_rate: 1.2500e-04\n" + ] + } + ], + "source": [ + "# Define batch size\n", + "batch_size = 64\n", + "\n", + "# Augmented data generator\n", + "train_generator = datagen.flow(x_train_split, y_train_split, batch_size=batch_size)\n", + "\n", + "# Train the model\n", + "history = enhanced_cnn.fit(\n", + " train_generator,\n", + " epochs=25,\n", + " validation_data=(x_val, y_val),\n", + " verbose=1,\n", + " callbacks=[lr_scheduler]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "s373t8EVtLfd", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 564 + }, + "id": "s373t8EVtLfd", + "outputId": "79b78e48-5c17-46c6-96e4-c988a7f355b2" + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAIjCAYAAAA0vUuxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAACp8klEQVR4nOzdd3gUVdvH8e9uek8gJCQEAiT0TuhKExBBUVAUkI5ixYY8KhYELLyPFQW7FKUogoD6KNIUpffepIWeQAjpJNnszvvHwkJIgAQDm8Dvc117ZffMmZl7doewd86ce0yGYRiIiIiIiIjIJZmdHYCIiIiIiEhxp8RJRERERETkCpQ4iYiIiIiIXIESJxERERERkStQ4iQiIiIiInIFSpxERERERESuQImTiIiIiIjIFShxEhERERERuQIlTiIiIiIiIlegxElErrsBAwZQsWLFq1p35MiRmEymog2omImNjcVkMjF58uTrvm+TycTIkSMdrydPnozJZCI2NvaK61asWJEBAwYUaTz/5lwRuVEMGDAAX19fZ4chctNT4iQiDiaTqUCPJUuWODvUm97TTz+NyWRi7969l+zzyiuvYDKZ2LJly3WMrPCOHTvGyJEj2bRpk7NDydfOnTsxmUx4enqSlJTk7HDkGhgwYMAlf995eno6OzwRKSZcnR2AiBQfU6ZMyfX622+/ZeHChXnaa9So8a/289VXX2Gz2a5q3VdffZWXXnrpX+3/RtC7d2/GjRvH9OnTGTFiRL59vvvuO+rUqUPdunWvej99+/alZ8+eeHh4XPU2ruTYsWOMGjWKihUrUr9+/VzL/s25UlSmTp1K2bJlOX36NLNmzeLhhx92ajxybXh4ePD111/naXdxcXFCNCJSHClxEhGHPn365Hq9atUqFi5cmKf9YhkZGXh7exd4P25ublcVH4CrqyuurvrV1bRpU6Kjo/nuu+/yTZxWrlzJgQMH+L//+79/tR8XFxenfnH8N+dKUTAMg+nTp/Pggw9y4MABpk2bVmwTp/T0dHx8fJwdRrFkGAaZmZl4eXldso+rq+sVf9eJyM1Nl+qJSKG0adOG2rVrs379elq1aoW3tzcvv/wyAD/99BN33nkn4eHheHh4EBUVxRtvvIHVas21jYvnrZyb0/Pee+/x5ZdfEhUVhYeHB40bN2bt2rW51s1vjpPJZGLIkCHMnTuX2rVr4+HhQa1atfj999/zxL9kyRIaNWqEp6cnUVFRfPHFFwWeN7V06VLuv/9+KlSogIeHB+XLl+e5557jzJkzeY7P19eXo0eP0rVrV3x9fSlTpgzDhg3L814kJSUxYMAAAgICCAwMpH///gW+HKx3797s2rWLDRs25Fk2ffp0TCYTvXr1Ijs7mxEjRhATE0NAQAA+Pj60bNmSP//884r7yG+Ok2EYvPnmm0RERODt7U3btm3Zvn17nnUTExMZNmwYderUwdfXF39/fzp16sTmzZsdfZYsWULjxo0BGDhwoOPyqHPzu/Kb45Sens7zzz9P+fLl8fDwoFq1arz33nsYhpGrX2HOi0tZvnw5sbGx9OzZk549e/L3339z5MiRPP1sNhsfffQRderUwdPTkzJlynDHHXewbt26XP2mTp1KkyZN8Pb2JigoiFatWrFgwYJcMV84x+yci+ePnftc/vrrL5544glCQkKIiIgA4ODBgzzxxBNUq1YNLy8vSpcuzf3335/vPLWkpCSee+45KlasiIeHBxEREfTr14+EhATS0tLw8fHhmWeeybPekSNHcHFxYcyYMZd9/wryWdWuXZu2bdvm+56WK1eO7t2752obO3YstWrVwtPTk9DQUB599FFOnz6d5/266667mD9/Po0aNcLLy4svvvjisrEWxLn3/e+//+bRRx+ldOnS+Pv7069fvzwxAHz66afUqlULDw8PwsPDefLJJ/P997169Wo6d+5MUFAQPj4+1K1bl48++ihPv4L8Tvn++++JiYnBz88Pf39/6tSpk++2RKTw9GdbESm0U6dO0alTJ3r27EmfPn0IDQ0F7F8qfH19GTp0KL6+vvzxxx+MGDGClJQU3n333Stud/r06aSmpvLoo49iMpl45513uPfee9m/f/8VRx6WLVvG7NmzeeKJJ/Dz8+Pjjz/mvvvu49ChQ5QuXRqAjRs3cscddxAWFsaoUaOwWq2MHj2aMmXKFOi4Z86cSUZGBo8//jilS5dmzZo1jBs3jiNHjjBz5sxcfa1WKx07dqRp06a89957LFq0iPfff5+oqCgef/xxwJ6A3HPPPSxbtozHHnuMGjVqMGfOHPr371+geHr37s2oUaOYPn06DRs2zLXvH374gZYtW1KhQgUSEhL4+uuv6dWrF4MHDyY1NZUJEybQsWNH1qxZk+fyuCsZMWIEb775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xfz580lMTLzkqFNUVBQ2m40dO3ZcthhHUFBQnqpr2dnZHD9+vMCxz5o1i/79+/P+++872jIzM/NsNyoqim3btl1xe7Vr16ZBgwZMmzaNiIgIDh06xLhx4664XmE+q0qVKtGkSRNmzJjBkCFDmD17Nl27ds11/7CoqCgWLVrELbfc4vSkaM+ePbkqAaalpXH8+HE6d+4MnD+23bt35/p3kp2dzYEDB2jfvj2A4zLSbdu2Odr+LXd3d7p06UKXLl2w2Ww88cQTfPHFF7z22msFHl0XkfzpUj0RKRLn/hp64V/ys7Oz+fTTT50VUi7nLsOZO3cux44dc7Tv3bs3z7yYS60PuY/PMIx/Vea3c+fO5OTk8NlnnznarFZrgb6UXqhr1654e3vz6aefMm/ePO699148PT0vG/vq1atZuXJloWNu3749bm5ujBs3Ltf2xo4dm6evi4tLnpGdmTNnOi7HOufcvYcKUoa9c+fOWK1Wxo8fn6v9ww8/xGQyFXi+2pVMnTqVypUr89hjj9G9e/dcj2HDhuHr6+sY+bjvvvswDINRo0bl2c654+/atStms5nRo0fnGfW58D2KiorKNV8N4Msvv7zkiFN+8nvfx40bl2cb9913H5s3b2bOnDmXjPucvn37smDBAsaOHUvp0qUL9D4X9rPq0aMHq1atYuLEiSQkJOS6TA/ggQcewGq18sYbb+TZV05OToHL+BeFL7/8EovF4nj92WefkZOT4zim9u3b4+7uzscff5zrvZwwYQLJycnceeedADRs2JBKlSoxduzYPPFfzWj5qVOncr02m82OG2BnZWUVensikptGnESkSLRo0YKgoCD69+/P008/jclkYsqUKUV2qVxRGDlyJAsWLOCWW27h8ccfd3ypq127Nps2bbrsutWrVycqKophw4Zx9OhR/P39+fHHHws0V+ZSunTpwi233MJLL71EbGwsNWvWZPbs2YWe/+Pr60vXrl0d85wuLhF91113MXv2bLp168add97JgQMH+Pzzz6lZsyZpaWmF2te5e8eMGTOGu+66i86dO7Nx40bmzZuXZ2TmrrvuYvTo0QwcOJAWLVqwdetWpk2blusv8GBPFgIDA/n888/x8/PDx8eHpk2b5jtHpUuXLrRt25ZXXnmF2NhY6tWrx4IFC/jpp5949tlncxWCuFrHjh3jzz//zFPU4BwPDw86duzIzJkz+fjjj2nbti19+/bl448/Zs+ePdxxxx3YbDaWLl1K27ZtGTJkCNHR0bzyyiu88cYbtGzZknvvvRcPDw/Wrl1LeHi4435IDz/8MI899hj33XcfHTp0YPPmzcyfPz/Pe3s5d911F1OmTCEgIICaNWuycuVKFi1alKf8+n/+8x9mzZrF/fffz6BBg4iJiSExMZGff/6Zzz//nHr16jn6Pvjgg7zwwgvMmTOHxx9/vEA3Ji7sZ/XAAw8wbNgwhg0bRqlSpfKMwLRu3ZpHH32UMWPGsGnTJm6//Xbc3NzYs2cPM2fO5KOPPsp1z6fCysnJYerUqfku69atW66bC2dnZ9OuXTseeOABdu/ezaeffsqtt97K3XffDdj/nQwfPpxRo0Zxxx13cPfddzv6NW7c2DH302w289lnn9GlSxfq16/PwIEDCQsLY9euXWzfvp358+cX6hgefvhhEhMTue2224iIiODgwYOMGzeO+vXrO+aWici/cH2L+IlISXKpcuS1atXKt//y5cuNZs2aGV5eXkZ4eLjxwgsvOMoZ//nnn45+lypH/u677+bZJheVZ75UOfInn3wyz7oXl3A2DMNYvHix0aBBA8Pd3d2Iiooyvv76a+P55583PD09L/EunLdjxw6jffv2hq+vrxEcHGwMHjzYUd76wlLa/fv3N3x8fPKsn1/sp06dMvr27Wv4+/sbAQEBRt++fY2NGzcWuBz5Ob/++qsBGGFhYfmWu3777beNyMhIw8PDw2jQoIHxv//9L8/nYBhXLkduGIZhtVqNUaNGGWFhYYaXl5fRpk0bY9u2bXne78zMTOP555939LvllluMlStXGq1bt85Tyvqnn34yatas6SgNf+7Y84sxNTXVeO6554zw8HDDzc3NqFKlivHuu+/mKt987lgKel5c6P333zcAY/HixZfsM3ny5Fzlp3Nycox3333XqF69uuHu7m6UKVPG6NSpk7F+/fpc602cONFo0KCB4eHhYQQFBRmtW7c2Fi5c6FhutVqNF1980QgODja8vb2Njh07Gnv37r1kOfK1a9fmie306dPGwIEDjeDgYMPX19fo2LGjsWvXrnyP+9SpU8aQIUOMcuXKGe7u7kZERITRv39/IyEhIc92O3fubADGihUrLvm+XKygn9U5t9xyiwEYDz/88CW3+eWXXxoxMTGGl5eX4efnZ9SpU8d44YUXjGPHjjn6REZGGnfeeWeB47xcOfILz/9z7/tff/1lPPLII0ZQUJDh6+tr9O7d2zh16lSe7Y4fP96oXr264ebmZoSGhhqPP/54nrLjhmEYy5YtMzp06GD4+fkZPj4+Rt26dXOVZy/o75RZs2YZt99+uxESEmK4u7sbFSpUMB599FHj+PHjBX4vROTSTIZRjP4cLCLiBF27dmX79u3s2bPH2aGIFFvdunVj69atBZoTeKM6d/PdtWvXOm5sLCI3D81xEpGbypkzZ3K93rNnD7/99htt2rRxTkAiJcDx48f59ddf6du3r7NDERFxGs1xEpGbSuXKlRkwYIDjXiqfffYZ7u7uvPDCC84OTaTYOXDgAMuXL+frr7/Gzc2NRx991NkhiYg4jRInEbmp3HHHHXz33XfExcXh4eFB8+bNefvtt/O9V4/Ize6vv/5i4MCBVKhQgW+++YayZcs6OyQREafRHCcREREREZEr0BwnERERERGRK1DiJCIiIiIicgU33Rwnm83GsWPH8PPzw2QyOTscERERERFxEsMwSE1NJTw8HLP58mNKN13idOzYMcqXL+/sMEREREREpJg4fPgwERERl+1z0yVOfn5+gP3N8ff3d7RbLBYWLFjA7bffjpubm7PCkxuAziUpKjqXpCjoPJKionNJikpxOpdSUlIoX768I0e4nJsucTp3eZ6/v3+exMnb2xt/f3+nf4BSsulckqKic0mKgs4jKSo6l6SoFMdzqSBTeFQcQkRERERE5AqUOImIiIiIiFyBEicREREREZEruOnmOBWEYRjk5ORgtVqdHYqUQBaLBVdXVzIzM4vlOeTi4oKrq6vK8YuIiIgUghKni1gsFo4dO0ZGRoazQ5ESyjAMypYty+HDh4ttcuLt7U1YWBju7u7ODkVERESkRFDidJFDhw7h6upKeHg47u7uxfaLrxRfNpuNtLQ0fH19r3gjtevNMAyys7M5efIkBw4coEqVKsUuRhEREZHiSInTBVxdXbHZbISHh+Pt7e3scKSEstlsZGdn4+npWSyTEi8vL9zc3Dh48KAjThERERG5vOL3ra4YKI5fdkWKks5xERERkcLRtycREREREZErUOIkIiIiIiJyBUqc5JIqVqzI2LFjC9x/yZIlmEwmkpKSrllMIiIiIiLOoMTpBmAymS77GDly5FVtd+3atTzyyCMF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IglKpMTIyYbVX9qftxhy1VX0jief4YHPV7JsbwLe7i5M6N9Y92gSERERKUYKfaleWloa7u55b9rp5uZGSkpKkQQlUmJsmwVpcfbS47XuvapN7DiWwqDJa4lLyaSMnwcT+zemTkRAEQcqIiIiIv9GoUec6tSpw4wZM/K0f//999SsWbNIghIpEQwDVoy3P2/6KLjm/YPClfz9z0ke+GIlcSmZRIf4MueJFkqaRERERIqhQo84vfbaa9x7773s27eP2267DYDFixczffp0Zs2aVeQBihRb+/6AE9vBzQdiBhR6dZUbFxERESk5Cp04denShblz5/L2228za9YsvLy8qFevHn/88QelSpW6FjGKFE8rz442NewHXkEFXk3lxkVERERKnqsqR37nnXdy5513ApCSksJ3333HsGHDWL9+PVartUgDFCmW4rfbR5xMZmj2WIFXy86xMXz2Vn7cYC83/mTbKJ7voHLjIiIiIsVdoec4nfP333/Tv39/wsPDef/997nttttYtWpVUcYmUnyt/MT+s8bdEFSxQKucKzf+44YjuJhNvN2tDv/pqHLjIiIiIiVBoUac4uLimDx5MhMmTCAlJYUHHniArKws5s6dq8IQcvNIjYMtP9ift3iqQKscTz7DwElr2RWXire7C5882JC21UOuYZAiIiIiUpQKPOLUpUsXqlWrxpYtWxg7dizHjh1j3Lhx1zI2keJp9Rdgs0D5ZhDR6IrddxxLoesny9kVl0oZPw9+eLS5kiYRERGREqbAI07z5s3j6aef5vHHH6dKlSrXMiaR4is7HdZNtD8vwGjT3/+c5IlpG0jLyiE6xJfJAxsTEeR9jYMUERERkaJW4BGnZcuWkZqaSkxMDE2bNmX8+PEkJCRcy9hEip+N0yAzCUpVhmqdLtt11oajDJq8lrSsHJpVLsWPj7VQ0iQiIiJSQhU4cWrWrBlfffUVx48f59FHH+X7778nPDwcm83GwoULSU1NvZZxijifzQqrzhaFaPYEmPMvH24YBr8dNjN8znZybAb31A/nm0FNdI8mERERkRKs0FX1fHx8GDRoEMuWLWPr1q08//zz/N///R8hISHcfffd1yJGkeJh169wOtZ+z6b6vfPtYrUZDJ+7nflH7P+0nmwbxYcP1Nc9mkRERERKuKsuRw5QrVo13nnnHY4cOcJ3331XVDGJFE8rzhZD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pbA4SZIkSVIpqgQdoLxFIhEAduzYUWx/QUEBeXl57Nixg6SkpCCiqYJwLqmsOJdUFpxHKivOJZWVWJpL33aCbzvCwVS64rRz504AGjduHHASSZIkSbFg586d1KpV66BjQpFDqVcVSDgcZsOGDaSlpREKhYr279ixg8aNG/PFF19Qs2bNABMq3jmXVFacSyoLziOVFeeSykoszaVIJMLOnTtp2LAhCQkHv4up0l1xSkhI4Oijjz7g8Zo1awb+B1TF4FxSWXEuqSw4j1RWnEsqK7Eyl0q70vQtF4eQJEmSpFJYnCRJkiSpFBan/5OSksLYsWNJSUkJOorinHNJZcW5pLLgPFJZcS6prMTrXKp0i0NIkiRJ0uHyipMkSZIklcLiJEmSJEmlsDhJkiRJUiksTpIkSZJUCovT/7n//vvJysqiatWqdOvWjYULFwYdSXFm3LhxhEKhYl/HHnts0LEU49566y3OPfdcGjZsSCgU4vnnny92PBKJMGbMGBo0aEC1atXo1asXn332WTBhFdNKm0uXX375fueovn37BhNWMW3ChAl06dKFtLQ06tWrxwUXXMAnn3xSbMyePXsYMWIEderUoUaNGvTv359NmzYFlFix6FDm0RlnnLHfeWn48OEBJS6dxQmYPn06o0aNYuzYsSxevJgOHTrQp08fNm/eHHQ0xZm2bduycePGoq+333476EiKcbm5uXTo0IH777+/xON33XUXf//735k8eTILFiygevXq9OnThz179pRzUsW60uYSQN++fYudo6ZOnVqOCRUv5s6dy4gRI3j33XeZNWsWBQUF9O7dm9zc3KIx119/PS+99BLPPPMMc+fOZcOGDfTr1y/A1Io1hzKPAIYNG1bsvHTXXXcFlLh0LkcOdOvWjS5dunDfffcBEA6Hady4Mddeey0333xzwOkUL8aNG8fzzz/Phx9+GHQUxalQKMSMGTO44IILgOjVpoYNG/K73/2OG264AYCcnBwyMzN5/PHHGThwYIBpFct+OJcgesXpm2++2e9KlFSaLVu2UK9ePebOnctpp51GTk4OdevWZcqUKVx00UUArFy5kuOOO4758+dz0kknBZxYseiH8wiiV5w6duzIxIkTgw13iCr9Faf8/HwWLVpEr169ivYlJCTQq1cv5s+fH2AyxaPPPvuMhg0b0rx5cwYPHsz69euDjqQ4tmbNGrKzs4udn2rVqkW3bt08P+lHmTNnDvXq1aN169ZcffXVfP3110FHUhzIyckBID09HYBFixZRUFBQ7Nx07LHH0qRJE89NOqAfzqNvPfXUU2RkZNCuXTtGjx5NXl5eEPEOSZWgAwRt69atFBYWkpmZWWx/ZmYmK1euDCiV4lG3bt14/PHHad26NRs3bmT8+PH06NGDZcuWkZaWFnQ8xaHs7GyAEs9P3x6TDlXfvn3p168fzZo1Y9WqVdxyyy2cddZZzJ8/n8TExKDjKUaFw2Guu+46TjnlFNq1awdEz03JyckcddRRxcZ6btKBlDSPAAYNGkTTpk1p2LAhS5Ys4aabbuKTTz7hueeeCzDtgVX64iSVlbPOOqtou3379nTr1o2mTZvy9NNPc8UVVwSYTJIo9tbO448/nvbt29OiRQvmzJlDz549A0ymWDZixAiWLVvmPbv6SQ40j6688sqi7eOPP54GDRrQs2dPVq1aRYsWLco7Zqkq/Vv1MjIySExM3G8lmE2bNlG/fv2AUqkiOOqoozjmmGP4/PPPg46iOPXtOcjzk46E5s2bk5GR4TlKBzRy5Ehefvll3nzzTY4++uii/fXr1yc/P59vvvmm2HjPTSrJgeZRSbp16wYQs+elSl+ckpOT6dSpE7Nnzy7aFw6HmT17Nt27dw8wmeLdrl27WLVqFQ0aNAg6iuJUs2bNqF+/frHz044dO1iwYIHnJ/1kX375JV9//bXnKO0nEokwcuRIZsyYwb///W+aNWtW7HinTp1ISkoqdm765JNPWL9+vecmFSltHpXk2wW2YvW85Fv1gFGjRjFkyBA6d+5M165dmThxIrm5uQwdOjToaIojN9xwA+eeey5NmzZlw4YNjB07lsTERC6++OKgoymG7dq1q9j/WVuzZg0ffvgh6enpNGnShOuuu4477riDVq1a0axZM2677TYaNmxYbLU0CQ4+l9LT0xk/fjz9+/enfv36rFq1ihtvvJGWLVvSp0+fAFMrFo0YMYIpU6bwwgsvkJaWVnTfUq1atahWrRq1atXiiiuuYNSoUaSnp1OzZk2uvfZaunfv7op6KlLaPFq1ahVTpkzh7LPPpk6dOixZsoTrr7+e0047jfbt2wec/gAiikQikci9994badKkSSQ5OTnStWvXyLvvvht0JMWZAQMGRBo0aBBJTk6ONGrUKDJgwIDI559/HnQsxbg333wzAuz3NWTIkEgkEomEw+HIbbfdFsnMzIykpKREevbsGfnkk0+CDa2YdLC5lJeXF+ndu3ekbt26kaSkpEjTpk0jw4YNi2RnZwcdWzGopHkERB577LGiMbt3745cc801kdq1a0dSU1MjF154YWTjxo3BhVbMKW0erV+/PnLaaadF0tPTIykpKZGWLVtGfv/730dycnKCDX4Qfo6TJEmSJJWi0t/jJEmSJEmlsThJkiRJUiksTpIkSZJUCouTJEmSJJXC4iRJkiRJpbA4SZIkSVIpLE6SJEmSVAqLkyRJkiSVwuIkSdJBhEIhnn/++aBjSJICZnGSJMWsyy+/nFAotN9X3759g44mSapkqgQdQJKkg+nbty+PPfZYsX0pKSkBpZEkVVZecZIkxbSUlBTq169f7Kt27dpA9G10kyZN4qyzzqJatWo0b96cZ599ttjzly5dys9//nOqVatGnTp1uPLKK9m1a1exMY8++iht27YlJSWFBg0aMHLkyGLHt27dyoUXXkhqaiqtWrXixRdfLDq2fft2Bg8eTN26dalWrRqtWrXar+hJkuKfxUmSFNduu+02+vfvz0cffcTgwYMZOHAgK1asACA3N5c+ffpQu3Zt3nvvPZ555hneeOONYsVo0qRJjBgxgiuvvJKlS5fy4osv0rJly2KvMX78eH71q1+xZMkSzj77bAYPHsy2bduKXv/jjz/m1VdfZcWKFUyaNImMjIzy+wVIkspFKBKJRIIOIUlSSS6//HKefPJJqlatWmz/Lbfcwi233EIoFGL48OFMmjSp6NhJJ53EiSeeyD/+8Q8eeughbrrpJr744guqV68OwCuvvMK5557Lhg0byMzMpFGjRgwdOpQ77rijxAyhUIg//OEP3H777UC0jNWoUYNXX32Vvn37ct5555GRkcGjjz56hH4LkqRY4D1OkqSY9rOf/axYMQJIT08v2u7evXuxY927d+fDDz8EYMWKFXTo0KGoNAGccsophMNhPvnkE0KhEBs2bKBnz54HzdC+ffui7erVq1OzZk02b94MwNVXX03//v1ZvHgxvXv35oILLuDkk0/+UT+rJCl2WZwkSTGtevXq+711rqxUq1btkMYlJSUVexwKhQiHwwCcddZZrFu3jldeeYVZs2bRs2dPRowYwd13313meSVJwfEeJ0lSXHv33Xf3e3zccccBcNxxx/HRRx+Rm5tbdHzevHkkJCTQunVr0tLSyMrKYvbs2T8pQ926dRkyZAhPPvkkEydO5MEHH/xJ30+SFHu84iRJiml79+4lOzu72L4qVaoULcDwzDPP0LlzZ0499VSeeuopFi5cyCOPPALA4MGDGTt2LEOGDGHcuHFs2bKFa6+9lksvvZTMzEwAxo0bx/Dhw6lXrx5nnXUWO3fuZN68eVx77bWHlG/MmDF06tSJtm3bsnfvXl5++eWi4iZJqjgsTpKkmDZz5kwaNGhQbF/r1q1ZuXIlEF3xbtq0aVxzzTU0aNCAqVOn0qZNGwBSU1N57bXX+O1vf0uXLl1ITU2lf//+3HPPPUXfa8iQIezZs4e//e1v3HDDDWRkZHDRRRcdcr7k5GRGjx7N2rVrqVatGj169GDatGll8JNLkmKJq+pJkuJWKBRixowZXHDBBUFHkSRVcN7jJEmSJEmlsDhJkiRJUim8x0mSFLd8t7kkqbx4xUmSJEmSSmFxkiRJkqRSWJwkSZIkqRQWJ0mSJEkqhcVJkiRJkkphcZIkSZKkUlicJEmSJKkUFidJkiRJKsX/B7VExzH7E8sPAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Your code here\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def plot_training_history(history):\n", + " \"\"\"\n", + " Plots the training and validation accuracy over epochs.\n", + "\n", + " Parameters:\n", + " history -- History object returned by model.fit()\n", + " \"\"\"\n", + " # Extract accuracy metrics\n", + " train_accuracy = history.history['accuracy']\n", + " val_accuracy = history.history['val_accuracy']\n", + " epochs = range(1, len(train_accuracy) + 1)\n", + "\n", + " # Plot the accuracies\n", + " plt.figure(figsize=(10, 6))\n", + " plt.plot(epochs, train_accuracy, label='Training Accuracy')\n", + " plt.plot(epochs, val_accuracy, label='Validation Accuracy')\n", + " plt.title('Training and Validation Accuracy over Epochs')\n", + " plt.xlabel('Epochs')\n", + " plt.ylabel('Accuracy')\n", + " plt.legend()\n", + " plt.grid(True)\n", + " plt.show()\n", + "\n", + "# Plot training and validation accuracy\n", + "plot_training_history(history)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "az4CwhJgvbEd", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "az4CwhJgvbEd", + "outputId": "bbd96767-f3df-4235-b836-23b8535ec018" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 5ms/step\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAvAAAAGTCAYAAABOLiYTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKaUlEQVR4nO3debhWBd3v/889D3sGNqCITIo4lUmPZaY4haJomUNJOT1SpJVWmqes86hZmUml2XkcOw6lxyOaHa3MHEstKxXLWURARWTc877ne/3+4MfO7Ub9LBxg0ft1XV1d7v3lu+a1vnuxuT+xIAgCAQAAAIiE+MZeAQAAAAA+BngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4bBL23ntv7b333htl2WeffbZisdhGWbYk3XfffYrFYrrvvvsGff0Xv/iFpkyZolQqpdbWVknvzn6KxWI6++yz39GeAPBe4NnBs+PfFQP8JmzhwoWaM2eOJk6cqGw2q+bmZu2xxx666KKLVCgUNvbqhfbUU0/p7LPP1uLFi9+T5RWLRf3kJz/Rhz70IbW0tCibzWry5Mn60pe+pOeee+49WYcN9cwzz+j444/XpEmTdMUVV+jyyy/f2KsE4D109dVXKxaL6eGHH97Yq7LR8ezw8ez495Hc2CuA9fvtb3+rI488UplMRscee6x22mknlctlPfDAA/r617+uJ598MnIX5lNPPaVzzjlHe++9t8aPH/+uLmvVqlU68MAD9cgjj2jmzJmaNWuWGhsb9eyzz+qGG27Q5ZdfrnK5/K6ug2uvvfZSoVBQOp0e+Np9992ner2uiy66SNtss83A1//whz9sjFUEgI2GZ8f68ez498YAvwlatGiRPv3pT2vcuHG65557tMUWWwx874tf/KKef/55/fa3v33bywmCQMViUblcbsj3isWi0um04vFo/iXN8ccfr/nz5+umm27S4YcfPuh75557rr71rW9tpDUbKh6PK5vNDvraihUrJGngrz/Xee2NGgA2Bp4dmwaeHf/eonmFbeZ++MMfqre3Vz//+c8HDe/rbLPNNjr11FMH/rtarercc8/VpEmTlMlkNH78eJ155pkqlUqD/tz48eM1c+ZM3XHHHfrgBz+oXC6nyy67bOD36G644QZ9+9vf1pgxY5TP59Xd3S1J+utf/6oDDzxQLS0tyufzmjZtmh588MEh67V06VKdeOKJ2nLLLZXJZDRhwgSddNJJKpfLuvrqq3XkkUdKkvbZZx/FYrH1/u6eJPX29qqhoWHQNq7z8ssvK5FI6LzzznvD/ffXv/5Vv/3tb3XiiScOuQFLUiaT0dy5c9/wz0vSVVddpX333VcjR45UJpPRDjvsoEsuuWRI3cMPP6wDDjhAI0aMUC6X04QJE/Sf//mfg2puuOEGTZ06VU1NTWpubtbOO++siy66aOD7r/89xvHjx+uss86SJLW3tw/6PcP1/R5jqVTSWWedpW222UaZTEZjx47VGWecMeT4l0olffWrX1V7e7uampp06KGH6uWXX37T/QBg03H88cersbFRS5cu1Sc+8Qk1Njaqvb1dp59+umq12qDadW9hd955Z2WzWbW3t+vAAw8c9Cs5PDsG49nBsyNKeAO/Cbrttts0ceJEfeQjH7HqZ8+erWuuuUZHHHGETjvtNP31r3/Veeedp6efflq33HLLoNpnn31WRx99tObMmaPPfe5z2m677Qa+d+655yqdTuv0009XqVRSOp3WPffcoxkzZmjq1Kk666yzFI/HB25Q999/v3bbbTdJ0iuvvKLddttNnZ2d+vznP68pU6Zo6dKluummm9Tf36+99tpLp5xyin7605/qzDPP1Pbbby9JA///Wo2NjTrssMP0f//v/9WPf/xjJRKJge/9n//zfxQEgT7zmc+84f649dZbJUnHHHOMtf/W55JLLtGOO+6oQw89VMlkUrfddptOPvlk1et1ffGLX5S09k3H9OnT1d7erm984xtqbW3V4sWL9atf/Wqgz5133qmjjz5a++23n84//3xJ0tNPP60HH3xwvQ8ZSbrwwgt17bXX6pZbbtEll1yixsZGve9971tvbb1e16GHHqoHHnhAn//857X99tvr8ccf109+8hM999xz+vWvfz1QO3v2bP3yl7/UrFmz9JGPfET33HOPDj744A3eRwDee7VaTQcccIA+9KEPae7cubrrrrv0ox/9SJMmTdJJJ500UHfiiSfq6quv1owZMzR79mxVq1Xdf//9euihh/TBD35QEs+O1+PZwbMjUgJsUrq6ugJJwcc//nGr/rHHHgskBbNnzx709dNPPz2QFNxzzz0DXxs3blwgKfj9738/qPbee+8NJAUTJ04M+vv7B75er9eDbbfdNjjggAOCer0+8PX+/v5gwoQJwcc+9rGBrx177LFBPB4P/v73vw9Zx3V/dt68eYGk4N577x1SM23atGDatGkD/33HHXcEkoLbb799UN373ve+QXXrc9hhhwWSgo6OjjetW+ess84KXn8pvHY/rHPAAQcEEydOHPjvW265JZC03m1e59RTTw2am5uDarX6hjXr9v9r98u6dVq5cuWg2tfvp1/84hdBPB4P7r///kF1l156aSApePDBB4Mg+Nd5cvLJJw+qmzVrViApOOuss95w/QC896666qoh95fjjjsukBR85zvfGVT7gQ98IJg6derAf99zzz2BpOCUU04Z0nfd/Zhnx1A8O3h2RAm/QrOJWfdXj01NTVb97373O0nS1772tUFfP+200yRpyO/KT5gwQQcccMB6ex133HGDfqfxscce04IFCzRr1iytXr1aq1at0qpVq9TX16f99ttPf/rTn1Sv11Wv1/XrX/9ahxxyyMCbndfakI/Z2n///bXlllvquuuuG/jaE088oX/+85/67Gc/+6Z/Nuw+XJ/X7oeuri6tWrVK06ZN0wsvvKCuri5J//odw9/85jeqVCrr7dPa2qq+vj7deeedG7wub2bevHnafvvtNWXKlIHjs2rVKu27776SpHvvvVfSv86TU045ZdCf/8pXvvKurBeAd88XvvCFQf+955576oUXXhj475tvvlmxWGzg1ylea939mGfHUDw7eHZECb9Cs4lpbm6WJPX09Fj1S5YsUTweH/SvzSVp9OjRam1t1ZIlSwZ9fcKECW/Y6/XfW7BggaS1N+c30tXVpXK5rO7ubu20007WOjvi8bg+85nP6JJLLlF/f7/y+byuu+46ZbPZgd+HfCOv3Yev/4c8rgcffFBnnXWW/vKXv6i/v3/Q97q6utTS0qJp06bp8MMP1znnnKOf/OQn2nvvvfWJT3xCs2bNUiaTkSSdfPLJuvHGGzVjxgyNGTNG06dP11FHHaUDDzxwg9br9RYsWKCnn35a7e3t6/3+un/QtO48mTRp0qDvv/avwQFs+tb9PvtrtbW1qaOjY+C/Fy5cqC233FLDhg17wz48O4bi2fEvPDs2fQzwm5jm5mZtueWWeuKJJ0L9OfdNxfo+NeCNvlev1yVJF1xwgXbZZZf1/pnGxkatWbPGW8mQjj32WF1w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yufzGjFihPbaa6+BVEEA2Biifg9+rYULFyqbzSoWi+nhhx8e8v0777xTH/3oR5XP59XW1qYjjjhCixcv3uDlXX311YP2UTab1eTJk/WlL31Jy5cvfxtb8t55/vnndcQRR6itrU35fF4f/ehHde+996639umnn9aBBx6oxsZGDRs2TMccc4xWrlz5Hq8x3i4+RhLviF/84heD/vvaa6/VnXfeOeTr70QE9Lvh73//u/bcc0+dcMIJymazmj9/vn7wgx/orrvu0p/+9CfF42t/1l2yZIl6enp03HHHacstt1R/f79uvvlmHXroobrsssv0+c9/fiNvCYB/R1G/B7/WV7/6VSWTSZVKpSHf+81vfqOPf/zj2nXXXfWDH/xA3d3duuiii/TRj35U8+fPV3t7+wYv9zvf+Y4mTJigYrGoBx54QJdccol+97vf6YknnlA+n387m/Sueumll7T77rsrkUjo61//uhoaGnTVVVdp+vTpuvvuu7XXXnsN1L788svaa6+91NLSou9///vq7e3V3Llz9fjjj+tvf/ub0un0RtwShLJxg2CxufriF784JGJ6ffr6+t6Dtdkwc+fODSQFf/nLX960rlqtBu9///uD7bbb7j1aMwB4c1G9B//+978P0ul08O1vfzuQFPz9738f9P0ddtgh2GabbYJSqTTwtcceeyyIx+PB1772tQ1a5lVXXbXeZX3ta18LJAXXX3/9G/7Z3t7eDVrm640bNy447rjjNujPnnzyyUEymQyeeeaZga/19fUFY8eODXbddddBtSeddFKQy+WCJUuWDHztzjvvDCQFl1122QYtHxsHv0KD98zee++tnXbaSY888oj22msv5fN5nXnmmZLW/vXv2WefPeTPrO/3Ajs7O/WVr3xFY8eOVSaT0TbbbKPzzz9f9Xp9UN2yZcv0zDPPqFKpbND6jh8/fmB5byaRSGjs2LFvWQcAG9Omfg+uVCo69dRTdeqpp2rSpElDvr9mzRo99dRTOuywwwa9KX7/+9+v7bffXjfccIO1HNe+++4raW04lCQdf/zxamxs1MKFC3XQQQepqalJn/nMZyRJ9XpdF154oXbccUdls1mNGjVKc+bMUUdHx6CeQRDou9/9rrbaaivl83nts88+evLJJ9e7/IULF2rhwoVvuZ7333+/PvCBD2i77bYb+Fo+n9ehhx6qRx99VAsWLBj4+s0336yZM2dq6623Hvja/vvvr8mTJ+vGG2809ww2BfwKDd5Tq1ev1owZM/TpT39an/3sZzVq1KhQf76/v1/Tpk3T0qVLNWfOHG299db685//rG9+85tatmyZLrzwwoHab37zm7rmmmu0aNGigWH8zVSrVXV2dqpcLuuJJ57Qt7/9bTU1NWm33XYbUtvX16dCoaCuri7deuutuv322/WpT30q1LYAwHttU74HX3jhhero6NC3v/1t/epXvxry/XW/UpPL5YZ8L5/P68knn9Srr776joU3rRuehw8fPvC1arWqAw44QB/96Ec1d+7cgV+tmTNnjq6++mqdcMIJOuWUU7Ro0SL97Gc/0/z58/Xggw8qlUpJkv7rv/5L3/3ud3XQQQfpoIMO0qOPPqrp06erXC4PWf5+++0nSW/5+/2lUkltbW1Dvr5u3R555BFtu+22Wrp0qVasWKEPfvCDQ2p32203/e53vzP2CjYVDPB4T7366qu69NJLNzje+sc//rEWLlyo+fPna9ttt5W09sa55ZZb6oILLtBpp52msWPHblDvhx9+WLvvvvvAf2+33Xa69dZbNWzYsCG1p512mi677DJJUjwe1yc/+Un97Gc/26DlAsB7ZVO9B7/66qs699xzNXfuXDU3N6+3ZtSoUWptbdWDDz446OurV6/WU089JUlaunTpBg/wXV1dWrVqlYrFoh588EF95zvfUS6X08yZMwdqSqWSjjzySJ133nkDX3vggQd05ZVX6rrrrtOsWbMGvr7PPvvowAMP1Lx58zRr1iytXLlSP/zhD3XwwQfrtttuUywWkyR961vf0ve///0NWmdp7bPq/vvvV09Pj5qamgatl7R2n0hr/0ZEkrbYYoshPbbYYgutWbNGpVJJmUxmg9cF7x1+hQbvqUwmoxNOOGGD//y8efO05557qq2tTatWrRr43/77769araY//elPA7VXX321giCw3vxI0g477KA777xTv/71r3XGGWeooaFhyKfQrPOVr3xFd955p6655hrNmDFDtVptvW9QAGBTsqneg//H//gfmjhxombPnv2GNfF4XHPmzNHdd9+tb37zm1qwYIEeeeQRHXXUUQP330KhsMHbtv/++6u9vV1jx47Vpz/9aTU2NuqWW27RmDFjBtWddNJJg/573rx5amlp0cc+9rFB+2Tq1KlqbGwc+DSYu+66S+VyWV/+8pcHhndp7fNkfRYvXmx9us5JJ52kzs5OfepTn9L8+fP13HPP6Stf+crAJ/is2yfr/n99A3o2mx1Ug00fb+DxnhozZszb+lfuCxYs0D//+c83/KSBFStWbHDv5uZm7b///pKkj3/847r++uv18Y9/XI8++qje//73D6qdMmWKpkyZIkk69thjNX36dB1yyCH661//OujGDACbkk3xHvzQQw/pF7/4he6+++6BT/x6I9/5zne0atUq/fCHP9QPfvADSdL06dN14okn6tJLL1VjY2Po5a/zv/7X/9LkyZOVTCY1atQobbfddkPWJ5lMaqutthr0tQULFqirq0sjR45cb991+2TJkiWSNPA3F+u0t7ev91dgXDNmzNDFF1+sb3zjG9p1110lSdtss42+973v6YwzzhjYJ+t+9Wh9n+5TLBYH1WDTxwCP91TYm0OtVhv03/V6XR/72Md0xhlnrLd+8uTJG7xur/fJT35SxxxzjG644YYhA/zrHXHEEZozZ46ee+65Qf+QCAA2JZviPfiMM87QnnvuqQkTJgy8cV61apWktb/28eKLLw78o8t0Oq0rr7xS3/ve9/Tcc89p1KhRmjx5smbNmqV4PK5tttkm9PLX2W233db7++Gvlclkhgz19XpdI0eO1HXXXbfeP/N2PtrS9aUvfUknnHCC/vnPfyqdTmuXXXbRz3/+c0n/OibrfnVm3a/SvNayZcs0bNgwfn0mQhjgsUloa2sb8iku5XJ5yI1m0qRJ6u3tHXhT/m4qlUqq1+vq6up6y9p1f+3o1ALApmZj3oNffPFFLVmyRBMmTBjyvUMPPVQtLS1D1m3UqFED/wC3Vqvpvvvu04c+9KG39QZ+Q02aNEl33XWX9thjjzf9AWncuHGS1r6xnzhx4sDXV65cOeTTajZEQ0PDoH/HdddddymXy2mPPfaQtPZvX9rb29cbjvW3v/1Nu+yyy9teB7x3+B14bBImTZo06HcnJenyyy8f8vbnqKOO0l/+8hfdcccdQ3p0dnaqWq0O/Lf7EWadnZ3rrbnyyisladAbmfX99XClUtG1116rXC6nHXbY4U2XBQCboo15D7788st1yy23DPrfl7/8ZUnS3Llz3/DN9jpz587VsmXLdNppp71p3bvlqKOOUq1W07nnnjvke+s+3Uxa+zv2qVRKF198sYIgGKh57Sf3vJb7MZLr8+c//1m/+tWvdOKJJ6qlpWXg64cffrh+85vf6KWXXhr42t13363nnntORx555AYtCxsHb+CxSZg9e7a+8IUv6PDDD9fHPvYx/eMf/9Add9yhESNGDKr7+te/rltvvVUzZ87U8ccfr6lTp6qvr0+PP/64brrpJi1evHjgz7gfYXbffffplFNO0RFHHKFtt91W5XJZ999/v371q1/pgx/8oD772c8O1M6ZM0fd3d3aa6+9NGbMGL366qu67rrr9Mwzz+hHP/rRRnn7AwBv18a8B0+fPn3I19YNvdOmTRv0EuWXv/ylbr75Zu21115qbGzUXXfdpRtvvFGzZ8/W4YcfPqjH8ccfH+pjLDfUtGnTNGfOHJ133nl67LHHNH36dKVSKS1YsEDz5s3TRRddpCOOOELt7e06/fTTdd5552nmzJk66KCDNH/+fN1+++1D9rPkf4zkkiVLdNRRR+nQQw/V6NGj9eSTT+rSSy/V+973viGfbnPmmWdq3rx52meffXTqqaeqt7dXF1xwgXbeeee39Y+b8d5jgMcm4XOf+5wWLVqkn//85/r973+vPffcU3feeefADWydfD6vP/7xj/r+97+vefPm6dprr1Vzc7MmT56sc845Z9CbBtfOO++sffbZR//v//0/LVu2TEEQaNKkSfqv//ovff3rXx/0D74+9alP6ec//7kuueQSrV69Wk1NTZo6darOP/98HXrooW97PwDAxrAx78FhTJ48WWvWrNG5556rQqGg7bbbTpdeeqk+//nPD6nt7e1VLpdTa2vru7pOknTppZdq6tSpuuyyy3TmmWcqmUxq/Pjx+uxnPzvwKyyS9N3vflfZbFaXXnqp7r33Xn3oQx/SH/7wBx188MEbvOzm5mZtscUW+tnPfqY1a9ZozJgxOuWUU/Stb31r0MdKStLYsWP1xz/+UV/72tf0jW98Q+l0WgcffLB+9KMf8fvvERMLXvv3OAAAAJuBUaNG6dhjj9UFF1ywsVcFeMcxwAMAgM3Kk08+qd13310vvPDCen89BYg6BngAAAAgQvgUGgAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIELsIKevnXui3XTZsmVWXWdnl92zUCxYdbmGut1zqzGj7dpxW42z6oY1+T37u9NvXfT/K9VKVl1H91K/Z9Hb/329Rbvn00++YNfmmrJWXVOLn24aC/EzaSzmnf677LqT3bOptcGqW/LCErtn55puu3bMmK2suu122t7uufKV1Xbtn+6636p77G+P2T1jCe+YfmTfPd666P/XNqrZrl29xtv+5a/6++m+mx+ya6PioWfKdm2tWrHq3o0PSYvFYhu3NlRPu1TxmHedxEPcI+NmqbnotbUx/5jG5NWGWb4UYqe6HcMcKLtnmHPfn3tCrMA731P+3o/F/e2PxzfuMXUrM+azTJLGtSfesoY38AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHiZclLWtOxxm7aXyx4dQWvbi0vrDYWZOyO9dpbR9UO1AY1ry5WtHtW1GfXtra1WXXZnFcnST093j6tVTrsnrGYv08nTJho1Q0fMczu2dXZa9euXNVl1WWyrXbPfLbZqgvqr9o9+/u82HlJ6urut+o6O/z9VAsRZ5/L5ay6fINXJ0mlsndNVcretktSvZ6yaxOJqlUXj5XtnpujesXf/0HdPKfi/jsm994TC/HaKpHw49TjIdbVF2b5Xq1/h5YU845TzKxbW+sv3t6lYZbvL97epzGzTpLi5g5IxOp2z0SIk9pdfizEgQpzTGNx81jFvJkrTM9YiKMf5j7hlmZDnCfv5HIBAAAAbAIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBC7CTWzk4/ibWnq8eq6+/x0yATcS85MZdpsHuGSRrrL3hpkNXKSrtnsd9Pj0tnvdp40k8vk7yepaKXRClJiYSfhBtLe5mA8ZSfHRhP2Ke0kvG0VZfJtNg9M+m8VdfY5J+niYz/c/bqztVW3QtLFtk9R41u92u3HmnVbfHqaLvnwmdfsOpeeMbfpjWdrXZtzbxOerr8ZOXN0Rat/rVfKHv3lGrg36ODuHfth0riDJNG6aZ2hlj+u5LEGuK1nfuMfFfSVeWnYYZLDX3nj2mo88RNYg1x7BPmPUoKk8Rqt1SY89ROTQ2RWuomAb8bx17yg4DT72wQK2/gAQAAgChhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIsTOnQ8TUR8Eda+u7tVJflRtmKTaMMsPKl5tLMTPRNlkyq7t7+u36up1L6Jckjo6vej3rm5v2ZIUc7OvJXV3dFh1xT4/or7QW7Fr6xVvXTvXdNs93ZjyWMq/njKNWbu2t7tg1b24+EW7ZyLlx3TXAm//Z3IZu2cykbDqusIcp2zOX37GO1bxmH89b46G5/3zpJD07tSFqt+zbj4k4iHuUbEwEfVuW79lqAeau/ykGWUvSe6uiif8FbX3k6S4ua6xWIjY+xD71K8NsU/Nnu7MI0nxECeKvfwwOyoEd0aIx737/tqm7s56d86TwFy8Ox+4eAMPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABECAM8AAAAECEM8AAAAECEMMADAAAAEcIADwAAAESIHQfZmG+2mwZVL7U0XvV/fij2l6y6WKxm91y9aoVd29frpTy2NA2ze44cvqVdWy1725VM+gmX6YR3nJLxHrtnPER8XK3mLb9UKts9w9SWC94+ffqZJ+yew0e2WXWxpJ+Ym8022LVJecd/6YuL7Z5PPfqUXVspevu0Z02v3dONbuzr9XvWXvHP0+Z275g2NOftnpujWLlo15q3HmXifmJx3UztDBGCrESIOMa4WZtI+s+9eIjoxnjcXH6YJFZ389+VdFMpZj5PQoWGhlm+WReEaOrWxkLlyvvehUMauvodF7zzyw+ThGvnwL7Dq8kbeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAixQ6UTIXJls+mUVVfL5+yeicD7WaOx0Y8zrwd+nH08kbbqEikvyl6SqoGZJy6pMe1t14hho+2eDZmyVdfbWbF7dnd327WppHeexOL+z5mplH+e1sre/i8W++yeXR1ez2xD1u7Z0tpq1za1N1t1Qd0/psWCX5tOeudpd3OP3bOro9cr7PaPU6Xkb1Ol6NWWUn7PzVEsRE54Mm7WunWSgoRXm06+C+spPyY9aT91w9Uqbt773oXU+yAIkTv/Loi72y5JIWYZe7PM+WRtrXcAwuzRWIjtdytjoU4Uf/l211A7IEStvfwQ136IvfpO4g08AAAAECEM8AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhNhBzbV6yW5aqXm1NdXsnm5Scb6xye6ZSPk51fmGnFXX0uwvP5PwekpSU36EVdfc0Gr3DMrdVl0qRJ53Lp+1a/MNXm0+32D37E/752lHrdOqyzZm7J6pRMKqK/dX7J59CX+b8nkvqrl52Gi759atbXZtNu2d0y8+v8Tu+cw/n/EKQ8SZB3W7VHHzPUcqkfKbbo5CpITHE15xyqyTpJh36SnE7UzxWIiIeHdV4/7JF8T82ri5AoHMHSUpZvZ068Iz93+I4xTmPuFe+/Uwi695xzSZ9I9TGPUgxMq6Qhx+e+lhrj2/qy/UNnnLj/kjt4U38AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhNixUMNGjbSbpnu9hM9AXXbPYqXHqotn03bPWMpPOquYqbGVWtnu2d42yq5tyHoJr+m0/zNZLPDWtV71k0DjIZIDY7GqVZcKsU2ptH9M62YcZ7VSsHuq7iWs1rxNl+SnVkpSX693/hdLfnJd1Q9MVizu7f9M1k/szeW9dNdYiOi8hBvbKSkV926Tyfi/9/uQmLmfJClhntOxZIh9apaGSW0MEzAaM5Mjw5wm4Zb/zqehuqGdYRYdhEgCdWtj8TBJnP4BqJS8m99DD/7V7vnSksVW3S677Gz33G777ezaZMafkVxh9r5/+EOd/GZhiAjuELOMfZ6G2lNvvU3/3k8cAAAAIGIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACLGzrxuaW+ymiUTKqiv1+nny3R29Vl0l8HvG635Ubr3u/axTDhFRHyb4OpPxqusq2T0L5T6rrlL1e6bifkR93Pz5sbffW09J6u+v2LVupHOxv2j3bMw3WnXDWv3rqam1ya5NZr1Lulzyj2kiREx5JuMtv7E5Z/dsafX26fKUf0UFNf8+US16+6rc75/7m6Na4N331xZ7ZaH2qHuehjifa4F/TsXMOHc/Sl6hdoDbNwgRJ+9uU7inWRjeRtUDf5uScf88XbFspVX3p7sfsHs+/+zjVt1Tjz1q95xx8EF27bbbb2fVNQ9rs3tmGvz7ed08V2rVMBeKJxYPcT2HqbXrQsyHxrXHG3gAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAI8XLPJaUSfvxwMtNg1fUms3bPeMWLSk4H/s8k8RDxz0Hd61su+ZHOq9astmvLZS/6PZvxj9Oanm6rrr/kx85nc17svSQ15L345f5yxe5Zrfm17ulfq/jbHzPPv0TCz0iPxfz45Wql9I7WSdLyZS/ZtZ0dK6y6Yl/B7pnJe/u0Zbh/7vV09Nm1/f39Vl0tRJz75qi/6G9/TDWrLhEizjzuXicJv2eYWvc6jYV4bZaI+8WxuLdPFfePUzzu3aec2PcNqzX3qX871RNPPWPX/vaWu626Sojn/kf32NOqC6refUeSnn/qabt22bJXrLotx4+3e+764f+wa0sV75j29pjns6REwrtOsjn/RMlk7fFY9bo3I9RDPHebm976ecYbeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQuyoqZaMl5opSWZ4m/rzfnJiKumtaj7lr2cy7aeWFote0lZfr5+e1tvbY9e2Nnu1+ZyXgitJ3Wu8dS0V/HTTVNLf/80NTVZdQ6Of3JcIeu3aNYUuq65a81P2cumMVVcp+ylza0Kkhro/ksdCpBD3FvzU1B4z3Vc1P122ua3FqtvxAzvZPV984WW7dvXyDquutzvEcdoMVeohtt9NLA78NMS4zNTQmn/t2emm8hNWY2ZqpCQFifQ7vvx43L/2AvM2EQ+TGBsiWVpuEmvdv5/95aH5du2Df/+HVdeUy9s9O3u8Z/mu2421e2453LtHStITC1+w6vrN9HdJGjd5il0bxL1rOpH057OSmdZeDXHt1+ohEtCrZasu7l5QkpqN8Yg38AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABFi51SvWLXSbpqWF4FbKvlRvdlMg1XX1jjc7lmTH5Vbq3gx4ZVYye5ZKYep9SJ4+0JEBRd6vPjfao8XUyxJnT3+NjXlMlZdy2g/JrqpMWvX9nf1W3X1uh/nPnzYCKuu6icqq7vgrack9fWb22RGP0tSc2uzXRsEdbMwRKT0qNFWXUuzv56jxmxh1z752FNW3fNPLbR7bo7iNf9+Hpi33qDu38+ChPfcicX8+35M5vksSXXvnI6HuPbj8TDLd8v87Y+b+yoIcT2HeW0YT3h9y6UQz70+/zyt1b2V7e3zn3trViz3Cotdds/mPXezaxVLWGXplHc9SVI8xNzR1OLdp+v+aap0ytumYtGfZUohalNp7zxNmvvexRt4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBC7IjJpa+usJsGJS8SrhwivSwuL+mqKdNo98xkvXRXScqneqy6LjM5TpIqdT+Vq1r30uPqVT9lLln3jlOzmXAoSfm0X9u7ykuaq8b980Qh0uNiZiRiueDv0+7uXquuHvdj5kqVol1bNtN9+/r8dNcwyY0NjXmrrrGxye6ZafSu02TeT+FtHeUnNo8ZP8aq6+30jv3mql7ykwsV8669mB+CrGrNXH7cf2+VSnlp0ZIUuGGUIa79Wsm/TmuBuf1J/7kTBN4BCMwUWklKJP3aRjNZ+5WXzHRTSSuWr7Zr3eTMdNzfp6mct02ru7rtni+t8Ldp/KRtrLqx47aye7aY2yRJmYR3/fWU/Od+rerNMo15/3ouhlh+texde0GI80R662cpb+ABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAixA6qziRydtNqsmzVlQI/JloxL6e63l+wW7blhtm1zY1eBG827Wd/d9f96PVCb59VVy1V7Z6xpLf/02m7pYbn/Jjs1fLWtbenx+5Zkh9VXDFPld4uf/nVmnfuZ3IhdmrS/zk7aUY1NzU3+z1DLL9sRkp3dXfZPUtlb5+Wq2aUvKRq2c29l1LpRqtuzNit7Z6bo2olxP6ve/eJvpJ335OkvqJ3nqQyIa69mH8/j9W8ay+b9O9RLc0puzaX99a1UvLP/UrVi5Pv7/Nj57NZf5uyKW+berv8Z2kpxIzQmM9adS2NDXbPhnSTVbf12Ha75z777W3Xjt3au0/F/Ue5ahX/nOru8J6nnSGOU2+vd/4F5n1HkuqBfz+rVIpWXSzmn/ujRra+ZQ1v4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACLEzokeOdyP9e3r7bbqyn1+RH0y4cVft6b8qNqgo9Ou7al4Md3dST9+t5T2I7Vrde9QlUpVu2e16i0/Hff3ab3iR2onk17fwFxPSYonM3ZtPuf9/Fro6bd71t3ChL9P4wn/5+xazTv/Ghvyds9hw1vs2op5/Nes6bB7rly23KqL1/zY+3KI6O9iwdumXLMfp745KpS9OHFJ6jdvE6u7/J5rur3aeojXVrW6fUUrVvXOv3jVf0ZsPbbVrp043ntG16r+ub96ZadVV3APqKTWtma7VvKeZ8Pa/HvUzjtNsWubml+x6ka3t9k9ezu8npO32cruOWqEv/1B3Tv/+sv+eVKu+tdJoeQtv1yL2T37e7z5rFj0r71czps5JSmVzll1dfmzjIM38AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhNjRhemUn0qVaPSS1hLtftJWrOYlfaVSXiKWJNVrftJYLOX9rJNK+2mQhWqfv3wzwSufGW33DBq8nomYn7LXnPcT2ZIVLxWt0OMvv1rzz9PGpqxVFwzz09v6q2YaZODvJwV+ab3undO9PV5asiRlsn5qbHNTk1XX1uq/Oyj2eil7hb5eu2eh4F97FTM5MBPiHrk5WtHhn1PdRe+k7iv510lf0btPhEmrroW49gI3ObLuL7/4op9E29Hn7f/mBj+tutdMoTZvO5KkQoidWnnFO6bNLY12z1yDPyOkzVtfXP4OWLlyhVX3ZN2770lS2zD/uZ/Ne/uqoclPdy2FSLbu6Oyx6jIZP9m6c02XVVcshZglqv7y01lv7kubia0u3sADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABEiJf/KqlQ8iKVJSkR9+LUR2012e45ZdsdrLptRvrxvy8++6xdu2iZF39cLRXsnpXicru2Le/t03LJPqTqLXox3bXAj4jPjxxn19a6Oqy6Vvnxxz39/v7vW+NFj2dyebtn3dz9yUzC7pnKmHnekuqBV9vd48fe9/X6137NTNSuV+p2zyDwIuo7O9fYPc3Qe0lS2YwJr4WIiN8cPblgtV3bX/WOf5hdGjfPk3rdf29V8RevIPC2KSb/3C/0hKitetvflCnbPd09VSlX7Z61lf79JJPNWHXPL3nO7vnCogV27eIXnrfqqmX/uZNOePf+1R3+flrTdbdd29raatXttNPOds/RW2xh16YT3jOqGOJZnkl5D95kyr/240n/KbGmw5tlYvKfUdJbz8e8gQcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQM/hdqtb9SOdqvMGq66kNs3uu6PXi7MdvM8bu2TSx0a7NJVZYdeWXXrV79nV5kcqStP1WI626YtBp98xWzKjgmP9zXrnub1NJaW/xSS/KXpJi8iO9K6WSVZfJZkMs340p9zPia3V/mwIzpr2x0T/305kQ22+eK7GEv/1NTd6139XlB98XCn5tqeSdf+WyH32+Oers82tr5nkS+KeJYoF570n5EemVEPcT1bzzJBP3l5+J249oqexd+6UQmxR75x8RKlf9FXj2ieesusVLl9g909mMXVuOe7XlmD8flc33pqMamu2egfxzatHixVbdqlWr7J7jxo2zaydNmmTVJVP+cXJrE3F/PikU3We5VKt413614vd08AYeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQO+atXPAT4WoJ7+eCat2P7isVVlt1q9b46a7LVxXt2s6it02ZnJ9w2ZgfZde2NXlJrH29fspdIuOlUdZDxCGuWbXUrg2SXnpa2o0DVLjkwlLCW34+7R/TYqlg1ZXLXp0kKUQKcsLc/FwmZ/dsafYTARMJ71iVin5qaVDzrtPGRn+b+vr9e0/VPFZByU933RzFk37KYCLm7aswSaxB3Tv53QRmScrF/WuvpcFLIM+n/DTIEc3+OR03E177yiGOUzpl1fUW/evpsafm27ULFi606pratrR7Ng/bwq5NN7RZde0j/Wd5qeTt/223GmH3HNnopZpL0gsLF1h1nav9JNaVy5fZte79dOSo0XbP4e3e/k+FSBVX3U+ATye86ySb8upcvIEHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEDt3vr+ry+9a9yKdCzE/0npJ4MXatjW32j0XvvCKXfvSy69adXH50dsTxoy0a0e0tFp1PS+9aPcs9nnx1xkzTluSMiF+JKyY+6oaVO2etbofEx7UvfMvEdiXiWLmeZqI+3HqiZQfk51MetdeKukf01zWj3MPAu+Y1hL+MW1oaLTq0qmK3bNS9GtXF7117ekr2j03R41J/5g25QKrrtW870lSd493TBe94Me+N7Y027WtWe+aDqr+ParY32HXJlLe8ovFXrvnSy94z71/Pvms3bOn4D/3R47ayqpraPCfpcV+/xmdybV6hTHvHiVJQdw7T3sL3jUiSS1Z77kjSfl8g1VXL/vHKZvynjuSlEt752l39xq7Z3+/d043NLXZPeOJrF1bM0+p+Dv8ypw38AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhNgRk81pPxUsFXhJc9UQsVSNLV4iW1l+amSvmUQqSYWOVVZdLuYnoiVa/OTCVS8VrLru1UvtnoWCt/2plJ9eNqJthF270kxaK5T94xQP/DTMbMJLmiv39tg964GXshcLkfKWSWT82qxXW634+6lY8GsTSe+Wkoj76bJuEG5vj3+eNDb6CZuxmpccmJSfbrs5SlT8hMt83ttX8RCJudWefm/Zaf8ZEeY87TSXn0z6z73eqv+MWP3yCqvumSf+afd8edlKqy6ZbbV7Ng0bbdcmksOsunrdv/aCEMne5bI39xT7/J5JM9m8Wgmznn4SqhsH2tCYt1u2NPjPqLSZGJzJ+89I9zLp6lht90ym/PtEvqHFqgvkz9EO3sADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABEiBlSLrU1tdlN2xpHeQtvGGP3bJi4tVXX1e3FWUtSIuXH/7a2eNHryX4/qrfzlWft2uLqmlWXqPqRyg354VZdY0ur3bOlbYRd29HdadXFq35EeybuR2qncw1WXbFUsHuWy0WrLhb3j1O+wVtPScqa53RXv3+dFAtlf/lZLyZbMf/dQaXiHf8g8Htm0v61nx3pRYqnQ/TcHOVyabt22cpOq663t9fumUx6134q5d8jyiV/+dXAu0f39vs9V65eadc+v/B5q66zs9vu2dA80qrLNPn3/SBERL1S3jkVy/rXXjprjz2q1bx7Sjzu33uGNXj3/pHN/n6K1/1n5PiJE626YqHT7tmQ9Lc/m/JqS9WS3bNeC6y6XN7fpz3dfXZtb9dyqy6T95/lDt7AAwAAABHCAA8AAABECAM8AAAAECEM8AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARIidKZxraLKbjhg+3KrLNLfZPXMtXgRuX4jo7bj8OHvFvNq6vEhfSYonzdh5SQ3NXlT02PYt7J7D28d5hRnveErSimWr7Npapd8rjFXsnkHc3//Vqlcb5qfcetWLU/dD56Vsyo/+zpjR48mEvwZB1S5VrepFesdCRI/XvV2qeoj1zDb5kdr5fN6qi8f+vd+HFHu77Np+s7a5odHu6R6nSs08oST19pv3KEkvL33Zqnv8ySfsnl093XZtLOE9T/IhnrtNrSOsuoYQPVtHjLRrG5qbrbpKxT+m1RA3tFrNe+7Xan7PTCZl1W09drTdc/Vy/7mbzTZYdaNGe8dekoKSf53EayWrLl/3n/u1uvfcKfSX7Z7ppHecJKmr27tOly1/1e7p+Pd+4gAAAAARwwAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABECAM8AAAAECEM8AAAAECEMMADAAAAEWJHPFYrRbtppdRn1WUqXp0k5eLe8rcc5qWMSVKpw0s3laRat/ezTj3w07uam/z0ukTKSyXLtLXYPVtHuwmrXsKhJL20qMOuTSW99Lpck79PE4Gfrtvf76X3Ffr9RLi6mQiXSvnblAyRCFerevs0HiIJNR7392lgJtHWQ6QhVsve/i+V/JS9SjlErZlwqRBpjJujUtG/nydiXgpyECKNsVopWHV9BS8JUpKefX6hXbtg4QtWXX/Rf5Y2hnhGZMzU2mxjq92zbZiX7J1v8NczmfSfu/29XsJnre7fo+px7x4tSbWad57WQyWxeqn2w0a02j1LBe/cl6SePu/8q7kR2JJaG/1k74amrFX34pLFds9M1junWlq8ZF9J6unptWuHDfPO/0zWTwB38AYeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQpJu4Yru5XbTUtmLPx5d8yOlm0e1W3XbjNnW7tmWGWvXvtLkxQp3rPSilyWpXu+wa/tLXqT44uVL7Z61mBd/3D7C30+1nP8zYaLJiz/Ohvg5MxFL2bWFpNe3Y7UfvV0OzOht+edJmEjrcsU7T2o1v2ci4e//eMyMNDf3k+S/ZUilE3bPUsW7R0lSIuUd/yDmnyebJ/88CeSdJ6Wydz5L0osvvWzVPfns03bPFZ2ddm0q5UXE5xqa7J5Js6ckBfLu57mmYXbPbGOrVZdI+hHxpVLZrq3Vq1ZdPO49SySpFuLe45YGgX/tZ7LeMyqIedsuSfGUf+0V+7xrqlz2nxH5jD1KKtHknafxuN9z1crVVl1ba5vds719uF3b1d1l1WWy/nnq4A08AAAAECEM8AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhNhZtSNCxMqWSyWrbmX3crunnptvlY0eNsJuObbdj7TOBd72v1D2t2nxih67tq/ixR93F4p2z6Zh3nFqz3jRz5IUD1FbTyS8niEilVNJL6ZZktJ1L6a8nvPjj4Oqt/+DEHHe8bj/c3Y2521TNfBjspMp7zhJUi5r7n9/81UNvOj1xrgfO5/Ohtkmc59mQmzUZmhVV69d29vr1b788st2zxUrVlh1VfkR9bl83q4N5J1Tbp0kxRP+vSfb0OLV5b06SaoF3r0nqPj3k3jM3/5EMmY29Z876bS/T+t175oOzJlnbU/v/OvoXG33LFe9e6QkVaveNlXK3swhSR0d/r2vMes9z0e2j7J79vf3W3XuPUKS2tvb7NqGBvMZUarbPR28gQcAAAAihAEeAAAAiBAGeAAAACBCGOABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIsSOuGzP+Qmn1ZyXNlXzw9tUL3mpYIWVfhJqvq3Zro33dVh15W6vTpJWreq0awN5iXTDhm9h9xw+0qttGeYnkuVe8hPxUnFvm5IJM41PkpL+z6QFMxAwFvOTGzMp75LKhEisTWdCJBdmzOTEsp8IV5WfyNdX9hIBq1W/Z7FcsOpyuZzdM2keJ0mqm6dfLBXiPN0MLVj8gl27bLl3n+7r8xIWJamh0UvWbgiRrlo0nzuSFDMTo5OZRrvniFFj7NrmNi8tPIj55777ji8Ikexcrfv3nkTMfEbE/STQIPDvp+61n/ZDoNXV0WXVLYv56a6NZgqvJCXNZO9KzT9OPd1+Anx3o1c7eoQ/n43bepxV9/LLL9k9e7v9ZOmGvJfu29bqHycHb+ABAACACGGABwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAixM5ULnV7EemSFE96MfFps06Scum0VZdP+LH3Kfnxv7WyF6tb7O3xexb9dU2nvO1vzfsx3fmkFyld6+20e6YKHSFqvUjpWsKPvq5V/Uzraqlg1cXq/nFqbPCWnwqRZl4q9/m18rapq2eN3TOV8vd/EHiR5qWyH1FfLHr3nkTB30/JhH/viSfM9xwxP859c7T01Vfs2pq5q4aNHGX3jCW8i6rqJ8SreVibXZtK5626eNKLXV/b1L+flc3bVDzu74CYeU67170klcv+LJHJePsqqJTsngnzPJGkmvmOM533ns+S1NbaZNXlszG7Zz7nnyctTd552hX37/vd3Z127YpV3owwemSL3XPLMWOsuuYmb99LUmfHKru2Y41X29zkz2cO3sADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABFiR5J1dPmpVPGYl3KYz3qJYJLU2NrsFRb9JNREa4NdmzZT9pqyftLXmJZhdm0yZabb1vyUvTUvLrbq+qt+Ym3/Swvt2mKHlwbaHSKJtZDO2bVleX3bm/w0xkrMi0OsBX4SaX+/f04n6942JWP+eRIEfiJg1Tz/qm4Up6Saufy+Pi+Fdq1+uzJmvueo10NEfG6GUiGuvXzGq42HSMytm6dUQ4P/3Mlk/W2q1by6QiHEeRr3tz+d9tI4yyFSkJNmWnex6D8jYjH/fuImvCaTfhJqMkRqq5vuWyv721Qsec+Ili1H2D3bR/ippbWat02lin+erOjw03VTZmJwT59/nJqavHtvJu+nIDcH/nN/+fIVVt3SZa/aPScbNbyBBwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAihAEeAAAAiBAvU1dSodOLvZekdNqLqq7F/Z8fUqnhVl0hRJx6vuRHBWcyXkz1FqNG2z2bRrTatcNHen37Cn6kddfKVV7Pzk67Z05mnrikjBmnnkv78cfJjB89HsiLv65n/eX317z9X4950c+SFDfjzCUpkfJq65kmu+eavm67NhZ4xz+V9o9TNu7tq1jF36dBiFcXlYq3TaWCmRG+mcrm/HMqiHnnaSKZtnvmct79JJHwD36p5EfEV81bXzLtrackpdP+9pfL7rp69z1JqpjXVKXiP0vd4yRJiYR3nuQavJlDkqq1wK6tV0tWXU/Rf+4uKfVadVuNbrR7js2227UrVnrLX7HKn/m6+739JEmtw4ZZdaWKf5wSSXeU9XsmK/61l0x55/TCF5bYPfcxangDDwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABECAM8AAAAECFu/qw+sOPOdtOaGdVcrPjR40kzfrmWa7F7dhTM7GtJ9boXwVsPEX29+pUVdm1NXt/Ozi67Z+fq1VZdvd/v2Vz3j2nMjEnPpPyI9kQia9cqZsaEx/yY8Lh57seT/s/OmZy/TWmztlILcZzqfvR6Xd41lQyx/dWqt/9zMX+bqrGUXdtnxoTXi/7yN0txf5+m0hmrLpttCLH8hFVWLPXZLUvFgl3b2ubF2aeyebtnueo/o5JJb/sTCa9Oksrlsrlse5RQKuWfJ9msdz9LZbzzSZLqpaJdW+jtseqy5r6XpHjcW9eONb12z1dDzBId3d59qrPLP/fXdPr7tLXNW35fwX/u9hb6rbq2Nv/aK5X85SfT3n2qv+DNkS7ewAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhDDAAwAAABHCAA8AAABECAM8AAAAECEM8AAAAECEMMADAAAAEWLHp9VTftJaIu79XNDc4KWrSlIm66W3xRr95L7+sp9yl85465od7u+n4qJFdu2rry71ehb8RLSuHi9lrq/PTy7siXvJfZLU1uYlrPaGSETr6/FSMyUpmfLO02xTiOREeSlzhR4vOU6SSqv9JNx6zTuna3X/3E8k/SRWt9a9niWpocFLY2xo38Lu2dPvXydByTumlZSfxrg5yuab7dqkmcYZi/v304p97vvnc2PLcLs2MNe1v+DfI1NpP4U5FvPuZ7UQKcxubc5MSpekhJmYK0lxs7Ze91K1JalW9be/bm6/m4AtSXV5aZz9IZKdy5UQ72LrXm2x4D9LK1V//3d0enNHS9rvObLdO/8SCf+5V6v4yx8xwrtPjBs/0e7p4A08AAAAECEM8AAAAECEMMADAAAAEcIADwAAAEQIAzwAAAAQIQzwAAAAQIQwwAMAAAARwgAPAAAARAgDPAAAABAhDPAAAABAhMSCIPByfQEAAABsdLyBBwAAACKEAR4AAACIEAZ4AAAAIEIY4AEAAIAIYYAHAAAAIoQBHgAAAIgQBngAAAAgQhjgAQAAgAhhgAcAAAAi5P8Dn4fOxmxcACMAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Correctly Classified Image Probabilities:\n", + "[3.9704251e-08 3.7369830e-06 1.0011699e-03 1.6774460e-03 1.6896901e-04\n", + " 5.3598953e-05 2.8112476e-05 1.7541332e-06 8.2692755e-03 4.7001820e-03\n", + " 5.9508120e-06 3.5456254e-04 1.4327480e-03 7.8624389e-06 4.7671419e-04\n", + " 1.3173281e-04 2.6394307e-04 2.0578760e-03 4.6903061e-04 9.5591712e-04\n", + " 1.7793209e-07 1.8351673e-05 5.7747227e-05 1.3249160e-05 6.5804379e-08\n", + " 1.3138102e-04 3.2140883e-06 2.1515101e-04 1.6258045e-05 1.2720400e-04\n", + " 6.7707754e-07 2.1034831e-03 3.2370750e-05 7.1214467e-01 4.8369868e-03\n", + " 7.7072938e-04 2.3141931e-04 1.2463522e-02 7.9959538e-03 1.9978979e-05\n", + " 2.5143663e-05 1.7453778e-04 3.6914111e-03 2.6112057e-05 1.1961124e-04\n", + " 4.1289575e-05 5.9125415e-04 6.9225962e-06 6.4965202e-06 2.1100153e-07\n", + " 7.0535950e-04 5.7610380e-04 6.5081446e-07 2.7235009e-08 3.0625699e-06\n", + " 1.3518771e-04 1.3900576e-04 1.4563503e-05 6.9332735e-08 1.8032619e-03\n", + " 1.3981168e-06 2.3942068e-06 1.1888686e-07 2.0176709e-04 1.4791091e-03\n", + " 7.4448839e-02 2.3877097e-03 3.5923654e-06 1.2127141e-04 8.4154206e-05\n", + " 4.9271500e-07 4.0585903e-07 2.4675101e-05 2.0690968e-06 2.6992660e-05\n", + " 3.5416865e-06 1.7043258e-05 1.0836832e-04 1.8538088e-04 3.0236880e-03\n", + " 8.7331042e-02 5.5309600e-04 1.1949949e-06 8.0988673e-07 3.0332461e-03\n", + " 1.2944552e-05 3.8928583e-06 2.2506855e-04 4.4390254e-02 1.3077344e-03\n", + " 2.9161209e-05 4.0693203e-06 5.6821585e-07 6.8616174e-07 9.6536567e-04\n", + " 1.8773560e-09 8.7460771e-04 7.7159717e-03 5.8257072e-05 6.5634624e-05]\n", + "Incorrectly Classified Image Probabilities:\n", + "[7.91519142e-06 1.10049652e-04 1.44588656e-03 1.09064241e-03\n", + " 2.20603659e-03 6.03313420e-05 6.85311534e-05 2.41453713e-03\n", + " 6.88577595e-04 6.66590422e-05 4.56819835e-05 7.05271203e-04\n", + " 2.27338243e-02 2.12457590e-03 5.13024970e-05 5.51957451e-03\n", + " 1.28692496e-04 1.85636641e-03 3.58014455e-04 7.77638343e-04\n", + " 2.40813370e-06 9.41019156e-04 3.74008785e-04 1.97096670e-04\n", + " 3.50558519e-04 5.26475080e-04 1.30497268e-04 1.00454758e-03\n", + " 5.66789367e-06 4.49246902e-04 2.01147539e-03 5.20977017e-04\n", + " 5.08372090e-04 3.68260167e-04 1.38302585e-05 5.13177947e-04\n", + " 2.41820817e-05 7.30924681e-03 2.20821399e-04 2.53726848e-05\n", + " 3.26023146e-04 3.89590459e-05 4.57273600e-05 1.22719921e-05\n", + " 5.17462322e-04 1.30089204e-04 4.96045407e-03 9.01291060e-06\n", + " 2.28487697e-04 1.59622300e-02 1.24853847e-04 2.22059880e-05\n", + " 7.98267065e-05 9.06902756e-07 4.25054168e-06 1.08111938e-02\n", + " 3.99136974e-04 1.16454239e-05 7.79397553e-04 6.81035221e-04\n", + " 1.94197416e-03 6.03540457e-06 7.89306359e-05 1.48630017e-04\n", + " 9.22654988e-04 9.63379716e-05 8.93997058e-05 2.34617924e-04\n", + " 1.57422721e-01 1.12495839e-03 3.98312368e-05 1.32745765e-02\n", + " 9.84494295e-03 6.27620495e-04 3.81824007e-04 2.08652389e-04\n", + " 1.77364529e-03 8.65047215e-04 8.91214295e-05 2.35572690e-03\n", + " 1.06652180e-04 3.53486976e-03 3.08790441e-05 1.08623180e-05\n", + " 1.84912114e-05 1.49375130e-03 1.76863032e-05 1.18275420e-04\n", + " 5.03258889e-06 4.92963358e-04 7.06137776e-01 2.93071091e-04\n", + " 2.25465847e-05 3.88768181e-04 9.44820158e-07 2.47685309e-03\n", + " 9.71564077e-06 3.14303252e-05 1.13851813e-04 6.58268618e-05]\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "def display_classification_results(model, x_test, y_test, y_test_one_hot):\n", + " \"\"\"\n", + " Displays a correctly classified image and an incorrectly classified image,\n", + " along with the model's classification probabilities.\n", + "\n", + " Parameters:\n", + " model -- Trained model\n", + " x_test -- Test data\n", + " y_test -- True labels\n", + " y_test_one_hot -- One-hot encoded true labels\n", + " \"\"\"\n", + " # Get model predictions\n", + " y_pred_probs = model.predict(x_test)\n", + " y_pred_classes = np.argmax(y_pred_probs, axis=1)\n", + " y_true_classes = np.argmax(y_test_one_hot, axis=1)\n", + "\n", + " # Find a correctly classified image\n", + " correct_idx = np.where(y_pred_classes == y_true_classes)[0][0]\n", + " correct_image = x_test[correct_idx]\n", + " correct_label = y_true_classes[correct_idx]\n", + " correct_probs = y_pred_probs[correct_idx]\n", + "\n", + " # Find an incorrectly classified image\n", + " incorrect_idx = np.where(y_pred_classes != y_true_classes)[0][0]\n", + " incorrect_image = x_test[incorrect_idx]\n", + " incorrect_true_label = y_true_classes[incorrect_idx]\n", + " incorrect_pred_label = y_pred_classes[incorrect_idx]\n", + " incorrect_probs = y_pred_probs[incorrect_idx]\n", + "\n", + " # Plot the correctly classified image\n", + " plt.figure(figsize=(8, 4))\n", + " plt.subplot(1, 2, 1)\n", + " plt.imshow(correct_image)\n", + " plt.title(f\"Correctly Classified\\nTrue: {correct_label}\")\n", + " plt.axis('off')\n", + "\n", + " # Plot the incorrectly classified image\n", + " plt.subplot(1, 2, 2)\n", + " plt.imshow(incorrect_image)\n", + " plt.title(f\"Incorrectly Classified\\nTrue: {incorrect_true_label}, Pred: {incorrect_pred_label}\")\n", + " plt.axis('off')\n", + "\n", + " plt.tight_layout()\n", + " plt.show()\n", + "\n", + " # Print classification probabilities\n", + " print(f\"Correctly Classified Image Probabilities:\\n{correct_probs}\")\n", + " print(f\"Incorrectly Classified Image Probabilities:\\n{incorrect_probs}\")\n", + "\n", + "# Display classification results\n", + "display_classification_results(enhanced_cnn, x_test, y_test, y_test_one_hot)\n" ] }, { "cell_type": "markdown", "id": "eadfc848700215e8", "metadata": { - "collapsed": false + "collapsed": false, + "id": "eadfc848700215e8" }, "source": [ "### Task 4c: Discussion of the results\n", "\n", - "- Briefly discuss the results. \n", - "- Did the model's performance improve? \n", + "- Briefly discuss the results.\n", + "- Did the model's performance improve?\n", "- Why do you think this is?\n", "- Do you think there is room for further improvement? Why or why not?\n", "- What other techniques might you try in the future?\n", @@ -325,10 +1956,39 @@ "# Your answer here" ] }, + { + "cell_type": "markdown", + "id": "igs9h6Csyx6F", + "metadata": { + "id": "igs9h6Csyx6F" + }, + "source": [ + "### **Discussion of Results**\n", + "\n", + "#### 1. **Model Performance Overview**\n", + "The training and validation accuracy curves indicate consistent improvement over the epochs. Both accuracies increased steadily, and validation accuracy closely follows the training accuracy, suggesting minimal overfitting. This trend highlights the effectiveness of the optimization process and the chosen model architecture.\n", + "\n", + "#### 2. **Performance Improvement**\n", + "Yes, the model's performance improved over the epochs. This improvement can be attributed to a well-configured learning rate, effective gradient updates, and the gradual learning of patterns in the dataset. The close alignment of training and validation curves further reflects that the model generalizes well on unseen data.\n", + "\n", + "#### 3. **Potential for Further Improvement**\n", + "There is room for further improvement. Enhancing data preprocessing through advanced augmentations or better handling of class imbalances could boost performance. Additionally, experimenting with more complex architectures or fine-tuning hyperparameters, such as learning rate and regularization techniques, might yield better results.\n", + "\n", + "### **Future scope for improvement**\n", + "\n", + "#### 1. **Advanced Architectures**\n", + "Implementing deeper or more sophisticated architectures, such as residual networks or attention mechanisms, could improve feature extraction and learning capabilities.\n", + "\n", + "#### 2. **Hyperparameter Optimization**\n", + "Fine-tuning the learning rate, batch size, or adding regularization techniques (e.g., dropout or weight decay) might help mitigate overfitting and enhance performance.\n" + ] + }, { "cell_type": "markdown", "id": "7415f68f", - "metadata": {}, + "metadata": { + "id": "7415f68f" + }, "source": [ "## Criteria\n", "\n", @@ -343,7 +2003,9 @@ { "cell_type": "markdown", "id": "ad0c10bc", - "metadata": {}, + "metadata": { + "id": "ad0c10bc" + }, "source": [ "## Submission Information\n", "\n", @@ -368,14 +2030,27 @@ } ], "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "A100", + "machine_shape": "hm", + "provenance": [] + }, "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", + "display_name": "Python 3", "name": "python3" }, "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", "name": "python", - "version": "3.9.19" + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" } }, "nbformat": 4,