{ "cells": [ { "cell_type": "markdown", "id": "59d5afb6-e57f-4564-8063-67fa904796da", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "# Dzień 5 - 19.05.2025" ] }, { "cell_type": "markdown", "id": "2573407e-45c3-42fe-a17d-9e0b0a78eea8", "metadata": {}, "source": [ "## Deep Learning\n", "uczenie płytkie - proste algorytmy, ręczne inżynierowanie cech\n", "uczenie głębokie - używa sieci neuronowych, automatycznie uczy się cech danych" ] }, { "cell_type": "markdown", "id": "22dc1546-9abc-4d18-affa-4954cf2999e9", "metadata": {}, "source": [ "h2o.ai\n", "AutoML - automated machine learning - wyszukuje jaki model będzie najlepszy na bazie danych wejściowych" ] }, { "cell_type": "markdown", "id": "16b94743-d23e-4a7d-97c7-0966aa711c5f", "metadata": {}, "source": [ "## Sztuczne sieci neuronowe\n", "### definicje\n", "neurony - przekazują i przetwarzają sygnały\n", "warstwy - neurony są zorganizowane w warstwy\n", "połączenia - neurony połączone są z wagami i z biasem\n", "### uczenie\n", "1. forward propagation - dane przechodzą przez sieć i siec daje błąd\n", "2. obliczenie błędu\n", "3. back propagation - błąd jest propagowany wstecz i są zmieniane wagi i bias" ] }, { "cell_type": "markdown", "id": "bc61d27e-0b86-496b-8c14-d5c3be316f73", "metadata": {}, "source": [ "## Popularne funkcje aktywacji\n", " - sigmoid - wartości 0-1 binarne\n", " - softmax - wartości 0-1 ułamkowe, ale wszystkie wyjścia sumują się do 1 - jest to podział prawdopodobieństwa\n", " - ReLU - zachowuje wartości dodatnie, zeruje ujemne. Dla dodatnich jest liniowa\n", " - tanh - podobna do sigmoid, ale wartości od -1 do 1" ] }, { "cell_type": "markdown", "id": "7a85c9ef-9dbf-4e71-a62a-3415ded9b7c4", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## metoda dropout (Hangout) - wyłączanie najsłabszych neuronów\n" ] }, { "cell_type": "markdown", "id": "9d98ba73-f954-4a6a-ac09-3a6b1afa58ce", "metadata": {}, "source": [ "# Kod" ] }, { "cell_type": "markdown", "id": "11ee196e-06a8-47a4-a411-aa7dd06faaf8", "metadata": {}, "source": [ "## Setup i wczytanie danych" ] }, { "cell_type": "code", "execution_count": 33, "id": "ed806007-30fb-4048-8fa5-f31c7eed433a", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from tensorflow import keras" ] }, { "cell_type": "code", "execution_count": 34, "id": "4b4881e2-fdaf-4ccc-b68e-15ec7391146e", "metadata": {}, "outputs": [], "source": [ "# Wczytaj dane\n", "mnist = keras.datasets.mnist\n", "(X_train, Y_train),(X_test, Y_test) = mnist.load_data()" ] }, { "cell_type": "code", "execution_count": 35, "id": "455c540d-bad5-4a66-9b13-35113ae41f3d", "metadata": {}, "outputs": [], "source": [ "# Parametry modelu\n", "EPOCHS = 25\n", "BATCH_SIZE = 64\n", "VERBOSE = 1\n", "NB_CLASSES = 10\n", "N_HIDDEN = 256\n", "VALIDATION_SPLIT = 0.2\n" ] }, { "cell_type": "code", "execution_count": 36, "id": "beee8e5a-348e-45d1-9a40-79976aed712f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Shape before: (60000, 28, 28)\n", "Shape after: (60000, 784)\n" ] } ], "source": [ "# modyfikacja danych wejściowych\n", "\n", "# normalizacja\n", "print(f\"Shape before: {X_train.shape}\")\n", "RESHAPED = 28*28\n", "X_train = X_train.reshape(60000,RESHAPED)\n", "X_test = X_test.reshape(10000,RESHAPED)\n", "print(f\"Shape after: {X_train.shape}\")\n", "\n", "# normalizacja\n", "X_train = X_train.astype('float32') / 255.0\n", "X_test = X_test.astype('float32') / 255.0\n", "\n", "# konwersja do binarnych 0-1\n", "X_train = np.where(X_train > 0.5, 1, 0)\n", "X_test = np.where(X_test > 0.5, 1, 0)\n", "\n", "# One-hot encoding for labels\n", "Y_train = keras.utils.to_categorical(Y_train, NB_CLASSES)\n", "Y_test = keras.utils.to_categorical(Y_test, NB_CLASSES)\n", "\n" ] }, { "cell_type": "markdown", "id": "37735925-efe6-4540-97a3-c0c130274fae", "metadata": {}, "source": [ "## Model" ] }, { "cell_type": "markdown", "id": "0de3a87d-7b86-49c0-a44d-35a546149cf2", "metadata": {}, "source": [ "### Stwórz\n" ] }, { "cell_type": "code", "execution_count": 37, "id": "4ec7f823-09ee-4b22-a2f6-f3f74853211e", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/sasza/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/keras/src/layers/core/dense.py:93: 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" ] }, { "data": { "text/html": [ "
Model: \"sequential_4\"\n",
"\n"
],
"text/plain": [
"\u001b[1mModel: \"sequential_4\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ input_layer (Dense) │ (None, 256) │ 200,960 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_layer_1 (Dropout) │ (None, 256) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ hidden_layer_1 (Dense) │ (None, 256) │ 65,792 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_layer_2 (Dropout) │ (None, 256) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ hidden_layer_2 (Dense) │ (None, 256) │ 65,792 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_layer_3 (Dropout) │ (None, 256) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ output_layer (Dense) │ (None, 10) │ 2,570 │\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",
"│ input_layer (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m200,960\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_layer_1 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ hidden_layer_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m65,792\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_layer_2 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ hidden_layer_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m65,792\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_layer_3 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ output_layer (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m2,570\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Total params: 335,114 (1.28 MB)\n", "\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m335,114\u001b[0m (1.28 MB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Trainable params: 335,114 (1.28 MB)\n", "\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m335,114\u001b[0m (1.28 MB)\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" } ], "source": [ "# Model\n", "\n", "from tensorflow.keras.layers import Dense\n", "\n", "model = keras.models.Sequential()\n", "model.add(Dense(N_HIDDEN,input_shape=(RESHAPED,),\n", " activation='relu',\n", " name='input_layer'))\n", "# warstwa Dropout\n", "model.add(keras.layers.Dropout(0.3, name=\"dropout_layer_1\"))\n", "model.add(Dense(N_HIDDEN, \n", " activation='relu',\n", " name=\"hidden_layer_1\"))\n", "# warstwa Dropout\n", "model.add(keras.layers.Dropout(0.3, name=\"dropout_layer_2\"))\n", "model.add(Dense(N_HIDDEN, \n", " activation='relu',\n", " name=\"hidden_layer_2\"))\n", "# warstwa Dropout\n", "model.add(keras.layers.Dropout(0.3, name=\"dropout_layer_3\"))\n", "model.add(Dense(NB_CLASSES,\n", " activation='softmax',\n", " name='output_layer'))\n", "\n", "model.summary()" ] }, { "cell_type": "code", "execution_count": 38, "id": "6d0dbbe5-7eac-4917-aff1-6f127ab46dfb", "metadata": {}, "outputs": [], "source": [ "# Compile the model\n", "model.compile(loss='categorical_crossentropy',\n", " optimizer='adam',\n", " metrics=['accuracy'])" ] }, { "cell_type": "markdown", "id": "7db6f8fb-ff16-4bc4-9758-380e13f5a0fb", "metadata": {}, "source": [ "### Trenuj\n" ] }, { "cell_type": "code", "execution_count": 39, "id": "30ce3fe1-2cc6-4dad-8b71-c04763d525fa", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/25\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2025-05-20 13:23:23.834163: W external/local_xla/xla/tsl/framework/cpu_allocator_impl.cc:83] Allocation of 301056000 exceeds 10% of free system memory.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 9ms/step - accuracy: 0.7850 - loss: 0.6727 - val_accuracy: 0.9557 - val_loss: 0.1503\n", "Epoch 2/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.9457 - loss: 0.1848 - val_accuracy: 0.9625 - val_loss: 0.1182\n", "Epoch 3/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.9584 - loss: 0.1359 - val_accuracy: 0.9688 - val_loss: 0.1069\n", "Epoch 4/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.9668 - loss: 0.1052 - val_accuracy: 0.9682 - val_loss: 0.1080\n", "Epoch 5/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.9735 - loss: 0.0867 - val_accuracy: 0.9723 - val_loss: 0.0939\n", "Epoch 6/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.9725 - loss: 0.0900 - val_accuracy: 0.9736 - val_loss: 0.0926\n", "Epoch 7/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 10ms/step - accuracy: 0.9771 - loss: 0.0740 - val_accuracy: 0.9722 - val_loss: 0.1025\n", "Epoch 8/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9781 - loss: 0.0684 - val_accuracy: 0.9713 - val_loss: 0.0975\n", "Epoch 9/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.9814 - loss: 0.0592 - val_accuracy: 0.9726 - val_loss: 0.0988\n", "Epoch 10/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.9830 - loss: 0.0560 - val_accuracy: 0.9713 - val_loss: 0.1129\n", "Epoch 11/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.9831 - loss: 0.0554 - val_accuracy: 0.9734 - val_loss: 0.1071\n", "Epoch 12/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.9844 - loss: 0.0486 - val_accuracy: 0.9753 - val_loss: 0.0967\n", "Epoch 13/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 10ms/step - accuracy: 0.9857 - loss: 0.0467 - val_accuracy: 0.9758 - val_loss: 0.0978\n", "Epoch 14/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9857 - loss: 0.0456 - val_accuracy: 0.9728 - val_loss: 0.1028\n", "Epoch 15/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 10ms/step - accuracy: 0.9866 - loss: 0.0438 - val_accuracy: 0.9742 - val_loss: 0.1067\n", "Epoch 16/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 10ms/step - accuracy: 0.9861 - loss: 0.0439 - val_accuracy: 0.9746 - val_loss: 0.0986\n", "Epoch 17/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 11ms/step - accuracy: 0.9865 - loss: 0.0433 - val_accuracy: 0.9766 - val_loss: 0.1007\n", "Epoch 18/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.9891 - loss: 0.0366 - val_accuracy: 0.9764 - val_loss: 0.1119\n", "Epoch 19/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9884 - loss: 0.0371 - val_accuracy: 0.9751 - val_loss: 0.1098\n", "Epoch 20/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.9894 - loss: 0.0352 - val_accuracy: 0.9758 - val_loss: 0.1167\n", "Epoch 21/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.9894 - loss: 0.0347 - val_accuracy: 0.9756 - val_loss: 0.1151\n", "Epoch 22/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.9891 - loss: 0.0357 - val_accuracy: 0.9738 - val_loss: 0.1123\n", "Epoch 23/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.9904 - loss: 0.0300 - val_accuracy: 0.9753 - val_loss: 0.1220\n", "Epoch 24/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.9894 - loss: 0.0355 - val_accuracy: 0.9759 - val_loss: 0.1151\n", "Epoch 25/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9913 - loss: 0.0292 - val_accuracy: 0.9764 - val_loss: 0.1148\n" ] }, { "data": { "text/plain": [ "
Model: \"sequential_20\"\n",
"\n"
],
"text/plain": [
"\u001b[1mModel: \"sequential_20\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ input_layer (Dense) │ (None, 28, 32) │ 928 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_18 (Dropout) │ (None, 28, 32) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_layer (Dense) │ (None, 28, 32) │ 1,056 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_19 (Dropout) │ (None, 28, 32) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten_9 (Flatten) │ (None, 896) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ output_layer (Dense) │ (None, 10) │ 8,970 │\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",
"│ input_layer (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m928\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_18 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_layer (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m1,056\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_19 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten_9 (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m896\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ output_layer (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m8,970\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Total params: 10,954 (42.79 KB)\n", "\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m10,954\u001b[0m (42.79 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Trainable params: 10,954 (42.79 KB)\n", "\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m10,954\u001b[0m (42.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" } ], "source": [ "model = tf.keras.models.Sequential()\n", "\n", "model.add(keras.layers.Dense(\n", " N_HIDDEN,\n", " input_shape=(28,28),\n", " name='input_layer',\n", " activation='relu'))\n", "model.add(keras.layers.Dropout(0.3))\n", "model.add(keras.layers.Dense(\n", " N_HIDDEN,\n", " name='dense_layer',\n", " activation='relu'))\n", "model.add(keras.layers.Dropout(0.3))\n", "model.add(keras.layers.Flatten(input_shape=(28,28)))\n", "model.add(keras.layers.Dense(\n", " NB_CLASSES,\n", " name='output_layer',\n", " activation='softmax'))\n", "\n", "model.summary()" ] }, { "cell_type": "code", "execution_count": 149, "id": "fbc19059-d592-4682-a8d7-5f8d126e211b", "metadata": {}, "outputs": [], "source": [ "model.compile(optimizer='Adam',\n", " loss= tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n", " metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 150, "id": "6c2c7e2b-1aab-4595-8e29-4fc557db8674", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 6ms/step - accuracy: 0.7030 - loss: 0.9725 - val_accuracy: 0.9309 - val_loss: 0.2369\n", "Epoch 2/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 7ms/step - accuracy: 0.9090 - loss: 0.2997 - val_accuracy: 0.9475 - val_loss: 0.1836\n", "Epoch 3/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 7ms/step - accuracy: 0.9277 - loss: 0.2366 - val_accuracy: 0.9522 - val_loss: 0.1621\n", "Epoch 4/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9356 - loss: 0.2212 - val_accuracy: 0.9546 - val_loss: 0.1534\n", "Epoch 5/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9409 - loss: 0.1953 - val_accuracy: 0.9580 - val_loss: 0.1435\n", "Epoch 6/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9435 - loss: 0.1839 - val_accuracy: 0.9589 - val_loss: 0.1413\n", "Epoch 7/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9452 - loss: 0.1813 - val_accuracy: 0.9603 - val_loss: 0.1383\n", "Epoch 8/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 6ms/step - accuracy: 0.9481 - loss: 0.1683 - val_accuracy: 0.9633 - val_loss: 0.1301\n", "Epoch 9/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9494 - loss: 0.1697 - val_accuracy: 0.9621 - val_loss: 0.1304\n", "Epoch 10/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9500 - loss: 0.1654 - val_accuracy: 0.9641 - val_loss: 0.1271\n", "Epoch 11/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 6ms/step - accuracy: 0.9496 - loss: 0.1626 - val_accuracy: 0.9650 - val_loss: 0.1252\n", "Epoch 12/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9483 - loss: 0.1659 - val_accuracy: 0.9657 - val_loss: 0.1227\n", "Epoch 13/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9532 - loss: 0.1525 - val_accuracy: 0.9646 - val_loss: 0.1228\n", "Epoch 14/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9505 - loss: 0.1539 - val_accuracy: 0.9650 - val_loss: 0.1212\n", "Epoch 15/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9538 - loss: 0.1491 - val_accuracy: 0.9653 - val_loss: 0.1211\n", "Epoch 16/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9536 - loss: 0.1507 - val_accuracy: 0.9656 - val_loss: 0.1238\n", "Epoch 17/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9529 - loss: 0.1524 - val_accuracy: 0.9653 - val_loss: 0.1230\n", "Epoch 18/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9536 - loss: 0.1475 - val_accuracy: 0.9661 - val_loss: 0.1189\n", "Epoch 19/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9543 - loss: 0.1463 - val_accuracy: 0.9667 - val_loss: 0.1194\n", "Epoch 20/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9561 - loss: 0.1401 - val_accuracy: 0.9656 - val_loss: 0.1222\n", "Epoch 21/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9571 - loss: 0.1427 - val_accuracy: 0.9671 - val_loss: 0.1200\n", "Epoch 22/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9581 - loss: 0.1390 - val_accuracy: 0.9667 - val_loss: 0.1176\n", "Epoch 23/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9559 - loss: 0.1485 - val_accuracy: 0.9670 - val_loss: 0.1175\n", "Epoch 24/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9570 - loss: 0.1382 - val_accuracy: 0.9677 - val_loss: 0.1158\n", "Epoch 25/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9575 - loss: 0.1383 - val_accuracy: 0.9680 - val_loss: 0.1144\n" ] } ], "source": [ "history = model.fit(X_train,Y_train,\n", " batch_size=BATCH_SIZE,\n", " epochs=EPOCHS,\n", " verbose=VARBOSE,\n", " validation_split=VALIDATION_SPLIT)" ] }, { "cell_type": "code", "execution_count": 151, "id": "5fe89ecb-659b-4ffe-ab8a-bec02c0b82ad", "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.9628 - loss: 0.1235\n", "Test accuracy: 0.9689000248908997\n", "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step\n" ] } ], "source": [ "test_loss, test_acc = model.evaluate(X_test, Y_test)\n", "print('Test accuracy:', test_acc)\n", "\n", "predictions = model.predict(X_test)" ] }, { "cell_type": "markdown", "id": "03529c7d-8b68-4436-adf7-7565fe4028ca", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## Checkpoint " ] }, { "cell_type": "code", "execution_count": 122, "id": "a975b6b5-0ddb-467f-9903-3e41777bcfd0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/25\n", "\u001b[1m746/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9570 - loss: 0.1399\n", "Epoch 1: val_loss improved from inf to 0.11284, saving model to model_checkpoints/weights.01-0.11.h5\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9570 - loss: 0.1399 - val_accuracy: 0.9682 - val_loss: 0.1128\n", "Epoch 2/25\n", "\u001b[1m745/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9580 - loss: 0.1361\n", "Epoch 2: val_loss did not improve from 0.11284\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9579 - loss: 0.1361 - val_accuracy: 0.9674 - val_loss: 0.1138\n", "Epoch 3/25\n", "\u001b[1m746/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 4ms/step - accuracy: 0.9567 - loss: 0.1380\n", "Epoch 3: val_loss improved from 0.11284 to 0.11038, saving model to model_checkpoints/weights.03-0.11.h5\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9567 - loss: 0.1379 - val_accuracy: 0.9688 - val_loss: 0.1104\n", "Epoch 4/25\n", "\u001b[1m744/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9582 - loss: 0.1391\n", "Epoch 4: val_loss did not improve from 0.11038\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9582 - loss: 0.1391 - val_accuracy: 0.9678 - val_loss: 0.1130\n", "Epoch 5/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9569 - loss: 0.1342\n", "Epoch 5: val_loss did not improve from 0.11038\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9569 - loss: 0.1342 - val_accuracy: 0.9683 - val_loss: 0.1119\n", "Epoch 6/25\n", "\u001b[1m744/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9592 - loss: 0.1327\n", "Epoch 6: val_loss did not improve from 0.11038\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9592 - loss: 0.1328 - val_accuracy: 0.9692 - val_loss: 0.1113\n", "Epoch 7/25\n", "\u001b[1m745/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9600 - loss: 0.1303\n", "Epoch 7: val_loss improved from 0.11038 to 0.10944, saving model to model_checkpoints/weights.07-0.11.h5\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9600 - loss: 0.1303 - val_accuracy: 0.9694 - val_loss: 0.1094\n", "Epoch 8/25\n", "\u001b[1m747/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9605 - loss: 0.1293\n", "Epoch 8: val_loss did not improve from 0.10944\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9605 - loss: 0.1293 - val_accuracy: 0.9693 - val_loss: 0.1107\n", "Epoch 9/25\n", "\u001b[1m742/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9605 - loss: 0.1308\n", "Epoch 9: val_loss did not improve from 0.10944\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9604 - loss: 0.1308 - val_accuracy: 0.9691 - val_loss: 0.1095\n", "Epoch 10/25\n", "\u001b[1m749/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9606 - loss: 0.1300\n", "Epoch 10: val_loss did not improve from 0.10944\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9606 - loss: 0.1300 - val_accuracy: 0.9674 - val_loss: 0.1117\n", "Epoch 11/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9597 - loss: 0.1289\n", "Epoch 11: val_loss improved from 0.10944 to 0.10944, saving model to model_checkpoints/weights.11-0.11.h5\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9597 - loss: 0.1289 - val_accuracy: 0.9693 - val_loss: 0.1094\n", "Epoch 12/25\n", "\u001b[1m745/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9596 - loss: 0.1292\n", "Epoch 12: val_loss did not improve from 0.10944\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9596 - loss: 0.1292 - val_accuracy: 0.9687 - val_loss: 0.1110\n", "Epoch 13/25\n", "\u001b[1m749/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9583 - loss: 0.1328\n", "Epoch 13: val_loss did not improve from 0.10944\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9583 - loss: 0.1328 - val_accuracy: 0.9679 - val_loss: 0.1097\n", "Epoch 14/25\n", "\u001b[1m744/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 6ms/step - accuracy: 0.9588 - loss: 0.1280\n", "Epoch 14: val_loss did not improve from 0.10944\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 6ms/step - accuracy: 0.9588 - loss: 0.1281 - val_accuracy: 0.9687 - val_loss: 0.1097\n", "Epoch 15/25\n", "\u001b[1m747/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9593 - loss: 0.1273\n", "Epoch 15: val_loss improved from 0.10944 to 0.10772, saving model to model_checkpoints/weights.15-0.11.h5\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9593 - loss: 0.1273 - val_accuracy: 0.9708 - val_loss: 0.1077\n", "Epoch 16/25\n", "\u001b[1m740/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9599 - loss: 0.1304\n", "Epoch 16: val_loss improved from 0.10772 to 0.10721, saving model to model_checkpoints/weights.16-0.11.h5\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9599 - loss: 0.1304 - val_accuracy: 0.9700 - val_loss: 0.1072\n", "Epoch 17/25\n", "\u001b[1m741/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9600 - loss: 0.1267\n", "Epoch 17: val_loss did not improve from 0.10721\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9600 - loss: 0.1268 - val_accuracy: 0.9717 - val_loss: 0.1089\n", "Epoch 18/25\n", "\u001b[1m749/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9599 - loss: 0.1258\n", "Epoch 18: val_loss did not improve from 0.10721\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9599 - loss: 0.1258 - val_accuracy: 0.9702 - val_loss: 0.1076\n", "Epoch 19/25\n", "\u001b[1m749/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9597 - loss: 0.1319\n", "Epoch 19: val_loss did not improve from 0.10721\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - accuracy: 0.9597 - loss: 0.1319 - val_accuracy: 0.9698 - val_loss: 0.1091\n", "Epoch 20/25\n", "\u001b[1m743/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9593 - loss: 0.1273\n", "Epoch 20: val_loss improved from 0.10721 to 0.10638, saving model to model_checkpoints/weights.20-0.11.h5\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9593 - loss: 0.1273 - val_accuracy: 0.9701 - val_loss: 0.1064\n", "Epoch 21/25\n", "\u001b[1m743/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9600 - loss: 0.1278\n", "Epoch 21: val_loss did not improve from 0.10638\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9599 - loss: 0.1278 - val_accuracy: 0.9696 - val_loss: 0.1065\n", "Epoch 22/25\n", "\u001b[1m743/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9614 - loss: 0.1267\n", "Epoch 22: val_loss did not improve from 0.10638\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9614 - loss: 0.1267 - val_accuracy: 0.9697 - val_loss: 0.1086\n", "Epoch 23/25\n", "\u001b[1m746/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9607 - loss: 0.1275\n", "Epoch 23: val_loss did not improve from 0.10638\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9607 - loss: 0.1275 - val_accuracy: 0.9694 - val_loss: 0.1091\n", "Epoch 24/25\n", "\u001b[1m747/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9604 - loss: 0.1262\n", "Epoch 24: val_loss did not improve from 0.10638\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9604 - loss: 0.1262 - val_accuracy: 0.9702 - val_loss: 0.1091\n", "Epoch 25/25\n", "\u001b[1m746/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 5ms/step - accuracy: 0.9611 - loss: 0.1261\n", "Epoch 25: val_loss did not improve from 0.10638\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 5ms/step - accuracy: 0.9611 - loss: 0.1261 - val_accuracy: 0.9703 - val_loss: 0.1072\n" ] } ], "source": [ "# ModelCheckpoint\n", "from tensorflow.keras.callbacks import ModelCheckpoint\n", "\n", "checkpoint_path = \"model_checkpoints/weights.{epoch:02d}-{val_loss:.2f}.keras\"\n", "checkpoint_callback = ModelCheckpoint(filepath=checkpoint_path,\n", " monitor='val_loss',\n", " verbose=1,\n", " save_best_only=True,\n", " mode='min')\n", "\n", "history = model.fit(X_train, Y_train,\n", " epochs=EPOCHS,\n", " verbose=VERBOSE,\n", " callbacks=[checkpoint_callback],\n", " batch_size=BATCH_SIZE,\n", " validation_split=VALIDATION_SPLIT)\n" ] }, { "cell_type": "markdown", "id": "a6226565-c626-4d57-bbb6-c4ed53e4a8d5", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## Rysowanie i testowanie poszczególnych liczb" ] }, { "cell_type": "code", "execution_count": 152, "id": "e3523f08-f904-495f-b732-16ef36b7e653", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", "def plot_image(i, predictions_array, true_label, img):\n", " true_label, img = true_label[i], img[i]\n", " plt.grid(False)\n", " plt.xticks([])\n", " plt.yticks([])\n", " plt.imshow(img, cmap=plt.cm.binary)\n", " predicted_label = np.argmax(predictions_array)\n", " if predicted_label == true_label:\n", " color ='blue'\n", " else:\n", " color ='red'\n", " plt.xlabel(\"Pred {} Conf: {:2.0f}% True ({})\".format(predicted_label,\n", " 100*np.max(predictions_array),\n", " true_label),\n", " color=color)\n", "def plot_value_array(i, predictions_array, true_label):\n", " true_label = true_label[i]\n", " plt.grid(False)\n", " plt.xticks(range(10))\n", " plt.yticks([])\n", " thisplot = plt.bar(range(10), predictions_array,color=\"#777777\")\n", " plt.ylim([0, 1])\n", " predicted_label = np.argmax(predictions_array)\n", " thisplot[predicted_label].set_color('red')\n", " thisplot[true_label].set_color('blue')" ] }, { "cell_type": "code", "execution_count": 153, "id": "88b5e8c6-f93f-4f05-b473-54565260d309", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
Model: \"sequential_5\"\n",
"\n"
],
"text/plain": [
"\u001b[1mModel: \"sequential_5\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ conv2d_12 (Conv2D) │ (None, 32, 32, 32) │ 896 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_12 │ (None, 32, 32, 32) │ 128 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ activation_12 (Activation) │ (None, 32, 32, 32) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_13 (Conv2D) │ (None, 32, 32, 32) │ 9,248 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_13 │ (None, 32, 32, 32) │ 128 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ activation_13 (Activation) │ (None, 32, 32, 32) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_6 (MaxPooling2D) │ (None, 16, 16, 32) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_6 (Dropout) │ (None, 16, 16, 32) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_14 (Conv2D) │ (None, 16, 16, 64) │ 18,496 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_14 │ (None, 16, 16, 64) │ 256 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ activation_14 (Activation) │ (None, 16, 16, 64) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_15 (Conv2D) │ (None, 16, 16, 64) │ 36,928 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_15 │ (None, 16, 16, 64) │ 256 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ activation_15 (Activation) │ (None, 16, 16, 64) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_7 (MaxPooling2D) │ (None, 8, 8, 64) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_7 (Dropout) │ (None, 8, 8, 64) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_16 (Conv2D) │ (None, 8, 8, 128) │ 73,856 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_16 │ (None, 8, 8, 128) │ 512 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ activation_16 (Activation) │ (None, 8, 8, 128) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_17 (Conv2D) │ (None, 8, 8, 128) │ 147,584 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_17 │ (None, 8, 8, 128) │ 512 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ activation_17 (Activation) │ (None, 8, 8, 128) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_8 (MaxPooling2D) │ (None, 4, 4, 128) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_8 (Dropout) │ (None, 4, 4, 128) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten_2 (Flatten) │ (None, 2048) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_4 (Dense) │ (None, 10) │ 20,490 │\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",
"│ conv2d_12 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m896\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_12 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m128\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ activation_12 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_13 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m9,248\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_13 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m128\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ activation_13 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_6 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_6 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_14 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m18,496\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_14 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ activation_14 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_15 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m36,928\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_15 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ activation_15 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m16\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_7 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_7 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_16 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m73,856\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_16 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ activation_16 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_17 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m147,584\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_17 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │\n",
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ activation_17 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_8 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_8 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten_2 (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2048\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_4 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m20,490\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Total params: 309,290 (1.18 MB)\n", "\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m309,290\u001b[0m (1.18 MB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Trainable params: 308,394 (1.18 MB)\n", "\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m308,394\u001b[0m (1.18 MB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Non-trainable params: 896 (3.50 KB)\n", "\n" ], "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m896\u001b[0m (3.50 KB)\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model.summary()" ] }, { "cell_type": "markdown", "id": "e0dff06e-57cd-4caf-a49e-2307764a9831", "metadata": {}, "source": [ "## Uczenie modelu" ] }, { "cell_type": "code", "execution_count": 47, "id": "227d98ed-a60d-4fcf-aa0a-2f9fc1b4050e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/5\n", "\u001b[1m195/195\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m44s\u001b[0m 193ms/step - accuracy: 0.1846 - loss: 2.9937 - val_accuracy: 0.1139 - val_loss: 119.8130\n", "Epoch 2/5\n", "\u001b[1m195/195\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 194ms/step - accuracy: 0.2884 - loss: 2.0893 - val_accuracy: 0.0997 - val_loss: 174.2058\n", "Epoch 3/5\n", "\u001b[1m195/195\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m34s\u001b[0m 174ms/step - accuracy: 0.3147 - loss: 1.9001 - val_accuracy: 0.1000 - val_loss: 198.8870\n", "Epoch 4/5\n", "\u001b[1m195/195\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m35s\u001b[0m 181ms/step - accuracy: 0.3143 - loss: 1.8317 - val_accuracy: 0.1010 - val_loss: 159.6765\n", "Epoch 5/5\n", "\u001b[1m195/195\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m40s\u001b[0m 206ms/step - accuracy: 0.3589 - loss: 1.7084 - val_accuracy: 0.1327 - val_loss: 79.0597\n" ] }, { "data": { "text/plain": [ "
Model: \"sequential_2\"\n",
"\n"
],
"text/plain": [
"\u001b[1mModel: \"sequential_2\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ embedding_1 (Embedding) │ ? │ 0 (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ simple_rnn_1 (SimpleRNN) │ ? │ 0 (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_2 (Dense) │ ? │ 0 (unbuilt) │\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",
"│ embedding_1 (\u001b[38;5;33mEmbedding\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ simple_rnn_1 (\u001b[38;5;33mSimpleRNN\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Total params: 0 (0.00 B)\n", "\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Trainable params: 0 (0.00 B)\n", "\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\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" } ], "source": [ "model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n", "model.summary()" ] }, { "cell_type": "code", "execution_count": null, "id": "6b024476-a946-4672-b1e9-8bb0de26c8e8", "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from tensorflow.keras.preprocessing.text import Tokenizer\n", "from tensorflow.keras.utils import to_categorical\n", "from tensorflow.keras.preprocessing.sequence import pad_sequences\n" ] }, { "cell_type": "code", "execution_count": null, "id": "862e9746-1f60-4036-b007-13240b285e2f", "metadata": {}, "outputs": [], "source": [ "text = \"\"\"\n", "Ala ma kota. Kot ma na imię Mruczek. Mruczek lubi mleko. Ala daje mu mleko każdego dnia.\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": null, "id": "76e6afde-0194-4714-8b77-8a1876c5d128", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "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.12.10" } }, "nbformat": 4, "nbformat_minor": 5 }