{ "metadata": { "kernelspec": { "language": "python", "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python", "version": "3.11.13", "mimetype": "text/x-python", "codemirror_mode": { "name": "ipython", "version": 3 }, "pygments_lexer": "ipython3", "nbconvert_exporter": "python", "file_extension": ".py" }, "kaggle": { "accelerator": "none", "dataSources": [ { "sourceId": 10705, "sourceType": "datasetVersion", "datasetId": 7160 } ], "dockerImageVersionId": 31089, "isInternetEnabled": false, "language": "python", "sourceType": "notebook", "isGpuEnabled": false }, "colab": { "provenance": [] } }, "nbformat_minor": 0, "nbformat": 4, "cells": [ { "cell_type": "code", "source": [ "# This Python 3 environment comes with many helpful analytics libraries installed\n", "# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n", "# For example, here's several helpful packages to load\n", "\n", "import numpy as np # linear algebra\n", "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n", "\n", "# Input data files are available in the read-only \"../input/\" directory\n", "# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n", "\n", "import os\n", "for dirname, _, filenames in os.walk('/kaggle/input'):\n", " for filename in filenames:\n", " print(os.path.join(dirname, filename))\n", "\n", "# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\"\n", "# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session\n", "\n", "import kagglehub\n", "crawford_emnist_path = kagglehub.dataset_download('crawford/emnist')" ], "metadata": { "id": "txyCPT09KCiA" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "# This Python 3 environment comes with many helpful analytics libraries installed\n", "# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n", "# For example, here's several helpful packages to load\n", "\n", "import numpy as np # linear algebra\n", "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n", "\n", "# Input data files are available in the read-only \"../input/\" directory\n", "# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n", "\n", "import os\n", "for dirname, _, filenames in os.walk('/kaggle/input'):\n", " for filename in filenames:\n", " print(os.path.join(dirname, filename))\n", "\n", "# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\"\n", "# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session" ], "metadata": { "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5", "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19", "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:05.927699Z", "iopub.execute_input": "2025-08-03T20:11:05.928096Z", "iopub.status.idle": "2025-08-03T20:11:05.969546Z", "shell.execute_reply.started": "2025-08-03T20:11:05.928068Z", "shell.execute_reply": "2025-08-03T20:11:05.968625Z" }, "collapsed": true, "jupyter": { "outputs_hidden": true }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "IE6KnyyiqzVu", "outputId": "bb6a5dc1-6fb5-4daa-f1df-1166c1ea6d38" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "/kaggle/input/emnist/emnist-letters-mapping.txt\n", "/kaggle/input/emnist/emnist-letters-test.csv\n", "/kaggle/input/emnist/emnist-mnist-mapping.txt\n", "/kaggle/input/emnist/emnist-digits-train.csv\n", "/kaggle/input/emnist/emnist-bymerge-mapping.txt\n", "/kaggle/input/emnist/emnist-balanced-train.csv\n", "/kaggle/input/emnist/emnist-digits-test.csv\n", "/kaggle/input/emnist/emnist-balanced-test.csv\n", "/kaggle/input/emnist/emnist-mnist-test.csv\n", "/kaggle/input/emnist/emnist-letters-train.csv\n", "/kaggle/input/emnist/emnist-byclass-train.csv\n", "/kaggle/input/emnist/emnist-bymerge-test.csv\n", "/kaggle/input/emnist/emnist-balanced-mapping.txt\n", "/kaggle/input/emnist/emnist-mnist-train.csv\n", "/kaggle/input/emnist/emnist-digits-mapping.txt\n", "/kaggle/input/emnist/emnist-bymerge-train.csv\n", "/kaggle/input/emnist/emnist-byclass-test.csv\n", "/kaggle/input/emnist/emnist-byclass-mapping.txt\n", "/kaggle/input/emnist/emnist_source_files/emnist-digits-test-labels-idx1-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-bymerge-train-labels-idx1-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-letters-test-labels-idx1-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-byclass-train-images-idx3-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-byclass-test-images-idx3-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-mnist-train-images-idx3-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-digits-train-labels-idx1-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-bymerge-test-images-idx3-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-bymerge-test-labels-idx1-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-mnist-test-labels-idx1-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-balanced-test-labels-idx1-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-balanced-test-images-idx3-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-mnist-test-images-idx3-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-bymerge-train-images-idx3-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-letters-train-labels-idx1-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-digits-train-images-idx3-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-byclass-train-labels-idx1-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-balanced-train-images-idx3-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-balanced-train-labels-idx1-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-letters-test-images-idx3-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-byclass-test-labels-idx1-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-letters-train-images-idx3-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-mnist-train-labels-idx1-ubyte\n", "/kaggle/input/emnist/emnist_source_files/emnist-digits-test-images-idx3-ubyte\n" ] } ], "execution_count": null }, { "cell_type": "code", "source": [ "import tensorflow as tf\n", "from tensorflow import keras\n", "from tensorflow.keras import Sequential\n", "from tensorflow.keras.layers import Flatten,Dense,Conv2D,MaxPooling2D,ZeroPadding2D,Dropout\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", "print(tf.__version__)" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:05.971067Z", "iopub.execute_input": "2025-08-03T20:11:05.971396Z", "iopub.status.idle": "2025-08-03T20:11:05.978259Z", "shell.execute_reply.started": "2025-08-03T20:11:05.971374Z", "shell.execute_reply": "2025-08-03T20:11:05.976659Z" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "HKENR4l-qzVu", "outputId": "d1419725-89a1-430d-b368-7401f0af8658" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "2.18.0\n" ] } ], "execution_count": null }, { "cell_type": "code", "source": [ "img_width=28\n", "img_height=28" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:05.979231Z", "iopub.execute_input": "2025-08-03T20:11:05.979554Z", "iopub.status.idle": "2025-08-03T20:11:05.996388Z", "shell.execute_reply.started": "2025-08-03T20:11:05.979532Z", "shell.execute_reply": "2025-08-03T20:11:05.99529Z" }, "id": "T48UCCnhqzVv" }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": [ "datagen=ImageDataGenerator(1/255.0,validation_split=0.2)" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:05.998784Z", "iopub.execute_input": "2025-08-03T20:11:05.999162Z", "iopub.status.idle": "2025-08-03T20:11:06.016479Z", "shell.execute_reply.started": "2025-08-03T20:11:05.999132Z", "shell.execute_reply": "2025-08-03T20:11:06.015236Z" }, "id": "PEOMsQTbqzVv" }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": [ "# data = pd.read_csv(\"/kaggle/input/emnist/emnist-digits-train.csv\") # Original code\n", "data = pd.read_csv(crawford_emnist_path + \"/emnist-digits-train.csv\") # Corrected path" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:06.017695Z", "iopub.execute_input": "2025-08-03T20:11:06.018051Z", "iopub.status.idle": "2025-08-03T20:11:22.149542Z", "shell.execute_reply.started": "2025-08-03T20:11:06.018021Z", "shell.execute_reply": "2025-08-03T20:11:22.148551Z" }, "id": "liRgnVVoqzVv" }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": [ "data.head()" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:22.150575Z", "iopub.execute_input": "2025-08-03T20:11:22.150942Z", "iopub.status.idle": "2025-08-03T20:11:22.166806Z", "shell.execute_reply.started": "2025-08-03T20:11:22.150917Z", "shell.execute_reply": "2025-08-03T20:11:22.165799Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 235 }, "id": "2XuHBxa_qzVw", "outputId": "6767cbd7-b174-4574-d052-54b3dfd5ecfe" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 8 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 ... 0.511 0.512 0.513 \\\n", "0 9 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "1 6 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "2 3 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "3 6 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "4 6 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "\n", " 0.514 0.515 0.516 0.517 0.518 0.519 0.520 \n", "0 0 0 0 0 0 0 0 \n", "1 0 0 0 0 0 0 0 \n", "2 0 0 0 0 0 0 0 \n", "3 0 0 0 0 0 0 0 \n", "4 0 0 0 0 0 0 0 \n", "\n", "[5 rows x 785 columns]" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
800.10.20.30.40.50.60.70.8...0.5110.5120.5130.5140.5150.5160.5170.5180.5190.520
09000000000...0000000000
16000000000...0000000000
23000000000...0000000000
36000000000...0000000000
46000000000...0000000000
\n", "

5 rows × 785 columns

\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "data" } }, "metadata": {}, "execution_count": 15 } ], "execution_count": null }, { "cell_type": "code", "source": [ "data.shape" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:22.167639Z", "iopub.execute_input": "2025-08-03T20:11:22.167904Z", "iopub.status.idle": "2025-08-03T20:11:22.189175Z", "shell.execute_reply.started": "2025-08-03T20:11:22.167885Z", "shell.execute_reply": "2025-08-03T20:11:22.188421Z" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "rDSf6o_AqzVw", "outputId": "ca92f271-6a3a-4c46-f1f3-2c4ef810f602" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(239999, 785)" ] }, "metadata": {}, "execution_count": 16 } ], "execution_count": null }, { "cell_type": "code", "source": [ "data.info" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:22.190191Z", "iopub.execute_input": "2025-08-03T20:11:22.190527Z", "iopub.status.idle": "2025-08-03T20:11:22.226427Z", "shell.execute_reply.started": "2025-08-03T20:11:22.190504Z", "shell.execute_reply": "2025-08-03T20:11:22.225554Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 203 }, "id": "6MO_mrbnqzVw", "outputId": "afde63f0-6a90-4c3e-dbed-8ce52c46ff60" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ], "text/html": [ "
\n", "
pandas.core.frame.DataFrame.info
def info(verbose: bool | None=None, buf: WriteBuffer[str] | None=None, max_cols: int | None=None, memory_usage: bool | str | None=None, show_counts: bool | None=None) -> None
/usr/local/lib/python3.11/dist-packages/pandas/core/frame.pyPrint a concise summary of a DataFrame.\n",
              "\n",
              "This method prints information about a DataFrame including\n",
              "the index dtype and columns, non-null values and memory usage.\n",
              "\n",
              "Parameters\n",
              "----------\n",
              "verbose : bool, optional\n",
              "    Whether to print the full summary. By default, the setting in\n",
              "    ``pandas.options.display.max_info_columns`` is followed.\n",
              "buf : writable buffer, defaults to sys.stdout\n",
              "    Where to send the output. By default, the output is printed to\n",
              "    sys.stdout. Pass a writable buffer if you need to further process\n",
              "    the output.\n",
              "max_cols : int, optional\n",
              "    When to switch from the verbose to the truncated output. If the\n",
              "    DataFrame has more than `max_cols` columns, the truncated output\n",
              "    is used. By default, the setting in\n",
              "    ``pandas.options.display.max_info_columns`` is used.\n",
              "memory_usage : bool, str, optional\n",
              "    Specifies whether total memory usage of the DataFrame\n",
              "    elements (including the index) should be displayed. By default,\n",
              "    this follows the ``pandas.options.display.memory_usage`` setting.\n",
              "\n",
              "    True always show memory usage. False never shows memory usage.\n",
              "    A value of 'deep' is equivalent to "True with deep introspection".\n",
              "    Memory usage is shown in human-readable units (base-2\n",
              "    representation). Without deep introspection a memory estimation is\n",
              "    made based in column dtype and number of rows assuming values\n",
              "    consume the same memory amount for corresponding dtypes. With deep\n",
              "    memory introspection, a real memory usage calculation is performed\n",
              "    at the cost of computational resources. See the\n",
              "    :ref:`Frequently Asked Questions <df-memory-usage>` for more\n",
              "    details.\n",
              "show_counts : bool, optional\n",
              "    Whether to show the non-null counts. By default, this is shown\n",
              "    only if the DataFrame is smaller than\n",
              "    ``pandas.options.display.max_info_rows`` and\n",
              "    ``pandas.options.display.max_info_columns``. A value of True always\n",
              "    shows the counts, and False never shows the counts.\n",
              "\n",
              "Returns\n",
              "-------\n",
              "None\n",
              "    This method prints a summary of a DataFrame and returns None.\n",
              "\n",
              "See Also\n",
              "--------\n",
              "DataFrame.describe: Generate descriptive statistics of DataFrame\n",
              "    columns.\n",
              "DataFrame.memory_usage: Memory usage of DataFrame columns.\n",
              "\n",
              "Examples\n",
              "--------\n",
              ">>> int_values = [1, 2, 3, 4, 5]\n",
              ">>> text_values = ['alpha', 'beta', 'gamma', 'delta', 'epsilon']\n",
              ">>> float_values = [0.0, 0.25, 0.5, 0.75, 1.0]\n",
              ">>> df = pd.DataFrame({"int_col": int_values, "text_col": text_values,\n",
              "...                   "float_col": float_values})\n",
              ">>> df\n",
              "    int_col text_col  float_col\n",
              "0        1    alpha       0.00\n",
              "1        2     beta       0.25\n",
              "2        3    gamma       0.50\n",
              "3        4    delta       0.75\n",
              "4        5  epsilon       1.00\n",
              "\n",
              "Prints information of all columns:\n",
              "\n",
              ">>> df.info(verbose=True)\n",
              "<class 'pandas.core.frame.DataFrame'>\n",
              "RangeIndex: 5 entries, 0 to 4\n",
              "Data columns (total 3 columns):\n",
              " #   Column     Non-Null Count  Dtype\n",
              "---  ------     --------------  -----\n",
              " 0   int_col    5 non-null      int64\n",
              " 1   text_col   5 non-null      object\n",
              " 2   float_col  5 non-null      float64\n",
              "dtypes: float64(1), int64(1), object(1)\n",
              "memory usage: 248.0+ bytes\n",
              "\n",
              "Prints a summary of columns count and its dtypes but not per column\n",
              "information:\n",
              "\n",
              ">>> df.info(verbose=False)\n",
              "<class 'pandas.core.frame.DataFrame'>\n",
              "RangeIndex: 5 entries, 0 to 4\n",
              "Columns: 3 entries, int_col to float_col\n",
              "dtypes: float64(1), int64(1), object(1)\n",
              "memory usage: 248.0+ bytes\n",
              "\n",
              "Pipe output of DataFrame.info to buffer instead of sys.stdout, get\n",
              "buffer content and writes to a text file:\n",
              "\n",
              ">>> import io\n",
              ">>> buffer = io.StringIO()\n",
              ">>> df.info(buf=buffer)\n",
              ">>> s = buffer.getvalue()\n",
              ">>> with open("df_info.txt", "w",\n",
              "...           encoding="utf-8") as f:  # doctest: +SKIP\n",
              "...     f.write(s)\n",
              "260\n",
              "\n",
              "The `memory_usage` parameter allows deep introspection mode, specially\n",
              "useful for big DataFrames and fine-tune memory optimization:\n",
              "\n",
              ">>> random_strings_array = np.random.choice(['a', 'b', 'c'], 10 ** 6)\n",
              ">>> df = pd.DataFrame({\n",
              "...     'column_1': np.random.choice(['a', 'b', 'c'], 10 ** 6),\n",
              "...     'column_2': np.random.choice(['a', 'b', 'c'], 10 ** 6),\n",
              "...     'column_3': np.random.choice(['a', 'b', 'c'], 10 ** 6)\n",
              "... })\n",
              ">>> df.info()\n",
              "<class 'pandas.core.frame.DataFrame'>\n",
              "RangeIndex: 1000000 entries, 0 to 999999\n",
              "Data columns (total 3 columns):\n",
              " #   Column    Non-Null Count    Dtype\n",
              "---  ------    --------------    -----\n",
              " 0   column_1  1000000 non-null  object\n",
              " 1   column_2  1000000 non-null  object\n",
              " 2   column_3  1000000 non-null  object\n",
              "dtypes: object(3)\n",
              "memory usage: 22.9+ MB\n",
              "\n",
              ">>> df.info(memory_usage='deep')\n",
              "<class 'pandas.core.frame.DataFrame'>\n",
              "RangeIndex: 1000000 entries, 0 to 999999\n",
              "Data columns (total 3 columns):\n",
              " #   Column    Non-Null Count    Dtype\n",
              "---  ------    --------------    -----\n",
              " 0   column_1  1000000 non-null  object\n",
              " 1   column_2  1000000 non-null  object\n",
              " 2   column_3  1000000 non-null  object\n",
              "dtypes: object(3)\n",
              "memory usage: 165.9 MB
\n", " \n", "
" ] }, "metadata": {}, "execution_count": 17 } ], "execution_count": null }, { "cell_type": "code", "source": [ "data.columns" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:22.229327Z", "iopub.execute_input": "2025-08-03T20:11:22.229626Z", "iopub.status.idle": "2025-08-03T20:11:22.235906Z", "shell.execute_reply.started": "2025-08-03T20:11:22.229571Z", "shell.execute_reply": "2025-08-03T20:11:22.235052Z" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "gqYHkqd8qzVx", "outputId": "a91a0696-8876-4e52-82e7-1a7694a1dc7f" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Index(['8', '0', '0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8',\n", " ...\n", " '0.511', '0.512', '0.513', '0.514', '0.515', '0.516', '0.517', '0.518',\n", " '0.519', '0.520'],\n", " dtype='object', length=785)" ] }, "metadata": {}, "execution_count": 18 } ], "execution_count": null }, { "cell_type": "code", "source": [ "x_train = data.drop(columns=\"8\")\n", "y_train = data[\"8\"]" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:22.236782Z", "iopub.execute_input": "2025-08-03T20:11:22.237103Z", "iopub.status.idle": "2025-08-03T20:11:23.131442Z", "shell.execute_reply.started": "2025-08-03T20:11:22.237082Z", "shell.execute_reply": "2025-08-03T20:11:23.130452Z" }, "id": "sLnCARU6qzVx" }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": [ "x_train.head()" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:23.132545Z", "iopub.execute_input": "2025-08-03T20:11:23.132921Z", "iopub.status.idle": "2025-08-03T20:11:23.148097Z", "shell.execute_reply.started": "2025-08-03T20:11:23.132895Z", "shell.execute_reply": "2025-08-03T20:11:23.147077Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 235 }, "id": "00hohHlMqzVx", "outputId": "460dcd29-d8ed-456d-fc98-de006a2d77ac" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 ... 0.511 0.512 0.513 \\\n", "0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "1 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "2 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "3 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "4 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "\n", " 0.514 0.515 0.516 0.517 0.518 0.519 0.520 \n", "0 0 0 0 0 0 0 0 \n", "1 0 0 0 0 0 0 0 \n", "2 0 0 0 0 0 0 0 \n", "3 0 0 0 0 0 0 0 \n", "4 0 0 0 0 0 0 0 \n", "\n", "[5 rows x 784 columns]" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
00.10.20.30.40.50.60.70.80.9...0.5110.5120.5130.5140.5150.5160.5170.5180.5190.520
00000000000...0000000000
10000000000...0000000000
20000000000...0000000000
30000000000...0000000000
40000000000...0000000000
\n", "

5 rows × 784 columns

\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "x_train" } }, "metadata": {}, "execution_count": 20 } ], "execution_count": null }, { "cell_type": "code", "source": [ "y_train.head()" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:23.149374Z", "iopub.execute_input": "2025-08-03T20:11:23.149858Z", "iopub.status.idle": "2025-08-03T20:11:23.173702Z", "shell.execute_reply.started": "2025-08-03T20:11:23.149774Z", "shell.execute_reply": "2025-08-03T20:11:23.172844Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 241 }, "id": "_ux_WDNbqzVx", "outputId": "57d9c69c-1f57-44df-c65a-30e184ba0a76" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0 9\n", "1 6\n", "2 3\n", "3 6\n", "4 6\n", "Name: 8, dtype: int64" ], "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
8
09
16
23
36
46
\n", "

" ] }, "metadata": {}, "execution_count": 21 } ], "execution_count": null }, { "cell_type": "code", "source": [ "print(\"x_train shape:\", x_train.shape)\n", "print(\"y_train shape:\", y_train.shape)\n", "print(x_train.shape[0], \"train samples\")" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:23.174693Z", "iopub.execute_input": "2025-08-03T20:11:23.174997Z", "iopub.status.idle": "2025-08-03T20:11:23.195225Z", "shell.execute_reply.started": "2025-08-03T20:11:23.174964Z", "shell.execute_reply": "2025-08-03T20:11:23.194389Z" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "CdMvTDyiqzVx", "outputId": "bbd2daf1-b825-4f5d-e0d1-366f60593075" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "x_train shape: (239999, 784)\n", "y_train shape: (239999,)\n", "239999 train samples\n" ] } ], "execution_count": null }, { "cell_type": "code", "source": [ "x_train = np.array(x_train)\n", "x_train = x_train.reshape(-1, 28, 28,1) # Grayscale → 1 channel\n", "# Scale images to the [0, 1] range\n", "x_train = x_train / 255.0\n", "print(\"x_train shape:\", x_train.shape)\n", "print(x_train.shape[0], \"train samples\")" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:23.196161Z", "iopub.execute_input": "2025-08-03T20:11:23.196428Z", "iopub.status.idle": "2025-08-03T20:11:28.951393Z", "shell.execute_reply.started": "2025-08-03T20:11:23.196409Z", "shell.execute_reply": "2025-08-03T20:11:28.950378Z" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "T5CxapIzqzVy", "outputId": "9b94928c-ce61-4e13-a731-38546429ea38" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "x_train shape: (239999, 28, 28, 1)\n", "239999 train samples\n" ] } ], "execution_count": null }, { "cell_type": "code", "source": [ "# Plot 10 random images from the training set\n", "plt.figure(figsize=(10, 2))\n", "for i in range(10):\n", " idx = np.random.randint(0, x_train.shape[0])\n", " plt.subplot(1, 10, i + 1)\n", " plt.imshow(x_train[idx], cmap='gray')\n", " plt.title(str(y_train[idx]))\n", " plt.axis('off')\n", "plt.tight_layout()\n", "plt.show()" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:28.952541Z", "iopub.execute_input": "2025-08-03T20:11:28.953404Z", "iopub.status.idle": "2025-08-03T20:11:29.497051Z", "shell.execute_reply.started": "2025-08-03T20:11:28.953367Z", "shell.execute_reply": "2025-08-03T20:11:29.496134Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 142 }, "id": "POtI8HtyqzVy", "outputId": "7cb76aac-4c17-4242-8987-02cb1fcc0381" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} } ], "execution_count": null }, { "cell_type": "code", "source": [ "from keras.utils import to_categorical\n", "y_train = to_categorical(y_train, 10)" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:29.498165Z", "iopub.execute_input": "2025-08-03T20:11:29.49855Z", "iopub.status.idle": "2025-08-03T20:11:29.509949Z", "shell.execute_reply.started": "2025-08-03T20:11:29.498526Z", "shell.execute_reply": "2025-08-03T20:11:29.50888Z" }, "id": "ApVgNZQ0qzVz" }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": [ "print(\"y_train shape:\", y_train.shape) # should be (60000,)\n", "print(\"y_train example:\", y_train[0])" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:29.51118Z", "iopub.execute_input": "2025-08-03T20:11:29.511763Z", "iopub.status.idle": "2025-08-03T20:11:29.527798Z", "shell.execute_reply.started": "2025-08-03T20:11:29.511727Z", "shell.execute_reply": "2025-08-03T20:11:29.526869Z" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "VBoTemesqzVz", "outputId": "af9b3070-99b5-406c-f597-e6ca0b283fd2" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "y_train shape: (239999, 10)\n", "y_train example: [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n" ] } ], "execution_count": null }, { "cell_type": "code", "source": [ "from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\n", "from tensorflow.keras.layers import BatchNormalization\n", "\n", "model = keras.Sequential()\n", "model.add(Conv2D(30, (3, 3),input_shape=(img_width,img_height,1),activation=\"relu\"))\n", "\n", "model.add(MaxPooling2D(pool_size=(2, 2)))\n", "\n", "model.add(Conv2D(30, (3, 3),activation=\"relu\"))\n", "\n", "model.add(MaxPooling2D(pool_size=(2, 2)))\n", "\n", "model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors\n", "\n", "model.add(Dense(64))\n", "model.add(Dropout(0.2))\n", "\n", "model.add(Dense(10,activation=\"softmax\"))\n", "\n", "model.summary()" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:29.529027Z", "iopub.execute_input": "2025-08-03T20:11:29.529307Z", "iopub.status.idle": "2025-08-03T20:11:29.635317Z", "shell.execute_reply.started": "2025-08-03T20:11:29.529287Z", "shell.execute_reply": "2025-08-03T20:11:29.634226Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 440 }, "id": "qzg_DOb2qzVz", "outputId": "d9d629c7-359b-4049-91e6-d7a894a9d188" }, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.11/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" ] }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1mModel: \"sequential\"\u001b[0m\n" ], "text/html": [ "
Model: \"sequential\"\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "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;34m26\u001b[0m, \u001b[38;5;34m26\u001b[0m, \u001b[38;5;34m30\u001b[0m) │ \u001b[38;5;34m300\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ max_pooling2d (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m13\u001b[0m, \u001b[38;5;34m13\u001b[0m, \u001b[38;5;34m30\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m11\u001b[0m, \u001b[38;5;34m11\u001b[0m, \u001b[38;5;34m30\u001b[0m) │ \u001b[38;5;34m8,130\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ max_pooling2d_1 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m30\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m750\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m48,064\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\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;34m10\u001b[0m) │ \u001b[38;5;34m650\u001b[0m │\n", "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" ], "text/html": [ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
              "┃ Layer (type)                     Output Shape                  Param # ┃\n",
              "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
              "│ conv2d (Conv2D)                 │ (None, 26, 26, 30)     │           300 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ max_pooling2d (MaxPooling2D)    │ (None, 13, 13, 30)     │             0 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ conv2d_1 (Conv2D)               │ (None, 11, 11, 30)     │         8,130 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ max_pooling2d_1 (MaxPooling2D)  │ (None, 5, 5, 30)       │             0 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ flatten (Flatten)               │ (None, 750)            │             0 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense (Dense)                   │ (None, 64)             │        48,064 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dropout (Dropout)               │ (None, 64)             │             0 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense_1 (Dense)                 │ (None, 10)             │           650 │\n",
              "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m57,144\u001b[0m (223.22 KB)\n" ], "text/html": [ "
 Total params: 57,144 (223.22 KB)\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m57,144\u001b[0m (223.22 KB)\n" ], "text/html": [ "
 Trainable params: 57,144 (223.22 KB)\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" ], "text/html": [ "
 Non-trainable params: 0 (0.00 B)\n",
              "
\n" ] }, "metadata": {} } ], "execution_count": null }, { "cell_type": "code", "source": [ "print(\"y_train shape:\", y_train.shape) # should be (60000,)\n", "print(\"y_train example:\", y_train[0])" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:29.636742Z", "iopub.execute_input": "2025-08-03T20:11:29.636981Z", "iopub.status.idle": "2025-08-03T20:11:29.64244Z", "shell.execute_reply.started": "2025-08-03T20:11:29.636963Z", "shell.execute_reply": "2025-08-03T20:11:29.641251Z" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "r-37iAkzqzVz", "outputId": "168b16b1-543a-4f2f-e4c9-ee2263075f69" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "y_train shape: (239999, 10)\n", "y_train example: [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n" ] } ], "execution_count": null }, { "cell_type": "code", "source": [ "from tensorflow.keras.losses import CategoricalCrossentropy\n", "model.compile(loss=\"categorical_crossentropy\",optimizer=\"Adam\", metrics=['accuracy'])" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:29.643517Z", "iopub.execute_input": "2025-08-03T20:11:29.644664Z", "iopub.status.idle": "2025-08-03T20:11:29.667774Z", "shell.execute_reply.started": "2025-08-03T20:11:29.64463Z", "shell.execute_reply": "2025-08-03T20:11:29.666572Z" }, "id": "BPdA8FiKqzVz" }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": [ "history = model.fit(x_train, y_train,epochs=10)" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:11:29.669022Z", "iopub.execute_input": "2025-08-03T20:11:29.669286Z", "iopub.status.idle": "2025-08-03T20:31:27.646378Z", "shell.execute_reply.started": "2025-08-03T20:11:29.669265Z", "shell.execute_reply": "2025-08-03T20:31:27.645154Z" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "7zJ8urxrqzVz", "outputId": "3d2a2cb1-90fb-43e0-acda-9f7e3e72151f" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/10\n", "\u001b[1m7500/7500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m181s\u001b[0m 24ms/step - accuracy: 0.9526 - loss: 0.1568\n", "Epoch 2/10\n", "\u001b[1m7500/7500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m199s\u001b[0m 23ms/step - accuracy: 0.9899 - loss: 0.0348\n", "Epoch 3/10\n", "\u001b[1m7500/7500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m201s\u001b[0m 23ms/step - accuracy: 0.9922 - loss: 0.0270\n", "Epoch 4/10\n", "\u001b[1m7500/7500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m204s\u001b[0m 24ms/step - accuracy: 0.9933 - loss: 0.0240\n", "Epoch 5/10\n", "\u001b[1m7500/7500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m171s\u001b[0m 23ms/step - accuracy: 0.9938 - loss: 0.0214\n", "Epoch 6/10\n", "\u001b[1m7500/7500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m204s\u001b[0m 23ms/step - accuracy: 0.9944 - loss: 0.0194\n", "Epoch 7/10\n", "\u001b[1m7500/7500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m201s\u001b[0m 23ms/step - accuracy: 0.9945 - loss: 0.0191\n", "Epoch 8/10\n", "\u001b[1m7500/7500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m202s\u001b[0m 23ms/step - accuracy: 0.9950 - loss: 0.0170\n", "Epoch 9/10\n", "\u001b[1m7500/7500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m199s\u001b[0m 23ms/step - accuracy: 0.9956 - loss: 0.0148\n", "Epoch 10/10\n", "\u001b[1m7500/7500\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m170s\u001b[0m 23ms/step - accuracy: 0.9953 - loss: 0.0155\n" ] } ], "execution_count": null }, { "cell_type": "code", "source": [ "data_test = pd.read_csv(crawford_emnist_path + \"/emnist-digits-test.csv\")" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:33:39.501746Z", "iopub.execute_input": "2025-08-03T20:33:39.502747Z", "iopub.status.idle": "2025-08-03T20:33:41.693985Z", "shell.execute_reply.started": "2025-08-03T20:33:39.502709Z", "shell.execute_reply": "2025-08-03T20:33:41.692861Z" }, "id": "YkP0FYK4qzVz" }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": [ "x_test = data_test.drop(columns=\"0\")\n", "y_test = data_test[\"0\"]" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:35:20.444957Z", "iopub.execute_input": "2025-08-03T20:35:20.445269Z", "iopub.status.idle": "2025-08-03T20:35:20.558185Z", "shell.execute_reply.started": "2025-08-03T20:35:20.445246Z", "shell.execute_reply": "2025-08-03T20:35:20.557264Z" }, "id": "sfJNYYQdqzVz" }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": [ "data_test.head()" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:35:20.559206Z", "iopub.execute_input": "2025-08-03T20:35:20.559491Z", "iopub.status.idle": "2025-08-03T20:35:20.576181Z", "shell.execute_reply.started": "2025-08-03T20:35:20.559469Z", "shell.execute_reply": "2025-08-03T20:35:20.575128Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 235 }, "id": "F0yT0P0dqzVz", "outputId": "451228f0-5da7-428d-dcb9-6268a571fa34" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 ... 0.472 0.473 0.474 \\\n", "0 9 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "1 7 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "2 9 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "3 2 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "4 2 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", "\n", " 0.475 0.476 0.477 0.478 0.479 0.480 0.481 \n", "0 0 0 0 0 0 0 0 \n", "1 0 0 0 0 0 0 0 \n", "2 0 0 0 0 0 0 0 \n", "3 0 0 0 0 0 0 0 \n", "4 0 0 0 0 0 0 0 \n", "\n", "[5 rows x 785 columns]" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
00.10.20.30.40.50.60.70.80.9...0.4720.4730.4740.4750.4760.4770.4780.4790.4800.481
09000000000...0000000000
17000000000...0000000000
29000000000...0000000000
32000000000...0000000000
42000000000...0000000000
\n", "

5 rows × 785 columns

\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "variable_name": "data_test" } }, "metadata": {}, "execution_count": 33 } ], "execution_count": null }, { "cell_type": "code", "source": [ "data_test.shape" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:35:27.008409Z", "iopub.execute_input": "2025-08-03T20:35:27.009176Z", "iopub.status.idle": "2025-08-03T20:35:27.01539Z", "shell.execute_reply.started": "2025-08-03T20:35:27.009127Z", "shell.execute_reply": "2025-08-03T20:35:27.01407Z" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "ublqpi78qzVz", "outputId": "da18d4eb-6175-4f00-92b2-7a46ff09d4b7" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(39999, 785)" ] }, "metadata": {}, "execution_count": 34 } ], "execution_count": null }, { "cell_type": "code", "source": [ "x_test.shape" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:35:27.835168Z", "iopub.execute_input": "2025-08-03T20:35:27.835506Z", "iopub.status.idle": "2025-08-03T20:35:27.841995Z", "shell.execute_reply.started": "2025-08-03T20:35:27.835478Z", "shell.execute_reply": "2025-08-03T20:35:27.840752Z" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "-fRf-qmlqzVz", "outputId": "50cf055a-9459-4b95-a04e-cf542480afce" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(39999, 784)" ] }, "metadata": {}, "execution_count": 35 } ], "execution_count": null }, { "cell_type": "code", "source": [ "y_test.shape" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:35:28.230256Z", "iopub.execute_input": "2025-08-03T20:35:28.230606Z", "iopub.status.idle": "2025-08-03T20:35:28.237308Z", "shell.execute_reply.started": "2025-08-03T20:35:28.230556Z", "shell.execute_reply": "2025-08-03T20:35:28.236127Z" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "Oe06QuA-qzVz", "outputId": "47796b64-c5c9-49f6-b2de-8e53fb341024" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(39999,)" ] }, "metadata": {}, "execution_count": 36 } ], "execution_count": null }, { "cell_type": "code", "source": [ "x_test = np.array(x_test)\n", "x_test = x_test.reshape(-1, 28, 28,1) # Grayscale → 1 channel\n", "# Scale images to the [0, 1] range\n", "x_test = x_test / 255.0" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:37:40.253522Z", "iopub.execute_input": "2025-08-03T20:37:40.254954Z", "iopub.status.idle": "2025-08-03T20:37:40.514421Z", "shell.execute_reply.started": "2025-08-03T20:37:40.254916Z", "shell.execute_reply": "2025-08-03T20:37:40.513435Z" }, "id": "jMLziJ3-qzVz" }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": [ "y_test = to_categorical(y_test, 10)" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:38:23.692993Z", "iopub.execute_input": "2025-08-03T20:38:23.69329Z", "iopub.status.idle": "2025-08-03T20:38:23.699091Z", "shell.execute_reply.started": "2025-08-03T20:38:23.693271Z", "shell.execute_reply": "2025-08-03T20:38:23.69809Z" }, "id": "DwKRCKb-qzV0" }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": [ "test_loss, test_acc = model.evaluate(x_test, y_test)\n", "print(\"Test Accuracy:\", test_acc)" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:38:24.0025Z", "iopub.execute_input": "2025-08-03T20:38:24.002859Z", "iopub.status.idle": "2025-08-03T20:38:31.886282Z", "shell.execute_reply.started": "2025-08-03T20:38:24.002832Z", "shell.execute_reply": "2025-08-03T20:38:31.885202Z" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "RaEWbjqeqzV0", "outputId": "178a737f-5ead-4515-90b4-a08026575621" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 6ms/step - accuracy: 0.9935 - loss: 0.0256\n", "Test Accuracy: 0.9938998222351074\n" ] } ], "execution_count": null }, { "cell_type": "code", "source": [ "plt.plot(history.history['loss'])" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:38:34.560747Z", "iopub.execute_input": "2025-08-03T20:38:34.56117Z", "iopub.status.idle": "2025-08-03T20:38:34.732929Z", "shell.execute_reply.started": "2025-08-03T20:38:34.561138Z", "shell.execute_reply": "2025-08-03T20:38:34.732023Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 447 }, "id": "ErdobcWeqzV0", "outputId": "b8e4789b-9c10-48b8-8feb-37a8844b45bb" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[]" ] }, "metadata": {}, "execution_count": 40 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} } ], "execution_count": null }, { "cell_type": "code", "source": [ "from sklearn.metrics import classification_report\n", "print(classification_report(np.argmax(y_test, axis=1), [np.argmax(y) for y in model.predict(x_test)]))" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:38:36.480847Z", "iopub.execute_input": "2025-08-03T20:38:36.481228Z", "iopub.status.idle": "2025-08-03T20:38:44.175533Z", "shell.execute_reply.started": "2025-08-03T20:38:36.481204Z", "shell.execute_reply": "2025-08-03T20:38:44.17433Z" }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "Tx65hFK3qzV1", "outputId": "d5c49bf8-a3f2-4d95-bc74-b5ca8fd824f5" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\u001b[1m1250/1250\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 6ms/step\n", " precision recall f1-score support\n", "\n", " 0 1.00 0.99 1.00 3999\n", " 1 1.00 1.00 1.00 4000\n", " 2 0.99 0.99 0.99 4000\n", " 3 0.99 0.99 0.99 4000\n", " 4 1.00 0.99 0.99 4000\n", " 5 0.99 0.99 0.99 4000\n", " 6 0.99 1.00 1.00 4000\n", " 7 0.99 1.00 0.99 4000\n", " 8 0.99 0.99 0.99 4000\n", " 9 0.99 0.99 0.99 4000\n", "\n", " accuracy 0.99 39999\n", " macro avg 0.99 0.99 0.99 39999\n", "weighted avg 0.99 0.99 0.99 39999\n", "\n" ] } ], "execution_count": null }, { "cell_type": "code", "source": [ "import gradio as gr\n", "from PIL import Image,ImageOps\n", "def predict_digit(data):\n", " try:\n", " # Convert NumPy array from Sketchpad to grayscale PIL image\n", " image = data[\"composite\"] # Not 'image'!\n", "\n", " # Convert to grayscale\n", " image = Image.fromarray(image).convert(\"L\")\n", " image = ImageOps.mirror(image)\n", " image = image.rotate(90)\n", " image = image.resize((28, 28))\n", " image = np.invert(image)\n", " image = np.array(image) / 255.0\n", " image = image.reshape(1, 28, 28, 1)\n", "\n", " prediction = model.predict(image)\n", "\n", " return f\"Predicted Digit: {np.argmax(prediction)}\\nConfidence: {np.max(prediction)*100:0.1f}\"\n", " except Exception as e:\n", " return f\"Error: {e}\"\n", "demo = gr.Interface(\n", " fn=predict_digit,\n", " inputs=gr.Sketchpad(image_mode=\"L\",height=280,width=280),\n", " outputs=\"text\",\n", " title=\"Digit Classifier\",\n", " description=\"Draw a digit (0–9) and let the model predict it!\"\n", ")\n", "demo.launch(share=True)" ], "metadata": { "trusted": true, "execution": { "iopub.status.busy": "2025-08-03T20:38:48.037858Z", "iopub.execute_input": "2025-08-03T20:38:48.038204Z", "iopub.status.idle": "2025-08-03T20:39:20.485173Z", "shell.execute_reply.started": "2025-08-03T20:38:48.03818Z", "shell.execute_reply": "2025-08-03T20:39:20.483946Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 611 }, "id": "KZTVYNTFqzV1", "outputId": "2b759a39-36af-4ef6-8ade-6d85587d84b2" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Colab notebook detected. To show errors in colab notebook, set debug=True in launch()\n", "* Running on public URL: https://21d67ecdcaeab737af.gradio.live\n", "\n", "This share link expires in 1 week. For free permanent hosting and GPU upgrades, run `gradio deploy` from the terminal in the working directory to deploy to Hugging Face Spaces (https://huggingface.co/spaces)\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/html": [ "
" ] }, "metadata": {} }, { "output_type": "execute_result", "data": { "text/plain": [] }, "metadata": {}, "execution_count": 46 } ], "execution_count": null }, { "cell_type": "code", "source": [], "metadata": { "trusted": true, "id": "LLckjXXBqzV1" }, "outputs": [], "execution_count": null }, { "cell_type": "code", "metadata": { "id": "Wdc0HH7IqzVr" }, "source": [], "execution_count": null, "outputs": [] } ] }