{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "id": "faIQgHhGX9AZ" }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import tensorflow as tf\n", "from tensorflow.keras.datasets import mnist\n", "\n", "# Load the MNIST dataset\n", "(train_images, train_labels), (test_images, test_labels) = mnist.load_data()\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "jar7MC2IYVDq" }, "outputs": [], "source": [ "X_train = train_images.astype('float32') / 255.0\n", "X_test = test_images.astype('float32') / 255.0\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "qb7i7oe5YaCT" }, "outputs": [], "source": [ "y_train = train_labels\n", "y_test = test_labels\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "sC2gebOlaqv7", "outputId": "66e965d9-e100-45f7-fd43-6eb274057e9d" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\admin\\AppData\\Roaming\\Python\\Python311\\site-packages\\keras\\src\\layers\\reshaping\\reshape.py:39: 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__(**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",
       "│ reshape (Reshape)                    │ (None, 28, 28)              │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ lstm (LSTM)                          │ (None, 28, 128)             │          80,384 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dropout (Dropout)                    │ (None, 28, 128)             │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ lstm_1 (LSTM)                        │ (None, 128)                 │         131,584 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dropout_1 (Dropout)                  │ (None, 128)                 │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dense (Dense)                        │ (None, 64)                  │           8,256 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dropout_2 (Dropout)                  │ (None, 64)                  │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dense_1 (Dense)                      │ (None, 10)                  │             650 │\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", "│ reshape (\u001b[38;5;33mReshape\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ lstm (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m80,384\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ lstm_1 (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m131,584\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dropout_1 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\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;34m8,256\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dropout_2 (\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" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Total params: 220,874 (862.79 KB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m220,874\u001b[0m (862.79 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Trainable params: 220,874 (862.79 KB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m220,874\u001b[0m (862.79 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Non-trainable params: 0 (0.00 B)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/3\n", "\u001b[1m1875/1875\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m34s\u001b[0m 17ms/step - accuracy: 0.7632 - loss: 0.7051 - val_accuracy: 0.9589 - val_loss: 0.1399\n", "Epoch 2/3\n", "\u001b[1m1875/1875\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m31s\u001b[0m 17ms/step - accuracy: 0.9655 - loss: 0.1250 - val_accuracy: 0.9807 - val_loss: 0.0694\n", "Epoch 3/3\n", "\u001b[1m1875/1875\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m30s\u001b[0m 16ms/step - accuracy: 0.9770 - loss: 0.0808 - val_accuracy: 0.9835 - val_loss: 0.0525\n" ] } ], "source": [ "import keras\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import tensorflow as tf\n", "from tensorflow.keras.datasets import mnist\n", "import tensorflow.keras as keras # Import Keras from TensorFlow\n", "from tensorflow.keras.optimizers import Adam # Import the Adam optimizer\n", "\n", "model = keras.Sequential()\n", "model.add(keras.layers.Reshape((28, 28), input_shape=(28, 28)))\n", "model.add(keras.layers.LSTM(128, return_sequences=True))\n", "model.add(keras.layers.Dropout(0.2))\n", "model.add(keras.layers.LSTM(128))\n", "model.add(keras.layers.Dropout(0.2))\n", "model.add(keras.layers.Dense(64, activation='relu'))\n", "model.add(keras.layers.Dropout(0.2))\n", "model.add(keras.layers.Dense(10, activation='softmax'))\n", "\n", "# Define a learning rate schedule\n", "lr_schedule = keras.optimizers.schedules.ExponentialDecay(\n", " initial_learning_rate=0.001,\n", " decay_steps=10000,\n", " decay_rate=0.9\n", ")\n", "\n", "# Create an optimizer with the learning rate schedule\n", "optimizer = Adam(learning_rate=lr_schedule)\n", "\n", "# Compile the model\n", "model.compile(loss='sparse_categorical_crossentropy',\n", " optimizer=optimizer,\n", " metrics=['accuracy'])\n", "\n", "# Print model summary\n", "model.summary()\n", "\n", "# Train the model\n", "history = model.fit(X_train, y_train, epochs=3, validation_data=(X_test, y_test))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 487 }, "id": "xty3McC5atzP", "outputId": "62e6b9bb-0580-4d02-f145-44cd372a5d9e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 229ms/step\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Predicted Number: 7\n" ] } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "def predict_number(input_image):\n", " # Preprocess the input image (assuming it's a grayscale image)\n", " input_image = input_image.astype('float32') / 255.0\n", " input_image = np.reshape(input_image, (1, 28, 28)) # Reshape to match the model's input shape\n", "\n", " prediction = model.predict(input_image)\n", "\n", " predicted_number = np.argmax(prediction)\n", "\n", " return predicted_number\n", "\n", "input_image = test_images[0] # Replace with your own image\n", "predicted_number = predict_number(input_image)\n", "\n", "plt.imshow(input_image.reshape((28, 28)), cmap=plt.cm.binary)\n", "plt.title(f\"Predicted Number: {predicted_number}\")\n", "plt.show()\n", "\n", "\n", "print(\"Predicted Number:\", predicted_number)\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "j83wsZVbdCwT", "outputId": "e0fbd18f-ede6-4309-ffc4-154026e81af5" }, "outputs": [], "source": [ "# Save the trained model to the current working directory\n", "model.save('my_model.keras')\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 397 }, "id": "IrPkGHhlfOQ3", "outputId": "42245100-6f00-4581-f2a2-3d49d74844c8" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 222ms/step\n" ] }, { "data": { "image/png": "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ceTIEb/rwVDjgw8++FDHQ0moaf4/iFSnuroaBoOhvatBREStlJycjLNnz8JsNvucL8G1H4mISDUYakREpBoMNSIiUg2GGhERqQZDjYiIVIOhRkREqsFQIyIi1WCoERGRajDUiIhINRhqRESkGgw1IiJSDYYaERGpBkONiIhUg6FGRESqwVAjIiLVYKgREZFqMNSIiEg1GGpERKQaDDUiIlINhhoREakGQ42IiFSDoUZERKrBUCMiItVgqBERkWow1IiISDUYakREpBoMNSIiUg2GGhERqQZDjYiIVIOhRkREqsFQIyIi1WCoERGRajDUiIhINRhqRESkGtr2rgCFrpiYGGg0GkX7REdHIyYmRtE+QgjY7XZF+7SUxWKBEELRPkKIFu3TVm0iov9gqJGs6OhoDBs2DB06dFC0X69evXD11Vcr2qe+vh5ms1nRPkIINDY2SsGh0WgghJBCWO5ru92OL774AlVVVYqOZbFYUF1drWifuro6nDx5UtE+RNR6DDXySK/XIzY2VtE+CQkJMBgMinp4MTExHns1jrBy/xoArFZrsx6Ut2ATQkCv10On0ylqk91uh1ar7E8lOjpaUXkiCgyeU6OAUjpMp+T15F7bfZtzmMp9Hej6EVFoYahRQCk9B+e+n6/93Z/3VN5TeLW0fkQUHoIeagUFBdBoNMjPz5e2CSEwb948mEwmxMXFYeTIkdi/f7/LfhaLBTNnzkRqaioSEhIwceJEHD16NNjVJRlt0btxHMNbz8v9eW8B5T5UKbc/EalPUENt586deOONN3DFFVe4bH/xxRexePFiLFu2DDt37oTRaMT111+PmpoaqUx+fj42bNiAdevWYfv27aitrUVubi6ampqCWWWSoaR309LQUNpD83Y8hhlR5ApaqNXW1mLKlCl488030alTJ2m7EAJLly7F3LlzccsttyArKwurVq1CXV0d1q5dCwAwm81YsWIFXn75ZYwePRpXXnklVq9ejb1792LLli3BqjJ50JY9NU89M8ekD+fnHds89e7kzqlx+JFI3YIWag899BBuvPFGjB492mV7WVkZKioqMGbMGGmbXq/HiBEjUFRUBAAoKSmBzWZzKWMymZCVlSWVceeYdu38oNbxFQRyYdfac2reAtT9ejHnafy+JpT48xwRhb+gTOlft24ddu/ejZ07dzZ7rqKiAgCQlpbmsj0t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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Predicted Number: 7\n" ] } ], "source": [ "import numpy as np\n", "import tensorflow as tf\n", "from tensorflow.keras.preprocessing import image\n", "from tensorflow.keras.models import load_model\n", "import matplotlib.pyplot as plt\n", "from PIL import Image\n", "\n", "# Load your trained model (replace 'my_model.h5' with your model's filename)\n", "model = load_model('my_model.keras')\n", "\n", "# Define a function to predict the number from an input image file\n", "def predict_number_from_image(image_path):\n", " # Load and preprocess the input image\n", " img = image.load_img(image_path, target_size=(28, 28), color_mode='grayscale')\n", " img_array = image.img_to_array(img)\n", " img_array /= 255.0\n", " img_array = np.reshape(img_array, (1, 28, 28, 1)) # Reshape to match the model's input shape\n", "\n", " # Make a prediction using the trained model\n", " prediction = model.predict(img_array)\n", "\n", " # Get the index of the class with the highest probability\n", " predicted_number = np.argmax(prediction)\n", "\n", " return predicted_number\n", "\n", "# Example usage:\n", "# Provide an input image (as a file path)\n", "# Replace 'your_image_path.png' with the path to your image file\n", "input_image_path = 'seven.png'\n", "\n", "predicted_number = predict_number_from_image(input_image_path)\n", "\n", "# Load and display the input image\n", "img = Image.open(input_image_path)\n", "plt.imshow(img, cmap='gray')\n", "plt.title(f\"Predicted Number: {predicted_number}\")\n", "plt.show()\n", "\n", "# Print the predicted number\n", "print(\"Predicted Number:\", predicted_number)\n" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" } }, "nbformat": 4, "nbformat_minor": 1 }