{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "BKMVQtZBTVRo", "outputId": "9774a6fc-a6c8-4535-9cf2-254609ca035c" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Requirement already satisfied: tensorflow in /usr/local/lib/python3.10/dist-packages (2.17.1)\n", "Requirement already satisfied: absl-py>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (1.4.0)\n", "Requirement already satisfied: astunparse>=1.6.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (1.6.3)\n", "Requirement already satisfied: flatbuffers>=24.3.25 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (24.3.25)\n", "Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (0.6.0)\n", "Requirement already satisfied: google-pasta>=0.1.1 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (0.2.0)\n", "Requirement already satisfied: h5py>=3.10.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (3.12.1)\n", "Requirement already satisfied: libclang>=13.0.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (18.1.1)\n", "Requirement already satisfied: ml-dtypes<0.5.0,>=0.3.1 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (0.4.1)\n", "Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (3.4.0)\n", "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from tensorflow) (24.2)\n", "Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.20.3 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (4.25.5)\n", "Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (2.32.3)\n", "Requirement already satisfied: setuptools in /usr/local/lib/python3.10/dist-packages (from tensorflow) (75.1.0)\n", "Requirement already satisfied: six>=1.12.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (1.16.0)\n", "Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (2.5.0)\n", "Requirement already satisfied: typing-extensions>=3.6.6 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (4.12.2)\n", "Requirement already satisfied: wrapt>=1.11.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (1.16.0)\n", "Requirement already satisfied: grpcio<2.0,>=1.24.3 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (1.67.1)\n", "Requirement already satisfied: tensorboard<2.18,>=2.17 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (2.17.1)\n", "Requirement already satisfied: keras>=3.2.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (3.5.0)\n", "Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (0.37.1)\n", "Requirement already satisfied: numpy<2.0.0,>=1.23.5 in /usr/local/lib/python3.10/dist-packages (from tensorflow) (1.26.4)\n", "Requirement already satisfied: wheel<1.0,>=0.23.0 in /usr/local/lib/python3.10/dist-packages (from astunparse>=1.6.0->tensorflow) (0.45.0)\n", "Requirement already satisfied: rich in /usr/local/lib/python3.10/dist-packages (from keras>=3.2.0->tensorflow) (13.9.4)\n", "Requirement already satisfied: namex in /usr/local/lib/python3.10/dist-packages (from keras>=3.2.0->tensorflow) (0.0.8)\n", "Requirement already satisfied: optree in /usr/local/lib/python3.10/dist-packages (from keras>=3.2.0->tensorflow) (0.13.1)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.21.0->tensorflow) (3.4.0)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.21.0->tensorflow) (3.10)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.21.0->tensorflow) (2.2.3)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.21.0->tensorflow) (2024.8.30)\n", "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.10/dist-packages (from tensorboard<2.18,>=2.17->tensorflow) (3.7)\n", "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.10/dist-packages (from tensorboard<2.18,>=2.17->tensorflow) (0.7.2)\n", "Requirement already satisfied: werkzeug>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from tensorboard<2.18,>=2.17->tensorflow) (3.1.3)\n", "Requirement already satisfied: MarkupSafe>=2.1.1 in /usr/local/lib/python3.10/dist-packages (from werkzeug>=1.0.1->tensorboard<2.18,>=2.17->tensorflow) (3.0.2)\n", "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich->keras>=3.2.0->tensorflow) (3.0.0)\n", "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from rich->keras>=3.2.0->tensorflow) (2.18.0)\n", "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich->keras>=3.2.0->tensorflow) (0.1.2)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m631.0/631.0 MB\u001b[0m \u001b[31m2.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.2/1.2 MB\u001b[0m \u001b[31m39.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.5/5.5 MB\u001b[0m \u001b[31m50.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25h" ] } ], "source": [ "!pip install tensorflow\n", "!pip install -q tf-nightly\n", "" ] }, { "cell_type": "code", "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import os\n", "import tensorflow as tf\n", "from tensorflow import keras\n", "from tensorflow.keras import layers, regularizers\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", "from keras.datasets import cifar10\n", "from sklearn.decomposition import PCA\n", "from sklearn.metrics import classification_report\n", "from sklearn.svm import SVC\n", "from sklearn.model_selection import GridSearchCV\n", "import plotly.express as px\n", "import PIL\n", "from PIL import Image\n", "from urllib import request\n", "from io import BytesIO" ], "metadata": { "id": "_6-dl0_2TqDJ" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "\n", "Data Analysis" ], "metadata": { "id": "t6J02L4aTvv4" } }, { "cell_type": "code", "source": [ "from keras.datasets import cifar10\n", "import numpy as np\n", "(X_train, y_train),(X_test, y_test) = cifar10.load_data()\n", "\n", "print(\"Number of classes:\", len(np.unique(y_train)))\n", "print(\"Number of training samples:\", X_train.shape[0])\n", "print(\"Number of testing samples:\", X_test.shape[0])\n", "print(\"Image shape:\", X_train.shape[1:])\n", "\n", "classes = ['Airplane', 'Automobile', 'Bird', 'Cat', 'Deer', 'Dog', 'Frog', 'Horse', 'Ship', 'Truck']\n", "\n", "# Split the dataset into 80% training and 20% testing\n", "split_ratio = 0.8\n", "split_idx = int(len(X_train) * split_ratio)\n", "X_train, X_test = X_train[:split_idx], X_train[split_idx:]\n", "y_train, y_test = y_train[:split_idx], y_train[split_idx:]\n", "\n", "# Demo of the Splitting\n", "print(\"Number of classes after splitting:\", len(np.unique(y_train)))\n", "print(\"Number of training samples after splitting:\", X_train.shape[0])\n", "print(\"Number of testing samples after splitting:\", X_test.shape[0])\n", "print(\"Image shape after splitting:\", X_train.shape[1:])\n", "" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "hvj3r3OtT26w", "outputId": "60395405-2752-437e-ee65-a57388e6721c" }, "execution_count": 5, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Number of classes: 10\n", "Number of training samples: 50000\n", "Number of testing samples: 10000\n", "Image shape: (32, 32, 3)\n", "Number of classes after splitting: 10\n", "Number of training samples after splitting: 40000\n", "Number of testing samples after splitting: 10000\n", "Image shape after splitting: (32, 32, 3)\n" ] } ] }, { "cell_type": "code", "source": [ "import matplotlib.pyplot as plt\n", "X_train = X_train / 255.0\n", "X_test = X_test / 255.0\n", "y_train = y_train.reshape(-1,)\n", "y_test = y_test.reshape(-1,)\n", "def plot_sample(X,y,index):\n", " plt.figure(figsize=(15,2))\n", " plt.imshow(X_train[index])\n", " plt.xlabel(classes[y[index]])\n", " plt.show()\n", "# Demo of the Function\n", "plot_sample(X_train,y_train,56)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 237 }, "id": "wlS49U2EUMPw", "outputId": "d8f3adff-197f-41a6-802c-9cff50e82653" }, "execution_count": 7, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMkAAADcCAYAAADa3YUtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAO5UlEQVR4nO3dX2xT9f/H8VcH60FY2zFgrZVVMDEgohiBjcqFEQpoAvIv6oUJKCgBCgpcOSOQGEz9kxgiIXBhgGiUkRnRQIIyOygx2fgzJYCbUyNKk60lRHc6ButG+/le+PPkVxm896fbOVtfj+Rz0fb09NPRZ3rOoT21KaUUiOiO8syeAJHVMRIiASMhEjASIgEjIRIwEiIBIyESMBIiASMhEjASIkG/RbJ7925MmDABI0aMQFlZGc6cOdNfD0XUr2z98dmtQ4cOYcWKFdi7dy/Kysqwc+dOVFZWorGxEcXFxXe9bzqdRlNTExwOB2w2W7anRgQAUEqhtbUVXq8XeXnCe4XqB6WlpSoYDBqXU6mU8nq9KhQKifeNRqMKAAfHgIxoNCq+JrO+udXR0YG6ujoEAgHjury8PAQCAdTU1Ny2fDKZRCKRMIbih5JpADkcDnGZrEdy7do1pFIpuN3ujOvdbjdisdhty4dCIbhcLmP4fL5sT4nojrqzSW/60a3y8nLoum6MaDRq9pSIMgzP9grHjh2LYcOGIR6PZ1wfj8fh8XhuW17TNGialu1pEGVN1t9J7HY7pk+fjnA4bFyXTqcRDofh9/uz/XBE/a8vR7HupKKiQmmapg4cOKDq6+vVmjVrVGFhoYrFYuJ9dV03/YgHR+4MXdfF12S/RKKUUrt27VI+n0/Z7XZVWlqqamtru3U/RsIxkKM7kfTLfyb2RSKRgMvlMnsalCN0XYfT6bzrMqYf3SKyOkZCJGAkRAJGQiRgJEQCRkIkYCREAkZCJGAkRAJGQiRgJEQCRkIkYCREAkZCJGAkRAJGQiRgJEQCRkIkYCREAkZCJGAkRAJGQiRgJEQCRkIkYCREAkZCJGAkRAJGQiRgJEQCRkIkYCREAkZCJGAkRAJGQiRgJEQCRkIkYCREgh5HcurUKSxatAherxc2mw1fffVVxu1KKWzbtg333nsv7rnnHgQCAfz666/Zmi/RgOtxJG1tbZg2bRp2797d5e3vv/8+PvroI+zduxenT5/GqFGjsGDBArS3t/d5skSmEH/p/S4AqMOHDxuX0+m08ng86oMPPjCua2lpUZqmqYMHD3Zrnbqum/bD9xy5N3RdF1+TWd0nuXz5MmKxGAKBgHGdy+VCWVkZampqurxPMplEIpHIGERWktVIYrEYAMDtdmdc73a7jdv+KxQKweVyGaOkpCSbUyLqM9OPbpWXl0PXdWNEo1Gzp0SUIauReDweAEA8Hs+4Ph6PG7f9l6ZpcDqdGYPISrIaycSJE+HxeBAOh43rEokETp8+Db/fn82HIhoww3t6h+vXr+O3334zLl++fBnnz59HUVERfD4fNm3ahB07duDBBx/ExIkTsXXrVni9XixZsiSb8yYaOD097HvixIkuD6WtXLnSOAy8detW5Xa7laZpau7cuaqxsbHb6+chYI6BHN05BGxTSilYSCKRgMvlMnsalCN0XRf3g00/ukVkdYyESMBIiASMhEjASIgEjIRIwEiIBIyESMBIiASMhEjASIgEjIRIwEiIBIyESMBIiASMhEjASIgEjIRIwEiIBIyESMBIiASMhEjASIgEjIRIwEiIBIyESMBIiASMhEjASIgEjIRIwEiIBIyESMBIiASMhEjASIgEjIRIwEiIBD2KJBQKYebMmXA4HCguLsaSJUvQ2NiYsUx7ezuCwSDGjBmDgoICLF++HPF4PKuTJhpIPYokEokgGAyitrYWVVVV6OzsxPz589HW1mYss3nzZhw5cgSVlZWIRCJoamrCsmXLsj5xogEj/tL7XVy9elUBUJFIRCmlVEtLi8rPz1eVlZXGMg0NDQqAqqmp6dY6dV037YfvOXJv6Louvib7tE+i6zoAoKioCABQV1eHzs5OBAIBY5nJkyfD5/Ohpqamy3Ukk0kkEomMQWQlvY4knU5j06ZNmD17NqZOnQoAiMVisNvtKCwszFjW7XYjFot1uZ5QKASXy2WMkpKS3k6JqF/0OpJgMIhLly6hoqKiTxMoLy+HruvGiEajfVofUbYN782dNmzYgKNHj+LUqVMYP368cb3H40FHRwdaWloy3k3i8Tg8Hk+X69I0DZqm9WYaRAOjJzvq6XRaBYNB5fV61S+//HLb7f/uuH/xxRfGdT///LMCuOPOYc3RnR33HkWybt065XK51MmTJ1Vzc7Mxbty4YSyzdu1a5fP5VHV1tTp37pzy+/3K7/d3+zEYCcdAjqxHcqcH2r9/v7HMzZs31fr169Xo0aPVyJEj1dKlS1VzczMj4bDk6E4ktv978VtGIpGAy+UyexqUI3Rdh9PpvOsy/OwWkYCREAkYCZGAkRAJGAmRgJEQCRgJkYCREAkYCZGAkRAJGAmRgJEQCRgJkYCREAkYCZGAkRAJGAmRgJEQCRgJkYCREAkYCZGAkRAJGAmRgJEQCRgJkYCREAkYCZGAkRAJGAmRgJEQCRgJkYCREAkYCZGAkRAJGAmRgJEQCRgJkaBHkezZswePPvoonE4nnE4n/H4/jh07Ztze3t6OYDCIMWPGoKCgAMuXL0c8Hs/6pIkGUo8iGT9+PN59913U1dXh3LlzmDNnDhYvXoyffvoJALB582YcOXIElZWViEQiaGpqwrJly/pl4kQDRvyld8Ho0aPVxx9/rFpaWlR+fr6qrKw0bmtoaFAAVE1NTbfXp+u6aT98z5F7Q9d18TXZ632SVCqFiooKtLW1we/3o66uDp2dnQgEAsYykydPhs/nQ01NTW8fhsh0w3t6h4sXL8Lv96O9vR0FBQU4fPgwpkyZgvPnz8Nut6OwsDBjebfbjVgsdsf1JZNJJJNJ43IikejplIj6VY/fSSZNmoTz58/j9OnTWLduHVauXIn6+vpeTyAUCsHlchmjpKSk1+si6he92hH5f+bOnavWrFmjwuGwAqD+/vvvjNt9Pp/68MMP73j/9vZ2peu6MaLRqOnbqRy5M/p1n+Rf6XQayWQS06dPR35+PsLhsHFbY2Mjrly5Ar/ff8f7a5pmHFL+d1B22LoYuSKbz71H+yTl5eV45pln4PP50Nrais8//xwnT57Et99+C5fLhdWrV2PLli0oKiqC0+nExo0b4ff7MWvWrD5MkchkPdm0WrVqlbr//vuV3W5X48aNU3PnzlXHjx83br9586Zav369Gj16tBo5cqRaunSpam5u7slD8BBwFoeti2H2nKz23LuzuWVTSilYSCKRgMvlMnsaQ0JXmxiW+sfuR9197rqui5v4PT4E3N8s1uyglst/ye4+9+683iz3AcfW1lazp0A5pDuvN8ttbqXTaTQ1NcHhcKC1tRUlJSWIRqM86mWCRCIxZP/+Sim0trbC6/UiL+/u7xWW29zKy8vD+PHjAQA22z9bljw0bK6h+vfv7r6v5Ta3iKyGkRAJLB2JpmnYvn07NE0zeyo5iX//f1hux53Iaiz9TkJkBYyESMBIiASMhEhg2Uh2796NCRMmYMSIESgrK8OZM2fMntKQFAqFMHPmTDgcDhQXF2PJkiVobGzMWCbXTxVlyUgOHTqELVu2YPv27fjhhx8wbdo0LFiwAFevXjV7akNOJBJBMBhEbW0tqqqq0NnZifnz56Otrc1YJudPFdWjL3sMkNLSUhUMBo3LqVRKeb1eFQqFTJxVbrh69aoCoCKRiFJKZe1UUYOZ5d5JOjo6UFdXl3Fqory8PAQCAZ6aaADoug4AKCoqAgCeKgoW3Ny6du0aUqkU3G53xvXSqYmo79LpNDZt2oTZs2dj6tSpAIBYLNarU0UNJZb7FDCZJxgM4tKlS/j+++/NnoqlWO6dZOzYsRg2bNhtR0/i8Tg8Ho9Jsxr6NmzYgKNHj+LEiRPGVxUAwOPxoKOjAy0tLRnL59K/h+UisdvtmD59esapidLpNMLh8F1PTUS9o5TChg0bcPjwYVRXV2PixIkZt/f2VFFDitlHDrpSUVGhNE1TBw4cUPX19WrNmjWqsLBQxWIxs6c25Kxbt065XC518uRJ1dzcbIwbN24Yy6xdu1b5fD5VXV2tzp07p/x+v/L7/SbOemBZMhKllNq1a5fy+XzKbrer0tJSVVtba/aUhiTc4VQ7+/fvN5bJxqmiBjN+VJ5IYLl9EiKrYSREAkZCJGAkRAJGQiRgJEQCRkIkYCREAkZiUS+99BJsNhtsNhvy8/Phdrsxb9487Nu3D+l02uzp5RRGYmFPP/00mpub8ccff+DYsWN46qmn8Prrr2PhwoW4deuW2dPLGYzEwjRNg8fjwX333YfHH38cb775Jr7++mscO3YMBw4cAABcuXIFixcvRkFBAZxOJ55//vnbvmawY8cOFBcXw+Fw4JVXXsEbb7yBxx57bOCf0CDFSAaZOXPmYNq0afjyyy+RTqexePFi/PXXX4hEIqiqqsLvv/+OF154wVj+s88+wzvvvIP33nsPdXV18Pl82LNnj4nPYPDhNxMHocmTJ+PChQsIh8O4ePEiLl++jJKSEgDAJ598gocffhhnz57FzJkzsWvXLqxevRovv/wyAGDbtm04fvw4rl+/buZTGFT4TjIIKaVgs9nQ0NCAkpISIxAAmDJlCgoLC9HQ0ADgny9IlZaWZtz/v5fp7hjJINTQ0HDbNwip/zCSQaa6uhoXL17E8uXL8dBDDyEajSIajRq319fXo6WlBVOmTAEATJo0CWfPns1Yx38v091xn8TCkskkYrEYUqkU4vE4vvnmG4RCISxcuBArVqxAXl4eHnnkEbz44ovYuXMnbt26hfXr1+PJJ5/EjBkzAAAbN27Eq6++ihkzZuCJJ57AoUOHcOHCBTzwwAMmP7tBxORvRtIdrFy50vgq7fDhw9W4ceNUIBBQ+/btU6lUyljuzz//VM8++6waNWqUcjgc6rnnnrvtXABvv/22Gjt2rCooKFCrVq1Sr732mpo1a9ZAP6VBi1/fzUHz5s2Dx+PBp59+avZUBgVubg1xN27cwN69e7FgwQIMGzYMBw8exHfffYeqqiqzpzZo8J1kiLt58yYWLVqEH3/8Ee3t7Zg0aRLeeuut3DorfB8xEiIBDwETCRgJkYCREAkYCZGAkRAJGAmRgJEQCRgJkYCREAn+Bz6Co+b5qnPpAAAAAElFTkSuQmCC\n" }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [ "CNN(Convolutional Neural Network)\n", "\n" ], "metadata": { "id": "WAqcNWdfUY4v" } }, { "cell_type": "code", "source": [ "import tensorflow as tf\n", "from tensorflow import keras\n", "from tensorflow.keras import layers, regularizers\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", "from keras.datasets import cifar10\n", "from sklearn.decomposition import PCA\n", "from sklearn.metrics import classification_report\n", "from sklearn.svm import SVC\n", "from sklearn.model_selection import GridSearchCV\n", "import plotly.express as px\n", "import PIL\n", "from PIL import Image\n", "from urllib import request\n", "from io import BytesIO\n", "num_classes = 10\n", "weight_decay = 1e-4\n", "\n", "model = tf.keras.models.Sequential([\n", " tf.keras.layers.Conv2D(32, (3, 3), padding='same', activation=tf.keras.layers.LeakyReLU(alpha=0.1), kernel_regularizer=regularizers.l2(weight_decay)),\n", " tf.keras.layers.MaxPooling2D(2, 2),\n", " tf.keras.layers.Conv2D(64, (3, 3), padding='same', activation=tf.keras.layers.LeakyReLU(alpha=0.1), kernel_regularizer=regularizers.l2(weight_decay)),\n", " tf.keras.layers.MaxPooling2D(2, 2),\n", " tf.keras.layers.Conv2D(128, (3, 3), padding='same', activation=tf.keras.layers.LeakyReLU(alpha=0.1), kernel_regularizer=regularizers.l2(weight_decay)),\n", " tf.keras.layers.Dropout(0.2),\n", " tf.keras.layers.Flatten(),\n", " tf.keras.layers.Dense(256, activation=tf.keras.layers.LeakyReLU(alpha=0.1)),\n", " tf.keras.layers.Dense(num_classes)\n", "])\n", "\n", "# Compile the model\n", "model.compile(optimizer='adam',\n", " loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", " metrics=['accuracy'])" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nnjlvzrSUaDn", "outputId": "30a0d4be-a86a-4897-8f0c-0eeb13e54019" }, "execution_count": 10, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.10/dist-packages/keras/src/layers/activations/leaky_relu.py:41: UserWarning: Argument `alpha` is deprecated. Use `negative_slope` instead.\n", " warnings.warn(\n" ] } ] }, { "cell_type": "markdown", "source": [ "Training the model with data augmentation" ], "metadata": { "id": "GLg9kUDhUr_w" } }, { "cell_type": "code", "source": [ "# Data augmentation\n", "data_augmentation = tf.keras.preprocessing.image.ImageDataGenerator(\n", " rotation_range=15,\n", " width_shift_range=0.1,\n", " height_shift_range=0.1,\n", " zoom_range=0.2,\n", " horizontal_flip=True\n", ")\n", "\n", "batch_size = 32\n", "epochs = 3\n", "history = model.fit(\n", " data_augmentation.flow(X_train, y_train, batch_size=batch_size),\n", " steps_per_epoch=len(X_train) // batch_size,\n", " epochs=epochs\n", ")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "yL50MdNGU563", "outputId": "86578f35-970b-4876-f33f-b46505461abc" }, "execution_count": 12, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/3\n", "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m142s\u001b[0m 113ms/step - accuracy: 0.1004 - loss: 2.3036\n", "Epoch 2/3\n", "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m140s\u001b[0m 112ms/step - accuracy: 0.0967 - loss: 2.3045\n", "Epoch 3/3\n", "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m142s\u001b[0m 111ms/step - accuracy: 0.1019 - loss: 2.3034\n" ] } ] }, { "cell_type": "markdown", "source": [ "Testing the accuracy of the model" ], "metadata": { "id": "fP-goW_0Wng-" } }, { "cell_type": "code", "source": [ "test_loss, test_accuracy = model.evaluate(X_test, y_test)\n", "print(\"Test Accuracy:\", test_accuracy)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "H2ipAfS_WohW", "outputId": "1583112a-f6fb-48d6-adeb-fd42cce9c35b" }, "execution_count": 13, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 23ms/step - accuracy: 0.1038 - loss: 2.3027\n", "Test Accuracy: 0.10140000283718109\n" ] } ] }, { "cell_type": "markdown", "source": [ "Plotting graph for the training acuracy and training loss\n", "\n" ], "metadata": { "id": "0pALB3rsXFZm" } }, { "cell_type": "code", "source": [ "acc = history.history['accuracy']\n", "loss = history.history['loss']\n", "epochs_range = range(epochs)\n", "\n", "plt.figure(figsize=(8, 4))\n", "\n", "plt.subplot(1, 2, 1)\n", "plt.plot(epochs_range, acc, label='Training Accuracy')\n", "plt.legend(loc='lower right')\n", "plt.title('Training Accuracy')\n", "\n", "plt.subplot(1, 2, 2)\n", "plt.plot(epochs_range, loss, label='Training Loss')\n", "plt.legend(loc='upper right')\n", "plt.title('Training Loss')\n", "\n", "plt.tight_layout()\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 407 }, "id": "RIYu1WA4XGaP", "outputId": "3fd1fe61-82d5-4736-b7da-03f2ad26700a" }, "execution_count": 14, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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tXz9+/f/2V9Ds2bNwp49e3DkyBF06NBBb9nWdB+yFrYPhrGNaH5sI4zXGtoHwPptBBOLRlAqlejTpw+Sk5Ol12pqapCcnKzzi8rjBg4cqFMeAA4ePNhg+WdZU+rnSVqtFhkZGfDy8jJXmM+U1nT9NKf09PSf7TUkhMCsWbOwc+dOHD58GH5+fgb34XVkfmwfDGMb0fxa2zXUHH7O7QPQgtqIJg/7bmW2bNkiVCqVSExMFFlZWWLmzJnCxcVF5OXlCSGEmDx5sliwYIFUPjU1VdjY2IgVK1aI7OxsER8fL2xtbUVGRoa1PoJZGVs/b7/9tti/f7+4cuWKOHv2rHj55ZeFWq0WFy5csNZHMKuSkhKRlpYm0tLSBADx4YcfirS0NHHjxg0hhBALFiwQkydPlspfvXpVaDQa8eabb4rs7GyxevVqoVAoxL59+6z1EczO2Dr66KOPxK5du8SlS5dERkaGmDNnjpDL5eLQoUPW+ghm9bvf/U44OzuLlJQUkZubK21lZWVSmdZ+H7IWtg+GsY3Qj22EfmwfDGspbQQTCyN88sknwtfXVyiVStG/f39x8uRJ6b3BgweLqVOn6pT/6quvRJcuXYRSqRTdu3cXe/futXDElmVM/cTExEhlPTw8xMiRI8W5c+esELVl1E199+RWVydTp04VgwcPfmqfkJAQoVQqRadOncT69estHrclGVtHy5cvF507dxZqtVq4urqKsLAwcfjwYesEbwH11Q0AneuC9yHrYftgGNuIhrGN0I/tg2EtpY2Q/RQMERERERFRk3GMBRERERERmYyJBRERERERmYyJBRERERERmYyJBRERERERmYyJBRERERERmYyJBRERERERmYyJBRERERERmYyJBRERERERmYyJBRERERERmYyJBRERERERmYyJBRERERERmYyJBRERERERmez/AGtdTDVC+49zAAAAAElFTkSuQmCC\n" }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [ "\n", "Testing the model" ], "metadata": { "id": "gIE7SY9NXUU3" } }, { "cell_type": "code", "source": [ "y_pred = model.predict(X_test)\n", "y_pred_classes = np.argmax(y_pred, axis=1)\n", "classification_rep = classification_report(y_test, y_pred_classes, target_names=classes)\n", "print(classification_rep)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "_zPJC-BoXV2W", "outputId": "4ee35160-0215-4de4-d1a2-9bc9ac883d85" }, "execution_count": 15, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 45ms/step\n", " precision recall f1-score support\n", "\n", " Airplane 0.00 0.00 0.00 1014\n", " Automobile 0.10 1.00 0.18 1014\n", " Bird 0.00 0.00 0.00 952\n", " Cat 0.00 0.00 0.00 1016\n", " Deer 0.00 0.00 0.00 997\n", " Dog 0.00 0.00 0.00 1025\n", " Frog 0.00 0.00 0.00 980\n", " Horse 0.00 0.00 0.00 977\n", " Ship 0.00 0.00 0.00 1003\n", " Truck 0.00 0.00 0.00 1022\n", "\n", " accuracy 0.10 10000\n", " macro avg 0.01 0.10 0.02 10000\n", "weighted avg 0.01 0.10 0.02 10000\n", "\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n", "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n", "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n", " _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n" ] } ] }, { "cell_type": "markdown", "source": [ "\n", "SVM MODEL" ], "metadata": { "id": "k5iu14aiXdfu" } }, { "cell_type": "code", "source": [ "X_train_flatten = X_train.reshape(X_train.shape[0], -1)\n", "X_test_flatten = X_test.reshape(X_test.shape[0], -1)\n", "\n", "svm_model = SVC()\n", "\n", "param_grid = {\n", " 'C': [0.1, 1, 10],\n", " 'kernel': ['linear', 'rbf'],\n", " 'gamma': ['scale', 'auto']\n", "}\n", "\n", "grid_search = GridSearchCV(svm_model, param_grid, cv=3, n_jobs=-1)\n", "\n", "grid_search.fit(X_train_flatten, y_train)\n", "\n", "best_params = grid_search.best_params_\n", "best_svm_model = grid_search.best_estimator_\n", "\n", "print(\"Best Parameters:\", best_params)\n", "\n", "# Testing the SVM model\n", "svm_test_accuracy = best_svm_model.score(X_test_flatten, y_test)\n", "print(\"SVM Test Accuracy:\", svm_test_accuracy)" ], "metadata": { "id": "nEuAW8KiXhpm" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "3D Visualization of Augmented CIFAR-10 Data" ], "metadata": { "id": "gDkQ7d2hXqAw" } }, { "cell_type": "code", "source": [ "#just in case we don't run svm model\n", "X_train_flatten = X_train.reshape(X_train.shape[0], -1)\n", "\n", "pca = PCA(n_components=3)\n", "x_train_pca = pca.fit_transform(X_train_flatten)\n", "\n", "fig = px.scatter_3d(x=x_train_pca[:, 0], y=x_train_pca[:, 1], z=x_train_pca[:, 2], color=y_train.flatten(),\n", " labels={'color': 'Class'}, title='3D Visualization of Augmented CIFAR-10 Data')\n", "fig.show()" ], "metadata": { "id": "w-96tqV-Xq3n" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Comparing the original and augumented image" ], "metadata": { "id": "_YGS9C4sXw3J" } }, { "cell_type": "code", "source": [ "index = 56\n", "\n", "original_image = X_train[index]\n", "augmented_image = data_augmentation.random_transform(original_image)\n", "\n", "plt.figure(figsize=(8, 4))\n", "\n", "plt.subplot(1, 2, 1)\n", "plt.imshow(original_image)\n", "plt.title(\"Original Image\")\n", "plt.axis('off')\n", "\n", "plt.subplot(1, 2, 2)\n", "plt.imshow(augmented_image)\n", "plt.title(\"Augmented Image\")\n", "plt.axis('off')\n", "\n", "plt.tight_layout()\n", "plt.show()" ], "metadata": { "id": "doSstjoVXxjv" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "random_url = \"https://www.lamborghini.com/sites/it-en/files/DAM/lamborghini/facelift_2019/homepage/families-gallery/2023/revuelto/revuelto_m.png\"\n", "\n", "res = request.urlopen(random_url).read()\n", "Sample_Image = Image.open(BytesIO(res)).resize((50,25))\n", "\n", "plt.imshow(Sample_Image)\n", "\n", "random_path = tf.keras.utils.get_file('dbcjdc',origin = random_url)\n", "\n", "img = keras.preprocessing.image.load_img(\n", " random_path, target_size=(32, 32)\n", ")\n", "img_array = keras.preprocessing.image.img_to_array (img)\n", "img_array = tf.expand_dims (img_array, 0) # Create a batch\n", "\n", "predictions = model.predict (img_array)\n", "score = tf.nn.softmax(predictions [0])\n", "\n", "print(\n", " \"This image most likely belongs to {} with a {:.2f} percent confidence.\"\n", " .format (classes [np.argmax(score)], 100 * np.max(score))\n", ")" ], "metadata": { "id": "5Vq_twUgYKXP" }, "execution_count": null, "outputs": [] } ] }