{ "cells": [ { "cell_type": "code", "execution_count": 2, "id": "2b22b7ad-9329-477a-a8f4-583fb23a8471", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import tensorflow as tf\n", "from tensorflow import keras\n", "import pandas as pd\n", "import matplotlib\n", "matplotlib.use(\"TkAgg\")\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 3, "id": "8b9896be-f135-4c8d-9c00-c6fe7e444172", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(60000, 28, 28)\n", "uint8\n" ] } ], "source": [ "fashion_mnist = keras.datasets.fashion_mnist\n", "\n", "(x_train_full, y_train_full), (x_test, y_test) = fashion_mnist.load_data()\n", "x_test = x_test / 255.0\n", "\n", "print(x_train_full.shape)\n", "print(x_train_full.dtype)\n", "\n", "x_valid, x_train = x_train_full[:5000] / 255.0, x_train_full[5000:] / 255.0\n", "y_valid, y_train = y_train_full[:5000], y_train_full[5000:]\n", "\n", "class_names = [\n", " \"T-shirt/top\", \"Trouser\", \"Pullover\", \"Dress\", \"Coat\",\n", " \"Sandal\", \"Shirt\", \"Sneaker\", \"Bag\", \"Ankle boot\"\n", "]" ] }, { "cell_type": "code", "execution_count": 4, "id": "c4514be8-3e16-4f63-bea4-adc8e2576e43", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\lacer\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python312\\site-packages\\keras\\src\\layers\\reshaping\\flatten.py:37: 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" ] } ], "source": [ "model = keras.models.Sequential()\n", "model.add(keras.layers.Flatten(input_shape=(28, 28)))\n", "model.add(keras.layers.Dense(300, activation='relu'))\n", "model.add(keras.layers.Dense(100, activation='relu'))\n", "model.add(keras.layers.Dense(10, activation='softmax'))" ] }, { "cell_type": "code", "execution_count": 6, "id": "80db0e8a-cc96-4752-8bec-60315ad34bec", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:TensorFlow GPU support is not available on native Windows for TensorFlow >= 2.11. Even if CUDA/cuDNN are installed, GPU will not be used. Please use WSL2 or the TensorFlow-DirectML plugin.\n", "Epoch 1/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 3ms/step - accuracy: 0.7659 - loss: 0.7165 - val_accuracy: 0.8362 - val_loss: 0.5032\n", "Epoch 2/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 3ms/step - accuracy: 0.8292 - loss: 0.4888 - val_accuracy: 0.8542 - val_loss: 0.4361\n", "Epoch 3/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 3ms/step - accuracy: 0.8441 - loss: 0.4461 - val_accuracy: 0.8642 - val_loss: 0.4142\n", "Epoch 4/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.8529 - loss: 0.4180 - val_accuracy: 0.8654 - val_loss: 0.3972\n", "Epoch 5/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.8600 - loss: 0.3981 - val_accuracy: 0.8600 - val_loss: 0.3943\n", "Epoch 6/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.8655 - loss: 0.3811 - val_accuracy: 0.8694 - val_loss: 0.3724\n", "Epoch 7/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.8690 - loss: 0.3680 - val_accuracy: 0.8668 - val_loss: 0.3823\n", "Epoch 8/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 3ms/step - accuracy: 0.8726 - loss: 0.3573 - val_accuracy: 0.8724 - val_loss: 0.3629\n", "Epoch 9/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 3ms/step - accuracy: 0.8777 - loss: 0.3461 - val_accuracy: 0.8768 - val_loss: 0.3452\n", "Epoch 10/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.8804 - loss: 0.3365 - val_accuracy: 0.8792 - val_loss: 0.3440\n", "Epoch 11/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.8837 - loss: 0.3282 - val_accuracy: 0.8698 - val_loss: 0.3532\n", "Epoch 12/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.8858 - loss: 0.3197 - val_accuracy: 0.8814 - val_loss: 0.3315\n", "Epoch 13/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.8886 - loss: 0.3127 - val_accuracy: 0.8804 - val_loss: 0.3382\n", "Epoch 14/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.8911 - loss: 0.3053 - val_accuracy: 0.8738 - val_loss: 0.3601\n", "Epoch 15/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.8923 - loss: 0.2997 - val_accuracy: 0.8816 - val_loss: 0.3278\n", "Epoch 16/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.8951 - loss: 0.2938 - val_accuracy: 0.8834 - val_loss: 0.3259\n", "Epoch 17/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.8983 - loss: 0.2865 - val_accuracy: 0.8850 - val_loss: 0.3281\n", "Epoch 18/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.9000 - loss: 0.2809 - val_accuracy: 0.8832 - val_loss: 0.3194\n", "Epoch 19/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.9008 - loss: 0.2760 - val_accuracy: 0.8886 - val_loss: 0.3071\n", "Epoch 20/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.9016 - loss: 0.2716 - val_accuracy: 0.8820 - val_loss: 0.3401\n", "Epoch 21/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 2ms/step - accuracy: 0.9035 - loss: 0.2662 - val_accuracy: 0.8890 - val_loss: 0.3063\n", "Epoch 22/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.9061 - loss: 0.2614 - val_accuracy: 0.8900 - val_loss: 0.3113\n", "Epoch 23/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 3ms/step - accuracy: 0.9069 - loss: 0.2565 - val_accuracy: 0.8888 - val_loss: 0.3085\n", "Epoch 24/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 3ms/step - accuracy: 0.9091 - loss: 0.2524 - val_accuracy: 0.8842 - val_loss: 0.3263\n", "Epoch 25/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.9102 - loss: 0.2487 - val_accuracy: 0.8894 - val_loss: 0.3044\n", "Epoch 26/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.9108 - loss: 0.2446 - val_accuracy: 0.8914 - val_loss: 0.2958\n", "Epoch 27/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.9133 - loss: 0.2392 - val_accuracy: 0.8788 - val_loss: 0.3307\n", "Epoch 28/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.9149 - loss: 0.2362 - val_accuracy: 0.8914 - val_loss: 0.2978\n", "Epoch 29/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.9171 - loss: 0.2317 - val_accuracy: 0.8886 - val_loss: 0.3139\n", "Epoch 30/30\n", "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 3ms/step - accuracy: 0.9177 - loss: 0.2281 - val_accuracy: 0.8922 - val_loss: 0.3038\n" ] } ], "source": [ "model.compile(\n", " loss=\"sparse_categorical_crossentropy\",\n", " optimizer=\"sgd\",\n", " metrics=[\"accuracy\"]\n", ")\n", "\n", "history = model.fit(\n", " x_train,\n", " y_train,\n", " epochs=30 ,\n", " validation_data=(x_valid, y_valid)\n", ")" ] }, { "cell_type": "code", "execution_count": 8, "id": "2a081c04-338c-40e6-89d1-857ec6ca3232", "metadata": {}, "outputs": [], "source": [ "pd.DataFrame(history.history).plot(figsize=(8, 5))\n", "plt.grid(True)\n", "plt.gca().set_ylim(0, 1)\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "7cd5d8ac-6a3e-4a92-b4ef-574923bf4b71", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - accuracy: 0.8787 - loss: 0.3378\n" ] }, { "data": { "text/plain": [ "[0.33777710795402527, 0.8787000179290771]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.evaluate(x_test, y_test)\n" ] }, { "cell_type": "code", "execution_count": 12, "id": "6d401ab5-a415-4c92-98b6-01ac1c15dd47", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step\n", "[[0. 0. 0. 0. 0. 0.01 0. 0.03 0. 0.95]\n", " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0. ]\n", " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0. ]]\n", "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 45ms/step\n", "[9 2 1]\n", "['Ankle boot' 'Pullover' 'Trouser']\n" ] } ], "source": [ "x_new = x_test[:3]\n", "y_proba = model.predict(x_new)\n", "print(y_proba.round(2))\n", "\n", "y_pred = model.predict(x_new).argmax(axis=1)\n", "print(y_pred)\n", "\n", "print(np.array(class_names)[y_pred])\n" ] }, { "cell_type": "code", "execution_count": null, "id": "5b476174-b4af-43fb-b1f4-8b182c3af14d", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.12.10" } }, "nbformat": 4, "nbformat_minor": 5 }