{ "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": [ "