{ "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": [ "" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Train the model\n", "model.fit(X_train, Y_train,\n", " batch_size=BATCH_SIZE,\n", " epochs=EPOCHS,\n", " verbose=VERBOSE,\n", " validation_split=VALIDATION_SPLIT)" ] }, { "cell_type": "code", "execution_count": 40, "id": "da23d88f-8187-41eb-919b-c925b3330924", "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 3ms/step - accuracy: 0.9766 - loss: 0.1092\n", "Test accuracy: 0.9790999889373779\n" ] } ], "source": [ "# Evaluate the model\n", "test_loss, test_accuracy = model.evaluate(X_test, Y_test, verbose=VERBOSE)\n", "print(f\"Test accuracy: {test_accuracy}\")" ] }, { "cell_type": "markdown", "id": "de2850e3-395b-4a3a-8c01-b9d72b08d47a", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## TensorBoard" ] }, { "cell_type": "markdown", "id": "5c23c5b6-1e03-4e48-8590-44263c1e497d", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### TensorBoard " ] }, { "cell_type": "code", "execution_count": 44, "id": "3fa025c9-28b4-478a-bbd1-7c0168897bf9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The tensorboard extension is already loaded. To reload it, use:\n", " %reload_ext tensorboard\n" ] }, { "data": { "text/html": [ "\n", " \n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%load_ext tensorboard\n", "%tensorboard --logdir logs\n", "\n", "import datetime\n", "from tensorflow.keras.callbacks import TensorBoard" ] }, { "cell_type": "markdown", "id": "c10d00a5-3ff4-4659-be31-ccf1067f67c3", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Uczenie w TensorBoard" ] }, { "cell_type": "code", "execution_count": 45, "id": "7e2a394f-ebb5-49bc-8772-cc2d61836fe7", "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[1m11s\u001b[0m 11ms/step - accuracy: 0.7710 - loss: 0.6943 - val_accuracy: 0.9523 - val_loss: 0.1543\n", "Epoch 2/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 11ms/step - accuracy: 0.9438 - loss: 0.1872 - val_accuracy: 0.9643 - val_loss: 0.1207\n", "Epoch 3/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 12ms/step - accuracy: 0.9583 - loss: 0.1362 - val_accuracy: 0.9667 - val_loss: 0.1165\n", "Epoch 4/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.9670 - loss: 0.1089 - val_accuracy: 0.9722 - val_loss: 0.0957\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.9702 - loss: 0.0975 - val_accuracy: 0.9722 - val_loss: 0.1007\n", "Epoch 6/25\n", "\u001b[1m750/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.9733 - loss: 0.0856 - val_accuracy: 0.9741 - val_loss: 0.0988\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.9770 - loss: 0.0747 - val_accuracy: 0.9737 - val_loss: 0.0939\n", "Epoch 8/25\n", "\u001b[1m697/750\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━━\u001b[0m \u001b[1m0s\u001b[0m 7ms/step - accuracy: 0.9778 - loss: 0.0683" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[45]\u001b[39m\u001b[32m, line 6\u001b[39m\n\u001b[32m 1\u001b[39m log_dir = \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mlogs/fit/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mdatetime.datetime.now()\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m\n\u001b[32m 2\u001b[39m tensorboard_callback = TensorBoard(log_dir=log_dir,\n\u001b[32m 3\u001b[39m write_graph=\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[32m 4\u001b[39m write_images=\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[32m----> \u001b[39m\u001b[32m6\u001b[39m history = \u001b[43mmodel\u001b[49m\u001b[43m.\u001b[49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43mY_train\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 7\u001b[39m \u001b[43m \u001b[49m\u001b[43mepochs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mEPOCHS\u001b[49m\u001b[43m,\u001b[49m\u001b[43mverbose\u001b[49m\u001b[43m=\u001b[49m\u001b[43mVERBOSE\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 8\u001b[39m \u001b[43m \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[43m=\u001b[49m\u001b[43m[\u001b[49m\u001b[43mtensorboard_callback\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 9\u001b[39m \u001b[43m \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[43m=\u001b[49m\u001b[43mBATCH_SIZE\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 10\u001b[39m \u001b[43m \u001b[49m\u001b[43mvalidation_split\u001b[49m\u001b[43m=\u001b[49m\u001b[43mVALIDATION_SPLIT\u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/keras/src/utils/traceback_utils.py:117\u001b[39m, in \u001b[36mfilter_traceback..error_handler\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 115\u001b[39m filtered_tb = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 116\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m117\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 118\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 119\u001b[39m filtered_tb = _process_traceback_frames(e.__traceback__)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/keras/src/backend/tensorflow/trainer.py:371\u001b[39m, in \u001b[36mTensorFlowTrainer.fit\u001b[39m\u001b[34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq)\u001b[39m\n\u001b[32m 369\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m step, iterator \u001b[38;5;129;01min\u001b[39;00m epoch_iterator:\n\u001b[32m 370\u001b[39m callbacks.on_train_batch_begin(step)\n\u001b[32m--> \u001b[39m\u001b[32m371\u001b[39m logs = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mtrain_function\u001b[49m\u001b[43m(\u001b[49m\u001b[43miterator\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 372\u001b[39m callbacks.on_train_batch_end(step, logs)\n\u001b[32m 373\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.stop_training:\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/keras/src/backend/tensorflow/trainer.py:219\u001b[39m, in \u001b[36mTensorFlowTrainer._make_function..function\u001b[39m\u001b[34m(iterator)\u001b[39m\n\u001b[32m 215\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mfunction\u001b[39m(iterator):\n\u001b[32m 216\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\n\u001b[32m 217\u001b[39m iterator, (tf.data.Iterator, tf.distribute.DistributedIterator)\n\u001b[32m 218\u001b[39m ):\n\u001b[32m--> \u001b[39m\u001b[32m219\u001b[39m opt_outputs = \u001b[43mmulti_step_on_iterator\u001b[49m\u001b[43m(\u001b[49m\u001b[43miterator\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 220\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m opt_outputs.has_value():\n\u001b[32m 221\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/tensorflow/python/util/traceback_utils.py:150\u001b[39m, in \u001b[36mfilter_traceback..error_handler\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 148\u001b[39m filtered_tb = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 149\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m150\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 151\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 152\u001b[39m filtered_tb = _process_traceback_frames(e.__traceback__)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py:843\u001b[39m, in \u001b[36mFunction.__call__\u001b[39m\u001b[34m(self, *args, **kwds)\u001b[39m\n\u001b[32m 841\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m context.executing_eagerly():\n\u001b[32m 842\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m without_tracing:\n\u001b[32m--> \u001b[39m\u001b[32m843\u001b[39m \u001b[43m_frequent_tracing_detector_manager\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcalled_without_tracing\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 844\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_key_for_call_stats\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 845\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 846\u001b[39m _frequent_tracing_detector_manager.called_with_tracing(\n\u001b[32m 847\u001b[39m \u001b[38;5;28mself\u001b[39m._key_for_call_stats, \u001b[38;5;28mself\u001b[39m._python_function,\n\u001b[32m 848\u001b[39m \u001b[38;5;28mself\u001b[39m._omit_frequent_tracing_warning)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py:196\u001b[39m, in \u001b[36m_FrequentTracingDetectorManager.called_without_tracing\u001b[39m\u001b[34m(self, key)\u001b[39m\n\u001b[32m 194\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mcalled_without_tracing\u001b[39m(\u001b[38;5;28mself\u001b[39m, key):\n\u001b[32m 195\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m._lock:\n\u001b[32m--> \u001b[39m\u001b[32m196\u001b[39m detector = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_get_detector\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 197\u001b[39m detector.called_without_tracing()\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py:189\u001b[39m, in \u001b[36m_FrequentTracingDetectorManager._get_detector\u001b[39m\u001b[34m(self, key)\u001b[39m\n\u001b[32m 186\u001b[39m \u001b[38;5;28mself\u001b[39m._detectors = weakref.WeakKeyDictionary() \u001b[38;5;66;03m# GUARDED_BY(self._lock)\u001b[39;00m\n\u001b[32m 187\u001b[39m \u001b[38;5;28mself\u001b[39m._lock = threading.Lock()\n\u001b[32m--> \u001b[39m\u001b[32m189\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_get_detector\u001b[39m(\u001b[38;5;28mself\u001b[39m, key):\n\u001b[32m 190\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m key \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m._detectors:\n\u001b[32m 191\u001b[39m \u001b[38;5;28mself\u001b[39m._detectors[key] = _FrequentTracingDetector()\n", "\u001b[31mKeyboardInterrupt\u001b[39m: " ] } ], "source": [ "log_dir = f\"logs/fit/{datetime.datetime.now()}\"\n", "tensorboard_callback = TensorBoard(log_dir=log_dir,\n", " write_graph=True,\n", " write_images=True)\n", "\n", "history = model.fit(X_train,Y_train,\n", " epochs=EPOCHS,verbose=VERBOSE,\n", " callbacks=[tensorboard_callback],\n", " batch_size=BATCH_SIZE,\n", " validation_split=VALIDATION_SPLIT)" ] }, { "cell_type": "markdown", "id": "01d2d551-e12b-4f6a-9924-3b710a7717d0", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## Uczenie 2d" ] }, { "cell_type": "markdown", "id": "1a22d09d-23c8-4a5a-a4cd-64f88c046f01", "metadata": {}, "source": [ "### flatten" ] }, { "cell_type": "code", "execution_count": 141, "id": "423ecce3-974f-4cff-af9f-275d4d9204ae", "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "import numpy as np\n", "from tensorflow import keras" ] }, { "cell_type": "code", "execution_count": 142, "id": "8b4c45de-ab64-49b0-b8db-d3af9f6f8006", "metadata": {}, "outputs": [], "source": [ "mnist = keras.datasets.mnist\n", "(X_train,Y_train),(X_test,Y_test) = mnist.load_data()" ] }, { "cell_type": "code", "execution_count": 143, "id": "4429b0b5-57cf-4786-b6f0-d66fe8fc417f", "metadata": {}, "outputs": [], "source": [ "EPOCHS = 25\n", "BATCH_SIZE = 64 # 32/64/128/256/512/1\n", "VARBOSE = 1\n", "NB_CLASSES = 10\n", "N_HIDDEN = 32 #128/256/512\n", "VALIDATION_SPLIT = 0.2" ] }, { "cell_type": "code", "execution_count": 144, "id": "6371c25c-12fa-46a1-a7f9-82c5c5aebce4", "metadata": {}, "outputs": [], "source": [ "X_train = X_train.astype('float32')\n", "X_test = X_test.astype('float32')\n", "X_train /= 255\n", "X_test /= 255" ] }, { "cell_type": "code", "execution_count": 148, "id": "f051c774-53e4-4185-b575-c49201b5a243", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
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": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "i = 100\n", "plt.figure(figsize=(6,3))\n", "plt.subplot(1,2,1)\n", "plot_image(i, predictions[i], Y_test, X_test)\n", "plt.subplot(1,2,2)\n", "plot_value_array(i, predictions[i], Y_test)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "afe9edfc-44a9-4a25-974d-ae5ad5f8ac7a", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "739bb39c-1bdf-41ee-bad1-65c558ebf9b5", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "10c1179a-40b3-4105-acdc-8d0e27113c00", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "9a4e558b-453a-4e35-ba66-4eb39961ff34", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "2b02718a-f1c0-44a9-843c-c1186d3268ed", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "# Modele publiczne które warto znać" ] }, { "cell_type": "markdown", "id": "423e279c-cd57-4266-ad6a-2d72a10d71b7", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## Manus AI \n", "manus.im\n", "Środowisko AI służące do budowania i uruchamiania środowisk AI\n", "Na przykład - zadajemy mu pytanie, on podejmuje wybór który model i jakie źródła danych są najlepsze, tworzy całe środowisko, uruchamia i daje odpowiedź na pytanie. Całe to środowisko następnie można pobrać i dowolnie modyfikować\n", "## Grok AI\n", "## ChatGPT\n", "## DeepSeek" ] }, { "cell_type": "markdown", "id": "9c2a5dc2-9d2a-4ea3-94a8-be869e4f43d9", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "# Kod" ] }, { "cell_type": "code", "execution_count": 194, "id": "e0ce3dea-2489-4b10-ba5e-424c890df254", "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense\n", "from tensorflow.keras.optimizers import Adam\n", "from tensorflow.keras.losses import MeanSquaredError\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.metrics import r2_score\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "a1ddc3c3-ce65-455c-890a-00ea26bbc832", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## Wczytywanie danych" ] }, { "cell_type": "markdown", "id": "d0bb3c0a-da07-4a5d-a73b-9c0934cae1c2", "metadata": {}, "source": [ "### Pobierz" ] }, { "cell_type": "code", "execution_count": 195, "id": "7f2a9747-3724-4292-9e1d-15e1f950c12a", "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras.datasets import boston_housing\n", "(X_train, Y_train),(X_test, Y_test) = boston_housing.load_data()" ] }, { "cell_type": "markdown", "id": "4ddb9b79-03fb-4682-9163-5a5a53bf04b8", "metadata": {}, "source": [ "### Skaluj" ] }, { "cell_type": "code", "execution_count": 196, "id": "3f1fe9af-3bee-45a5-ab0f-14d4bb43ab0b", "metadata": {}, "outputs": [], "source": [ "scaler = StandardScaler()\n", "X_train_scaled = scaler.fit_transform(X_train)\n", "X_test_scaled = scaler.transform(X_test)" ] }, { "cell_type": "markdown", "id": "2e1e1867-96f6-4efe-98d5-245cec46af8d", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## Stwórz model" ] }, { "cell_type": "code", "execution_count": 197, "id": "9eeb9794-0c62-4bcb-9fbf-3cc1db22e321", "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:87: 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" ] } ], "source": [ "model = Sequential()\n", "model.add(Dense(128, activation='relu', input_shape=(X_train.shape[1],)))\n", "model.add(Dense(64, activation='relu'))\n", "model.add(Dense(1))" ] }, { "cell_type": "code", "execution_count": 198, "id": "093c6721-782a-4874-9ae7-ad2101c31485", "metadata": {}, "outputs": [], "source": [ "model.compile(\n", " optimizer=Adam(learning_rate=0.01),\n", " loss=MeanSquaredError(),\n", " metrics=['mae']\n", ")" ] }, { "cell_type": "markdown", "id": "cf865570-7117-42f0-8254-d940a0eab94a", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## Naucz" ] }, { "cell_type": "code", "execution_count": 199, "id": "004d195e-f082-4d6a-acdc-28df3bce52d1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 31ms/step - loss: 433.9581 - mae: 18.4893 - val_loss: 117.5812 - val_mae: 8.2945\n", "Epoch 2/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 88.5552 - mae: 6.8727 - val_loss: 45.8522 - val_mae: 5.4736\n", "Epoch 3/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 53.5171 - mae: 5.3221 - val_loss: 25.5144 - val_mae: 3.8536\n", "Epoch 4/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - loss: 20.9328 - mae: 3.2101 - val_loss: 19.1949 - val_mae: 3.2938\n", "Epoch 5/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 16.2139 - mae: 2.8114 - val_loss: 16.7875 - val_mae: 2.9549\n", "Epoch 6/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 16.5900 - mae: 2.8607 - val_loss: 14.2655 - val_mae: 2.8645\n", "Epoch 7/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 19ms/step - loss: 11.1120 - mae: 2.3432 - val_loss: 15.8941 - val_mae: 2.7828\n", "Epoch 8/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 12.4062 - mae: 2.5082 - val_loss: 14.3744 - val_mae: 2.7206\n", "Epoch 9/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 8.6999 - mae: 2.0951 - val_loss: 16.5603 - val_mae: 2.8280\n", "Epoch 10/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 8ms/step - loss: 10.6882 - mae: 2.2401 - val_loss: 14.5484 - val_mae: 2.8062\n", "Epoch 11/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 8.7652 - mae: 2.1168 - val_loss: 15.9710 - val_mae: 2.7320\n", "Epoch 12/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 10.4021 - mae: 2.2209 - val_loss: 16.1592 - val_mae: 3.1247\n", "Epoch 13/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - loss: 11.4349 - mae: 2.2756 - val_loss: 18.4284 - val_mae: 2.8497\n", "Epoch 14/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 8.7865 - mae: 2.1975 - val_loss: 15.3663 - val_mae: 2.9779\n", "Epoch 15/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 8.5554 - mae: 2.1210 - val_loss: 19.6532 - val_mae: 3.0629\n", "Epoch 16/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 10.0664 - mae: 2.2197 - val_loss: 17.1585 - val_mae: 2.7987\n", "Epoch 17/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 10.2282 - mae: 2.3738 - val_loss: 22.9011 - val_mae: 3.3688\n", "Epoch 18/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 13.8609 - mae: 2.7961 - val_loss: 21.8463 - val_mae: 3.0875\n", "Epoch 19/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - loss: 16.7707 - mae: 3.0324 - val_loss: 18.6410 - val_mae: 3.2069\n", "Epoch 20/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 12.3367 - mae: 2.3755 - val_loss: 24.3661 - val_mae: 3.2879\n", "Epoch 21/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 8.9119 - mae: 2.2774 - val_loss: 16.1305 - val_mae: 3.0695\n", "Epoch 22/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step - loss: 8.5175 - mae: 2.1657 - val_loss: 19.4054 - val_mae: 2.8900\n", "Epoch 23/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - loss: 7.4022 - mae: 2.0106 - val_loss: 16.4109 - val_mae: 2.6860\n", "Epoch 24/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 6.6488 - mae: 1.9070 - val_loss: 13.9394 - val_mae: 2.5710\n", "Epoch 25/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 8ms/step - loss: 8.4478 - mae: 1.9382 - val_loss: 14.9801 - val_mae: 2.6315\n", "Epoch 26/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 6.7423 - mae: 1.8794 - val_loss: 13.7264 - val_mae: 2.5257\n", "Epoch 27/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 8.4049 - mae: 2.0496 - val_loss: 13.8640 - val_mae: 2.7779\n", "Epoch 28/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 9.3020 - mae: 2.0520 - val_loss: 15.9040 - val_mae: 2.5764\n", "Epoch 29/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 7.6875 - mae: 2.0375 - val_loss: 13.0019 - val_mae: 2.4454\n", "Epoch 30/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 6.8073 - mae: 1.9071 - val_loss: 14.1228 - val_mae: 2.6777\n", "Epoch 31/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 8ms/step - loss: 6.6327 - mae: 1.8368 - val_loss: 13.3223 - val_mae: 2.5823\n", "Epoch 32/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 8.2943 - mae: 2.0431 - val_loss: 13.4468 - val_mae: 2.4980\n", "Epoch 33/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 8.4856 - mae: 1.8742 - val_loss: 11.6833 - val_mae: 2.4548\n", "Epoch 34/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 8ms/step - loss: 7.3320 - mae: 1.8344 - val_loss: 13.4887 - val_mae: 2.5681\n", "Epoch 35/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 7.4076 - mae: 1.9290 - val_loss: 12.8900 - val_mae: 2.7249\n", "Epoch 36/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - loss: 8.9403 - mae: 2.0053 - val_loss: 11.3275 - val_mae: 2.3754\n", "Epoch 37/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 5.9852 - mae: 1.7320 - val_loss: 13.9605 - val_mae: 2.4646\n", "Epoch 38/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 5.5555 - mae: 1.7334 - val_loss: 11.2402 - val_mae: 2.3342\n", "Epoch 39/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 5.6766 - mae: 1.6351 - val_loss: 13.2182 - val_mae: 2.5067\n", "Epoch 40/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 6.0243 - mae: 1.7333 - val_loss: 10.7153 - val_mae: 2.3825\n", "Epoch 41/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 5.8088 - mae: 1.6271 - val_loss: 11.9364 - val_mae: 2.4776\n", "Epoch 42/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - loss: 5.4119 - mae: 1.7531 - val_loss: 13.0173 - val_mae: 2.4271\n", "Epoch 43/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - loss: 7.8454 - mae: 1.8227 - val_loss: 12.9081 - val_mae: 2.6552\n", "Epoch 44/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - loss: 6.7705 - mae: 1.9081 - val_loss: 14.7583 - val_mae: 2.9245\n", "Epoch 45/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 22ms/step - loss: 7.5827 - mae: 2.0380 - val_loss: 13.1053 - val_mae: 2.5901\n", "Epoch 46/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 5.7081 - mae: 1.6853 - val_loss: 12.8988 - val_mae: 2.4437\n", "Epoch 47/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 6.2910 - mae: 1.8111 - val_loss: 14.5246 - val_mae: 2.7474\n", "Epoch 48/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - loss: 5.2125 - mae: 1.7195 - val_loss: 30.6900 - val_mae: 4.1277\n", "Epoch 49/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - loss: 24.0342 - mae: 3.6991 - val_loss: 24.3995 - val_mae: 3.9990\n", "Epoch 50/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - loss: 15.9115 - mae: 2.8875 - val_loss: 14.5218 - val_mae: 3.0977\n", "Epoch 51/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 10.4889 - mae: 2.3489 - val_loss: 11.0483 - val_mae: 2.5508\n", "Epoch 52/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - loss: 8.2176 - mae: 2.0835 - val_loss: 11.1425 - val_mae: 2.5365\n", "Epoch 53/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - loss: 6.4539 - mae: 1.9117 - val_loss: 13.2539 - val_mae: 2.6485\n", "Epoch 54/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 5.8317 - mae: 1.7835 - val_loss: 10.0556 - val_mae: 2.2885\n", "Epoch 55/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - loss: 6.0714 - mae: 1.7738 - val_loss: 11.3221 - val_mae: 2.4872\n", "Epoch 56/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 7.4216 - mae: 1.8305 - val_loss: 10.3006 - val_mae: 2.3735\n", "Epoch 57/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - loss: 7.0539 - mae: 1.8459 - val_loss: 10.5398 - val_mae: 2.3973\n", "Epoch 58/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 6.2669 - mae: 1.7912 - val_loss: 12.5495 - val_mae: 2.7715\n", "Epoch 59/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 6.5678 - mae: 1.9863 - val_loss: 11.1018 - val_mae: 2.2908\n", "Epoch 60/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 5.4177 - mae: 1.7153 - val_loss: 9.9706 - val_mae: 2.2454\n", "Epoch 61/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - loss: 4.7288 - mae: 1.5695 - val_loss: 10.9810 - val_mae: 2.3551\n", "Epoch 62/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 4.4483 - mae: 1.5186 - val_loss: 10.6617 - val_mae: 2.2474\n", "Epoch 63/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 4.4560 - mae: 1.5384 - val_loss: 10.3425 - val_mae: 2.3241\n", "Epoch 64/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - loss: 4.8169 - mae: 1.5290 - val_loss: 15.1452 - val_mae: 2.5667\n", "Epoch 65/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - loss: 15.9096 - mae: 2.6377 - val_loss: 17.4180 - val_mae: 3.3692\n", "Epoch 66/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 10.7279 - mae: 2.5080 - val_loss: 11.3642 - val_mae: 2.4789\n", "Epoch 67/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 6.4679 - mae: 1.8719 - val_loss: 9.7717 - val_mae: 2.2388\n", "Epoch 68/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 5.1761 - mae: 1.6499 - val_loss: 12.7262 - val_mae: 2.7122\n", "Epoch 69/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 5.5812 - mae: 1.6845 - val_loss: 9.4567 - val_mae: 2.3712\n", "Epoch 70/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 5.1458 - mae: 1.6184 - val_loss: 10.7782 - val_mae: 2.3204\n", "Epoch 71/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - loss: 5.7928 - mae: 1.7103 - val_loss: 10.1103 - val_mae: 2.3949\n", "Epoch 72/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - loss: 4.5397 - mae: 1.5225 - val_loss: 10.0058 - val_mae: 2.2562\n", "Epoch 73/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 4.7035 - mae: 1.5499 - val_loss: 11.2216 - val_mae: 2.4738\n", "Epoch 74/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 9.5389 - mae: 2.2685 - val_loss: 11.7173 - val_mae: 2.5778\n", "Epoch 75/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 10.8038 - mae: 2.3721 - val_loss: 14.9679 - val_mae: 3.1010\n", "Epoch 76/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 8.6432 - mae: 2.3237 - val_loss: 13.6855 - val_mae: 2.6954\n", "Epoch 77/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 5.7643 - mae: 1.7988 - val_loss: 10.2869 - val_mae: 2.3319\n", "Epoch 78/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - loss: 4.5972 - mae: 1.6025 - val_loss: 10.2548 - val_mae: 2.3824\n", "Epoch 79/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 3.8668 - mae: 1.4693 - val_loss: 12.0222 - val_mae: 2.5057\n", "Epoch 80/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - loss: 4.3990 - mae: 1.6195 - val_loss: 9.8486 - val_mae: 2.2541\n", "Epoch 81/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 4.3753 - mae: 1.5336 - val_loss: 11.2061 - val_mae: 2.4479\n", "Epoch 82/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - loss: 5.2621 - mae: 1.7148 - val_loss: 11.9659 - val_mae: 2.5600\n", "Epoch 83/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - loss: 4.8323 - mae: 1.5652 - val_loss: 13.1333 - val_mae: 2.7751\n", "Epoch 84/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 5.9845 - mae: 1.7861 - val_loss: 13.7430 - val_mae: 2.6907\n", "Epoch 85/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 4.8981 - mae: 1.5957 - val_loss: 14.8737 - val_mae: 2.5673\n", "Epoch 86/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 6.0925 - mae: 1.8527 - val_loss: 11.3868 - val_mae: 2.4224\n", "Epoch 87/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 4.6439 - mae: 1.5794 - val_loss: 10.9559 - val_mae: 2.3853\n", "Epoch 88/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 3.3516 - mae: 1.3203 - val_loss: 10.0497 - val_mae: 2.2155\n", "Epoch 89/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - loss: 4.9605 - mae: 1.5329 - val_loss: 10.0315 - val_mae: 2.2669\n", "Epoch 90/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 4.9860 - mae: 1.6187 - val_loss: 9.4829 - val_mae: 2.2375\n", "Epoch 91/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - loss: 4.0989 - mae: 1.4642 - val_loss: 12.6884 - val_mae: 2.5615\n", "Epoch 92/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - loss: 4.6787 - mae: 1.5383 - val_loss: 11.4163 - val_mae: 2.3816\n", "Epoch 93/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - loss: 4.9045 - mae: 1.6334 - val_loss: 9.7578 - val_mae: 2.2771\n", "Epoch 94/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - loss: 4.4899 - mae: 1.5949 - val_loss: 10.5372 - val_mae: 2.4074\n", "Epoch 95/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - loss: 4.5016 - mae: 1.6066 - val_loss: 12.7994 - val_mae: 2.5053\n", "Epoch 96/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - loss: 4.9262 - mae: 1.6298 - val_loss: 10.8206 - val_mae: 2.3941\n", "Epoch 97/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 5.3382 - mae: 1.6310 - val_loss: 10.4211 - val_mae: 2.3298\n", "Epoch 98/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 3.7149 - mae: 1.4453 - val_loss: 12.7979 - val_mae: 2.4910\n", "Epoch 99/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - loss: 5.2015 - mae: 1.7130 - val_loss: 10.1702 - val_mae: 2.3183\n", "Epoch 100/100\n", "\u001b[1m11/11\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 10ms/step - loss: 3.8310 - mae: 1.4211 - val_loss: 10.5756 - val_mae: 2.2947\n" ] } ], "source": [ "history = model.fit(\n", " X_train_scaled, Y_train,\n", " epochs=100,\n", " validation_split=0.2,\n", " verbose=1\n", ")" ] }, { "cell_type": "markdown", "id": "0a252a76-ec52-4bdb-80ca-255344530230", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## Ewaluacja\n" ] }, { "cell_type": "code", "execution_count": 200, "id": "854aaf6f-1b64-4670-aeda-a5c828026c5f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m4/4\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - loss: 14.3194 - mae: 2.7127\n", "Średni błąd absolutny (MAE): 2.86\n" ] } ], "source": [ "loss, mae = model.evaluate(X_test_scaled, Y_test)\n", "print(f\"Średni błąd absolutny (MAE): {mae:.2f}\")" ] }, { "cell_type": "code", "execution_count": 201, "id": "43089c42-4bcf-4954-8cf1-3dfa3296326c", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:5 out of the last 318 calls to .one_step_on_data_distributed at 0x70c842a3e660> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:tensorflow:5 out of the last 318 calls to .one_step_on_data_distributed at 0x70c842a3e660> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m1/4\u001b[0m \u001b[32m━━━━━\u001b[0m\u001b[37m━━━━━━━━━━━━━━━\u001b[0m \u001b[1m0s\u001b[0m 98ms/stepWARNING:tensorflow:6 out of the last 321 calls to .one_step_on_data_distributed at 0x70c842a3e660> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:tensorflow:6 out of the last 321 calls to .one_step_on_data_distributed at 0x70c842a3e660> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m4/4\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step\n", "R²: 0.80\n" ] } ], "source": [ "Y_pred = model.predict(X_test_scaled)\n", "r2 = r2_score(Y_test, Y_pred)\n", "print(f\"R²: {r2:.2f}\")" ] }, { "cell_type": "markdown", "id": "93a9f39d-5241-404c-91fd-12b888d0d25e", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## Narysuk wykresy" ] }, { "cell_type": "code", "execution_count": 202, "id": "e7952801-3790-4930-944e-5745f366d98d", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true }, "scrolled": true }, "outputs": [ { "data": { "image/png": "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p3LceOON/PzzzzzwwANceOGFBAcHY7fb6d+/f6XX6GzK/Oyzz/LYY48xevRonn76aSIiIvDy8uKee+6p8vtwqvPW5DWsquq+zxWd2AeqnM1mq5GyyZ+bwo6IG0RERDBq1ChGjRpFbm4uvXr14oknnnCEnVP9oW/YsCELFy4kJyfHqXbnt99+c+w/G5988gkjRozgX//6l2NbYWGh0+ikUzlVWU+nadOmLFy4kO7du1c5kJ1Jw4YN2b59+0nbK7s2PXv25Pnnn2fhwoVERUXRqlUrLBYLbdq0YdmyZSxbtoyrrrrKcfyxY8dYtGgRTz75JJMnT3ZsP5umyNP55JNPuOyyy/jf//7ntD0zM5OoqKgaPdeJyq/P9u3bufzyy532bd++3bG//N/KXvuJ1/9c3ufymrATfwdPrL0UORtqxhJxsROHKgcHB9OsWTOKiooc24KCgoCT/9APHDgQm83Gv//9b6ftL7/8MhaLhQEDBpxVmaxW60nf8F9//fUqfYsuH11VlWBU7sYbb8Rms/H000+ftK+0tLRaz1Vu4MCBrF69mhUrVji25eXlMX36dBo1auTUn6Rnz54UFRXxyiuv0KNHD0dg69mzJx988AEHDx506q9TXity4jV65ZVXql3O06nsfZgzZ06lQ79rWufOnYmJieGtt95y+l389ttv2bZtm2OUWv369bnwwgt57733nJrWFixY4OgXVe5c3uemTZsCOI2cs9lsTJ8+/axen0hFqtkRcbGkpCR69+5Np06diIiIYO3atXzyySeMHz/ecUynTp0AmDBhAv369cNqtXLzzTczePBgLrvsMh555BH27NlDhw4d+P777/nyyy+55557HB8Q1XXVVVfxwQcfEBoaSlJSEitWrGDhwoVERkae8bEBAQEkJSXx0Ucf0aJFCyIiImjbtu1pl8249NJLueOOO5gyZQobNmzgyiuvxMfHhx07djBnzhxeffVVrr/++mq9hocffpgPP/yQAQMGMGHCBCIiInjvvffYvXs3n376qVNTWnJyMt7e3mzfvp3bb7/dsb1Xr15MmzYNwCnshISE0KtXL6ZOnUpJSQkXXHAB33//Pbt3765WGc/kqquu4qmnnmLUqFFccsklbNq0iZkzZ9KkSZMaPU9lfHx8eP755xk1ahSXXnopQ4cOdQw9b9SoEffee6/j2ClTpjBo0CB69OjB6NGjycjI4PXXX6dNmzaOeYng3N7nNm3acPHFFzNp0iQyMjKIiIhg9uzZlJaWuvxayJ+AB0eCidR65cNh16xZU+n+Sy+99IxDz//5z38aXbt2NcLCwoyAgACjVatWxjPPPGMUFxc7jiktLTXuvvtuIzo62rBYLE7D0HNycox7773XiI+PN3x8fIzmzZsbL7zwgmG3253OCxjjxo2rtJycMFT82LFjxqhRo4yoqCgjODjY6Nevn/Hbb7+dVPZT+fnnn41OnToZvr6+Ts89YsQIIygo6JSPmz59utGpUycjICDAqFevntGuXTvjwQcfNA4ePOh0/Sobqn/iUGXDMIxdu3YZ119/vREWFmb4+/sbXbt2NebOnVvpubt06WIAxqpVqxzb9u/fbwBGQkLCScfv37/fuPbaa42wsDAjNDTUuOGGG4yDBw+edC3Lh54fPnzY6fGVDaWubOj5fffdZ9SvX98ICAgwunfvbqxYsaLS11qZyt7z3bt3G4DxwgsvOG0vH8I9Z84cp+0fffSR0bFjR8PPz8+IiIgwhg0bZuzfv/+kc3366adG69atDT8/PyMpKcn47LPPjBEjRjgNPS9Xlff5VO9n3759DT8/PyM2Ntb4xz/+YSxYsEBDz+WcWQzDhb3VRERERDxMfXZERESkTlPYERERkTpNYUdERETqNI+GnWnTptG+fXtCQkIICQkhOTnZafr73r17O60CbbFYTpqSPSUlhUGDBhEYGEhMTAwPPPCAeu+LiIiIg0eHnjdo0IDnnnuO5s2bYxgG7733HldffTW//PKLY2Xj2267jaeeesrxmIqrMdtsNgYNGkRcXBw///wzhw4dYvjw4fj4+PDss8+6/fWIiIhI7VPrRmNFRETwwgsvMGbMGHr37s2FF154yom8vv32W6666ioOHjxIbGwsAG+99RYPPfQQhw8fxtfX140lFxERkdqo1kwqaLPZmDNnDnl5eSQnJzu2z5w5k//7v/8jLi6OwYMH89hjjzlqd1asWEG7du0cQQegX79+jB07li1bttCxY8dKz1VUVOQ0Y6jdbicjI4PIyMizmgpfRERE3M8wDHJycoiPjz9pTb6KPB52Nm3aRHJyMoWFhQQHB/P55587pnn/61//SsOGDYmPj2fjxo089NBDbN++nc8++wyA1NRUp6ADOO6npqae8pxTpkzhySefdNErEhEREXfat28fDRo0OOV+j4edli1bsmHDBrKyshyLEy5dupSkpCSnad3btWtH/fr16dOnD7t27TrrafIBJk2axMSJEx33s7KySExMZN++fYSEhJzT6xERERH3yM7OJiEhwWmh5Mp4POz4+vrSrFkzwFwfaM2aNbz66qv85z//OenYbt26AbBz506aNm1KXFwcq1evdjomLS0NgLi4uFOe08/PDz8/v5O2l48KExERkfPHmbqg1Lp5dux2u1N/moo2bNgAmKvwgrm436ZNm0hPT3ccs2DBAkJCQpxWPBYREZE/L4/W7EyaNIkBAwaQmJhITk4Os2bN4ocffuC7775j165dzJo1i4EDBxIZGcnGjRu599576dWrF+3btwfgyiuvJCkpiVtvvZWpU6eSmprKo48+yrhx4yqtuREREZE/H4+GnfT0dIYPH86hQ4cIDQ2lffv2fPfdd1xxxRXs27ePhQsX8sorr5CXl0dCQgJDhgzh0UcfdTzearUyd+5cxo4dS3JyMkFBQYwYMcJpXh4RERH5c6t18+x4QnZ2NqGhoWRlZanPjohIHWSz2SgpKfF0MaSafHx8sFqtp9xf1c9vj3dQFhERcRXDMEhNTSUzM9PTRZGzFBYWRlxc3DnNg6ewIyIidVZ50ImJiSEwMFATx55HDMMgPz/fMQipfHDS2VDYERGROslmszmCTmRkpKeLI2chICAAMPv4xsTEnLZJ63Rq3dBzERGRmlDeR6fiAtJy/il//86lz5XCjoiI1Glqujq/1cT7p7AjIiIidZrCjoiISB3XqFEjXnnlFY8/h6eog7KIiEgt07t3by688MIaCxdr1qwhKCioRp7rfKSw40Lp2YUUldqJrueHv8/Z9SAXERGpjGEY2Gw2vL3P/FEeHR3thhLVXmrGcqGbpq+k59QlbD6Q5emiiIjIeWLkyJEsXbqUV199FYvFgsViYc+ePfzwww9YLBa+/fZbOnXqhJ+fHz/99BO7du3i6quvJjY2luDgYLp06cLChQudnvPEJiiLxcJ///tfrr32WgIDA2nevDlfffVVtcqZkpLC1VdfTXBwMCEhIdx4442kpaU59v/6669cdtll1KtXj5CQEDp16sTatWsB2Lt3L4MHDyY8PJygoCDatGnDvHnzzv6inYFqdlzI6mX2IC+x/elX5BARqRUMw6CgxOaRcwf4WKs0sujVV1/l999/p23bto61HqOjo9mzZw8ADz/8MC+++CJNmjQhPDycffv2MXDgQJ555hn8/Px4//33GTx4MNu3bycxMfGU53nyySeZOnUqL7zwAq+//jrDhg1j7969REREnLGMdrvdEXSWLl1KaWkp48aN46abbuKHH34AYNiwYXTs2JFp06ZhtVrZsGEDPj4+AIwbN47i4mJ+/PFHgoKC2Lp1K8HBwWc879lS2HEh77KwY7Mr7IiI1AYFJTaSJn/nkXNvfaofgb5n/tgNDQ3F19eXwMBA4uLiTtr/1FNPccUVVzjuR0RE0KFDB8f9p59+ms8//5yvvvqK8ePHn/I8I0eOZOjQoQA8++yzvPbaa6xevZr+/fufsYyLFi1i06ZN7N69m4SEBADef/992rRpw5o1a+jSpQspKSk88MADtGrVCoDmzZs7Hp+SksKQIUNo164dAE2aNDnjOc+FmrFcyNtqhp1Su93DJRERkbqic+fOTvdzc3O5//77ad26NWFhYQQHB7Nt2zZSUlJO+zzt27d3/BwUFERISIhjaYYz2bZtGwkJCY6gA5CUlERYWBjbtm0DYOLEifztb3+jb9++PPfcc+zatctx7IQJE/jnP/9J9+7defzxx9m4cWOVznu2VLPjQlYvM0uWqhlLRKRWCPCxsvWpfh47d004cVTV/fffz4IFC3jxxRdp1qwZAQEBXH/99RQXF5/2ecqblMpZLBbsNfjl/IknnuCvf/0r33zzDd9++y2PP/44s2fP5tprr+Vvf/sb/fr145tvvuH7779nypQp/Otf/+Luu++usfNXpLDjQj5e5TU7CjsiIrWBxWKpUlOSp/n6+mKzVa1v0fLlyxk5ciTXXnstYNb0lPfvcZXWrVuzb98+9u3b56jd2bp1K5mZmSQlJTmOa9GiBS1atODee+9l6NChzJgxw1HOhIQE7rzzTu68804mTZrE22+/7bKwo2YsF7Kqz46IiJyFRo0asWrVKvbs2cORI0dOW+PSvHlzPvvsMzZs2MCvv/7KX//61xqtoalM3759adeuHcOGDWP9+vWsXr2a4cOHc+mll9K5c2cKCgoYP348P/zwA3v37mX58uWsWbOG1q1bA3DPPffw3XffsXv3btavX8+SJUsc+1xBYceF1GdHRETOxv3334/VaiUpKYno6OjT9r956aWXCA8P55JLLmHw4MH069ePiy66yKXls1gsfPnll4SHh9OrVy/69u1LkyZN+OijjwCwWq0cPXqU4cOH06JFC2688UYGDBjAk08+CZgr0o8bN47WrVvTv39/WrRowZtvvum68hqG8aevdsjOziY0NJSsrCxCQkJq7HlHvLOapb8f5l83dGBIpwY19rwiInJmhYWF7N69m8aNG+Pv7+/p4shZOt37WNXPb9XsuJCGnouIiHiewo4LOSYVVDOWiIiIxyjsuJCP1by8qtkRERHxHIUdF9JyESIiIp6nsONCx/vsqBlLRETEUxR2XOj40HPV7IiIiHiKwo4LabkIERERz1PYcSFvLRchIiLicQo7LlTejKU+OyIiIp6jsONCjpodNWOJiIibNWrUiFdeeeWU+0eOHMk111zjtvJ4ksKOCzn67KgZS0RExGMUdlzIx6rlIkRERDxNYceFjk8qqD47IiJSNdOnTyc+Ph77Cf09r776akaPHg3Arl27uPrqq4mNjSU4OJguXbqwcOHCczpvUVEREyZMICYmBn9/f3r06MGaNWsc+48dO8awYcOIjo4mICCA5s2bM2PGDACKi4sZP3489evXx9/fn4YNGzJlypRzKk9N8vZ0AeoyLQQqIlLLGAaU5Hvm3D6BYLGc8bAbbriBu+++myVLltCnTx8AMjIymD9/PvPmzQMgNzeXgQMH8swzz+Dn58f777/P4MGD2b59O4mJiWdVvAcffJBPP/2U9957j4YNGzJ16lT69evHzp07iYiI4LHHHmPr1q18++23REVFsXPnTgoKCgB47bXX+Oqrr/j4449JTExk37597Nu376zK4QoKOy7kbVWfHRGRWqUkH56N98y5/3EQfIPOeFh4eDgDBgxg1qxZjrDzySefEBUVxWWXXQZAhw4d6NChg+MxTz/9NJ9//jlfffUV48ePr3bR8vLymDZtGu+++y4DBgwA4O2332bBggX873//44EHHiAlJYWOHTvSuXNnwOwAXS4lJYXmzZvTo0cPLBYLDRs2rHYZXEnNWC50fDSWmrFERKTqhg0bxqeffkpRUREAM2fO5Oabb8arbOBLbm4u999/P61btyYsLIzg4GC2bdtGSkrKWZ1v165dlJSU0L17d8c2Hx8funbtyrZt2wAYO3Yss2fP5sILL+TBBx/k559/dhw7cuRINmzYQMuWLZkwYQLff//92b50l1DNjgtZNamgiEjt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SUkuKXd1OJaLUDOWiIiIR3i0GWvcuHHMmjWLL7/8knr16jn62ISGhhIQEMCuXbuYNWsWAwcOJDIyko0bN3LvvffSq1cv2rdvD8CVV15JUlISt956K1OnTiU1NZVHH32UcePG4efn58mXB4CPJhUUERHxKI/W7EybNo2srCx69+5N/fr1HbePPvoIAF9fXxYuXMiVV15Jq1atuO+++xgyZAhff/214zmsVitz587FarWSnJzMLbfcwvDhw53m5fGk40PP1WdHRETEEzxas2MYp6/tSEhIYOnSpWd8noYNGzJv3ryaKlaN8lafHREREY+qFR2U6zJv9dkRERHxKIUdF9NCoCIiIp6lsONi5X12StRnR0RExCMUdlxMy0WIiIh4lsKOix1f9VxhR0RExBMUdlxMQ89FREQ8S2HHxXzUjCUiIuJRCjsudrxmR2FHRETEExR2XEx9dkRERDxLYcfFjs+grD47IiIinqCw42KaQVlERMSzFHZcrGKfnTOtBSYiIiI1T2HHxXzKmrEA1EdZRETE/RR2XKy8ZgegxKZ+OyIiIu6msONi5X12QHPtiIiIeILCjot5V2jG0lw7IiIi7qew42JWS4Wwo2YsERERt1PYcTEvLwvl3XbUjCUiIuJ+Cjtu4F22PpaasURERNxPYccNtGSEiIiI5yjsuMHxiQXVZ0dERMTdFHbcwKesGUt9dkRERNxPYccNymt2StSMJSIi4nYKO25Q3mdHNTsiIiLup7DjBuUTC6rPjoiIiPsp7LhB+ZIRGnouIiLifgo7bmDV0HMRERGPUdhxA/XZERER8RyFHTco77NToj47IiIibqew4wbWsj47NjVjiYiIuJ3Cjhv4OGZQVtgRERFxN4UdN9ByESIiIp6jsOMG5X121EFZRETE/RR23MAxz4767IiIiLidwo4beKsZS0RExGMUdtzAqg7KIiIiHqOw4wY+1rKh5wo7IiIibqew4wblNTsl6rMjIiLidgo7bnB8uQj12REREXE3hR03KB96rj47IiIi7letsGO321myZAlPPfUUY8aMYejQoUyYMIEZM2awb9++ap98ypQpdOnShXr16hETE8M111zD9u3bnY4pLCxk3LhxREZGEhwczJAhQ0hLS3M6JiUlhUGDBhEYGEhMTAwPPPAApaWl1S6Pq1g19FxERMRjqhR2CgoK+Oc//0lCQgID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rbdy7733MmXKFEDX2lWqcl3j4uJIT0932l9aWkpGRsY5X3uFHRfw9fWlU6dOLFq0yLHNbrezaNEikpOTPViy859hGIwfP57PP/+cxYsX07hxY6f9nTp1wsfHx+nab9++nZSUFF37aujTpw+bNm1iw4YNjlvnzp0ZNmyY42dd55rTvXv3k6ZQ+P3332nYsCEAjRs3Ji4uzul6Z2dns2rVKl3vasrPz8fLy/mjz2q1YrfbAV1rV6nKdU1OTiYzM5N169Y5jlm8eDF2u51u3bqdWwHOqXuznNLs2bMNPz8/49133zW2bt1q3H777UZYWJiRmprq6aKd18aOHWuEhoYaP/zwg3Ho0CHHLT8/33HMnXfeaSQmJhqLFy821q5dayQnJxvJyckeLHXdUHE0lmHoOtek1atXG97e3sYzzzxj7Nixw5g5c6YRGBho/N///Z/jmOeee84ICwszvvzyS2Pjxo3G1VdfreHQZ2HEiBHGBRdc4Bh6/tlnnxlRUVHGgw8+6DhG1/rs5OTkGL/88ovxyy+/GIDx0ksvGb/88ouxd+9ewzCqdl379+9vdOzY0Vi1apXx008/Gc2bN9fQ89ru9ddfNxITEw1fX1+ja9euxsqVKz1dpPMeUOltxowZjmMKCgqMu+66ywgPDzcCAwONa6+91jh06JDnCl1HnBh2dJ1r1tdff220bdvW8PPzM1q1amVMnz7dab/dbjcee+wxIzY21vDz8zP69OljbN++3UOlPX9lZ2cbf//7343ExETD39/faNKkifHII48YRUVFjmN0rc/OkiVLKv37PGLECMMwqnZdjx49agwdOtQIDg42QkJCjFGjRhk5OTnnXDaLYVSYNlJERESkjlGfHREREanTFHZERESkTlPYERERkTpNYUdERETqNIUdERERqdMUdkRERKROU9gRERGROk1hR0T+lEaOHMk111zj6WKIiBso7IhIrTNy5EgsFstJt/79+3u6aCJyHvL2dAFERCrTv39/ZsyY4bTNz8/PQ6URkfOZanZEpFby8/MjLi7O6RYeHg6AxWJh2rRpDBgwgICAAJo0acInn3zi9PhNmzZx+eWXExAQQGRkJLfffju5ubmnPN+aNWuIjo7m+eefB2D+/Pn06NGDsLAwIiMjueqqq9i1a5frXrCIuIzCjoiclx577DGGDBnCr7/+yrBhw7j55pvZtm0bAHl5efTr14/w8HDWrFnDnDlzWLhwIePHj6/0uRYvXswVV1zBM888w0MPPeR4jokTJ7J27VoWLVqEl5cX1157LXa73W2vUURqyDkvJSoiUsNGjBhhWK1WIygoyOn2zDPPGIZhGIBx5513Oj2mW7duxtixYw3DMIzp06cb4eHhRm5urmP/N998Y3h5eRmpqamOc1x99dXGZ599ZgQHBxuzZ88+bZkOHz5sAMamTZtq8qWKiBuoz46I1EqXXXYZ06ZNc9oWERHh+Dk5OdlpX3JyMhs2bABg27ZtdOjQgaCgIMf+7t27Y7fb2b59O7GxsQCsWrWKuXPn8sknn5w0MmvHjh1MnjyZVatWceTIEUeNTkpKCm3btq2plykibqCwIyK1UlBQEM2aNXPpOZo2bUpkZCTvvPMOgwYNwsfHx7Fv8ODBNGzYkLfffpv4+Hjsdjtt27aluLjYpWUSkZqnPjsicl5auXLlSfdbt24NQOvWrfn111/Jy8tz7F++fDleXl60bNnSsS0qKorFixezc+dObrzxRkpKSgA4evQo27dv59FHH6VPnz60bt2aY8eOueFViYgrKOyISK1UVFREamqq0+3IkSOO/XPmzOGdd97h999/5/HHH2f16tWODsjDhg3D39+fESNGsHnzZpYsWcLdd9/Nrbfe6mjCKhcTE8PixYv57bffGDp0KKWlpYSHhxMZGcn06dPZuXMnixcvZuLEiW59/SJScxR2RKRWmj9/PvXr13e69ejRw7H/ySefZPbs2bRv357333+fDz/8kKSkJAACAwP57rvvyMjIoEuXLlx//fX06dOHf//735WeKy4ujsWLF7Np0yaGDRuGYRjMnj2bdevW0bZtW+69915eeOEFt7xuEal5FsMwDE8XQkSkOiwWC59//rmWexCRKlHNjoiIiNRpCjsiIiJSp2nouYicd9T6LiLVoZodERERqdMUdkRERKROU9gRERGROk1hR0REROo0hR0RERGp0xR2REREpE5T2BEREZE6TWFHRERE6jSFHREREanT/h9hoyWRgsyhmAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(history.history['loss'], label='train loss')\n", "plt.plot(history.history['val_loss'], label='val loss')\n", "plt.xlabel(\"Epoka\")\n", "plt.ylabel(\"Błąd (MSE)\")\n", "plt.legend()\n", "plt.title(\"Historia trenowania modelu\")\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": 203, "id": "dd5b1b14-0cdb-47e4-829b-2f31f34516ed", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(Y_test, Y_pred)\n", "plt.xlabel(\"Rzeczywista cena (tys. $)\")\n", "plt.ylabel(\"Przewidywana cena (tys. $)\")\n", "plt.title(\"Regresja - Boston Housing\")\n", "plt.plot([0, 50], [0, 50], '--', color='gray')\n", "plt.grid(True)\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "5df22a98-1108-4f7a-b67a-1dd57d727e95", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## Przetestuj na jakimśtam domu" ] }, { "cell_type": "code", "execution_count": 206, "id": "1891f025-f769-49d5-9a22-8cb3288c1656", "metadata": {}, "outputs": [], "source": [ "new_house = [[0.1, 25.0, 5.0, 0, 0.5, 6.0, 60, 5.0, 4, 300, 15.0, 390.0, 10.0]]\n", "new_house_scaled = scaler.transform(new_house)" ] }, { "cell_type": "code", "execution_count": 207, "id": "58b9474b-c396-4945-a4f5-4ab6fed1c022", "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 53ms/step\n", "Przewidywana cena domu: 20.08 tys. $\n" ] } ], "source": [ "predicted_price = model.predict(new_house_scaled)\n", "print(f\"Przewidywana cena domu: {predicted_price[0][0]:.2f} tys. $\")\n" ] }, { "cell_type": "markdown", "id": "1ad0f1b1-dffb-4418-a6ea-5990827e18d2", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## Zapisz i wczytaj model" ] }, { "cell_type": "markdown", "id": "4e0291d4-19c4-4c36-9303-dc508a33de76", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Zapisz" ] }, { "cell_type": "code", "execution_count": 209, "id": "ce0524da-85c0-4295-abfa-778ede7e950c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['scaler.save']" ] }, "execution_count": 209, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import joblib\n", "model.save(\"boston_model.keras\")\n", "joblib.dump(scaler, \"scaler.save\")" ] }, { "cell_type": "markdown", "id": "a6ccc2af-284c-413f-94b9-213f71ccdeb0", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Wczytaj" ] }, { "cell_type": "code", "execution_count": 210, "id": "0b837963-be8e-45c6-a892-724fb8194d37", "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras.models import load_model\n", "import joblib\n", "\n", "model = load_model(\"boston_model.keras\")\n", "scaler = joblib.load(\"scaler.save\")" ] }, { "cell_type": "markdown", "id": "10712ab9-ff91-48a3-aa13-0bd5e7c4b42f", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Testuj" ] }, { "cell_type": "code", "execution_count": 211, "id": "b3de28f5-3170-4283-94f4-db91527ebe4a", "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 97ms/step\n", "Cena: 20.08 tys. $\n" ] } ], "source": [ "new_house = [[0.1, 25.0, 5.0, 0, 0.5, 6.0, 60, 5.0, 4, 300, 15.0, 390.0, 10.0]]\n", "new_house_scaled = scaler.transform(new_house)\n", "prediction = model.predict(new_house_scaled)\n", "print(f\"Cena: {prediction[0][0]:.2f} tys. $\")" ] }, { "cell_type": "markdown", "id": "2c041416-51ff-4b9e-bb4d-c3431fa870e7", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "# Dzień 6 - 20.05.2025" ] }, { "cell_type": "markdown", "id": "cd20cae1-be7f-49ee-b112-15f4cd9cfc6f", "metadata": {}, "source": [ "# CNN - Convolutional Neural Network\n", "## zalety \n", "- analiza przestrzenna - nie spłaszczamy obrazów\n", "- wydajna - \n", "- skuteczna - dokładność w rozpoznaniu wzorców wizualnych" ] }, { "cell_type": "code", "execution_count": 48, "id": "0c993d2e-5730-4084-a3c1-1bc001041ba1", "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf" ] }, { "cell_type": "markdown", "id": "ca48ef25-a03a-4fcc-9595-a3bd6a958b21", "metadata": {}, "source": [ "## Pobierz obrazy" ] }, { "cell_type": "code", "execution_count": 49, "id": "2ee7ebc4-4be9-4720-b605-abe3153477dd", "metadata": {}, "outputs": [], "source": [ "(X_train, Y_train),(X_validation, Y_validation) = tf.keras.datasets.cifar10.load_data()\n", "Y_train = tf.keras.utils.to_categorical(Y_train, 10)\n", "Y_validation = tf.keras.utils.to_categorical(Y_validation, 10)" ] }, { "cell_type": "code", "execution_count": 50, "id": "8f6fd327-3219-4ad5-a5f6-c043ccd108ea", "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", "\n", "data_generator = ImageDataGenerator(\n", " featurewise_center=True,\n", " featurewise_std_normalization=True,\n", " horizontal_flip=True,\n", " vertical_flip=True\n", ")\n", "\n", "data_generator.fit(X_train)\n", "\n", "X_valication = data_generator.standardize(X_validation.astype('float32'))" ] }, { "cell_type": "code", "execution_count": 51, "id": "1184eeaf-1cac-4a3f-b37d-b8edc3af40bd", "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Conv2D, Dense, MaxPooling2D, Dropout, BatchNormalization, Activation, Flatten" ] }, { "cell_type": "markdown", "id": "7f496a49-1466-4ceb-9b94-392fa21935a7", "metadata": {}, "source": [ "## Stwórz model" ] }, { "cell_type": "code", "execution_count": 52, "id": "56509616-c5fa-44ba-875c-5739e7411c60", "metadata": {}, "outputs": [], "source": [ "model = Sequential(layers=[\n", " # blok 1\n", " Conv2D(32, (3, 3),\n", " padding='same',\n", " input_shape=X_train.shape[1:]),\n", " BatchNormalization(),\n", " Activation('gelu'),\n", " Conv2D(32, (3, 3), padding='same'),\n", " BatchNormalization(),\n", " Activation('gelu'),\n", " MaxPooling2D(pool_size=(2, 2)),\n", " Dropout(0.2),\n", " # blok 2\n", " Conv2D(64, (3, 3), padding='same'),\n", " BatchNormalization(),\n", " Activation('gelu'),\n", " Conv2D(64, (3, 3), padding='same'),\n", " BatchNormalization(),\n", " Activation('gelu'),\n", " MaxPooling2D(pool_size=(2, 2)),\n", " Dropout(0.3),\n", " # blok 3\n", " Conv2D(128, (3, 3), padding='same'),\n", " BatchNormalization(),\n", " Activation('gelu'),\n", " Conv2D(128, (3, 3), padding='same'),\n", " BatchNormalization(),\n", " Activation('gelu'),\n", " MaxPooling2D(pool_size=(2, 2)),\n", " Dropout(0.45),\n", " # final\n", " Flatten(),\n", " Dense(10, activation='softmax')\n", "\n", "])" ] }, { "cell_type": "code", "execution_count": 53, "id": "4d837958-3e5e-45a5-8d6c-33b2d7e1528b", "metadata": {}, "outputs": [], "source": [ "model.compile(\n", " loss='categorical_crossentropy',\n", " optimizer='Adam',\n", " metrics=['accuracy']\n", ")" ] }, { "cell_type": "code", "execution_count": 55, "id": "04b45a8e-58b2-43d8-8cf9-2fd86e961eb5", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Model: \"sequential_6\"\n",
       "
\n" ], "text/plain": [ "\u001b[1mModel: \"sequential_6\"\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
       "┃ Layer (type)                     Output Shape                  Param # ┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
       "│ conv2d_18 (Conv2D)              │ (None, 32, 32, 32)     │           896 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ batch_normalization_18          │ (None, 32, 32, 32)     │           128 │\n",
       "│ (BatchNormalization)            │                        │               │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ activation_18 (Activation)      │ (None, 32, 32, 32)     │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ conv2d_19 (Conv2D)              │ (None, 32, 32, 32)     │         9,248 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ batch_normalization_19          │ (None, 32, 32, 32)     │           128 │\n",
       "│ (BatchNormalization)            │                        │               │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ activation_19 (Activation)      │ (None, 32, 32, 32)     │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ max_pooling2d_9 (MaxPooling2D)  │ (None, 16, 16, 32)     │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dropout_9 (Dropout)             │ (None, 16, 16, 32)     │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ conv2d_20 (Conv2D)              │ (None, 16, 16, 64)     │        18,496 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ batch_normalization_20          │ (None, 16, 16, 64)     │           256 │\n",
       "│ (BatchNormalization)            │                        │               │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ activation_20 (Activation)      │ (None, 16, 16, 64)     │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ conv2d_21 (Conv2D)              │ (None, 16, 16, 64)     │        36,928 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ batch_normalization_21          │ (None, 16, 16, 64)     │           256 │\n",
       "│ (BatchNormalization)            │                        │               │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ activation_21 (Activation)      │ (None, 16, 16, 64)     │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ max_pooling2d_10 (MaxPooling2D) │ (None, 8, 8, 64)       │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dropout_10 (Dropout)            │ (None, 8, 8, 64)       │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ conv2d_22 (Conv2D)              │ (None, 8, 8, 128)      │        73,856 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ batch_normalization_22          │ (None, 8, 8, 128)      │           512 │\n",
       "│ (BatchNormalization)            │                        │               │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ activation_22 (Activation)      │ (None, 8, 8, 128)      │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ conv2d_23 (Conv2D)              │ (None, 8, 8, 128)      │       147,584 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ batch_normalization_23          │ (None, 8, 8, 128)      │           512 │\n",
       "│ (BatchNormalization)            │                        │               │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ activation_23 (Activation)      │ (None, 8, 8, 128)      │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ max_pooling2d_11 (MaxPooling2D) │ (None, 4, 4, 128)      │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dropout_11 (Dropout)            │ (None, 4, 4, 128)      │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ flatten_3 (Flatten)             │ (None, 2048)           │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense_5 (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_18 (\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_18 │ (\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_18 (\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_19 (\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_19 │ (\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_19 (\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_9 (\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_9 (\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_20 (\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_20 │ (\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_20 (\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_21 (\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_21 │ (\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_21 (\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_10 (\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_10 (\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_22 (\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_22 │ (\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_22 (\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_23 (\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_23 │ (\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_23 (\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_11 (\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_11 (\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_3 (\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_5 (\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": 56, "id": "227d98ed-a60d-4fcf-aa0a-2f9fc1b4050e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/100\n", "\u001b[1m138/195\u001b[0m \u001b[32m━━━━━━━━━━━━━━\u001b[0m\u001b[37m━━━━━━\u001b[0m \u001b[1m1:35\u001b[0m 2s/step - accuracy: 0.2540 - loss: 2.3037" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[56]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mmodel\u001b[49m\u001b[43m.\u001b[49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 2\u001b[39m \u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdata_generator\u001b[49m\u001b[43m.\u001b[49m\u001b[43mflow\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mY_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m256\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 3\u001b[39m \u001b[43m \u001b[49m\u001b[43mepochs\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m100\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 4\u001b[39m \u001b[43m \u001b[49m\u001b[43mverbose\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 5\u001b[39m \u001b[43m \u001b[49m\u001b[43mvalidation_data\u001b[49m\u001b[43m=\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_validation\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mY_validation\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 6\u001b[39m \u001b[43m \u001b[49m\u001b[43msteps_per_epoch\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mX_train\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[43m/\u001b[49m\u001b[43m/\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m256\u001b[39;49m\n\u001b[32m 7\u001b[39m \u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/keras/src/utils/traceback_utils.py:117\u001b[39m, in \u001b[36mfilter_traceback..error_handler\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 115\u001b[39m filtered_tb = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 116\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m117\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 118\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 119\u001b[39m filtered_tb = _process_traceback_frames(e.__traceback__)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/keras/src/backend/tensorflow/trainer.py:377\u001b[39m, in \u001b[36mTensorFlowTrainer.fit\u001b[39m\u001b[34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq)\u001b[39m\n\u001b[32m 375\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m step, iterator \u001b[38;5;129;01min\u001b[39;00m epoch_iterator:\n\u001b[32m 376\u001b[39m callbacks.on_train_batch_begin(step)\n\u001b[32m--> \u001b[39m\u001b[32m377\u001b[39m logs = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mtrain_function\u001b[49m\u001b[43m(\u001b[49m\u001b[43miterator\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 378\u001b[39m callbacks.on_train_batch_end(step, logs)\n\u001b[32m 379\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.stop_training:\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/keras/src/backend/tensorflow/trainer.py:220\u001b[39m, in \u001b[36mTensorFlowTrainer._make_function..function\u001b[39m\u001b[34m(iterator)\u001b[39m\n\u001b[32m 216\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mfunction\u001b[39m(iterator):\n\u001b[32m 217\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\n\u001b[32m 218\u001b[39m iterator, (tf.data.Iterator, tf.distribute.DistributedIterator)\n\u001b[32m 219\u001b[39m ):\n\u001b[32m--> \u001b[39m\u001b[32m220\u001b[39m opt_outputs = \u001b[43mmulti_step_on_iterator\u001b[49m\u001b[43m(\u001b[49m\u001b[43miterator\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 221\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m opt_outputs.has_value():\n\u001b[32m 222\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/tensorflow/python/util/traceback_utils.py:150\u001b[39m, in \u001b[36mfilter_traceback..error_handler\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 148\u001b[39m filtered_tb = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 149\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m150\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 151\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 152\u001b[39m filtered_tb = _process_traceback_frames(e.__traceback__)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py:833\u001b[39m, in \u001b[36mFunction.__call__\u001b[39m\u001b[34m(self, *args, **kwds)\u001b[39m\n\u001b[32m 830\u001b[39m compiler = \u001b[33m\"\u001b[39m\u001b[33mxla\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._jit_compile \u001b[38;5;28;01melse\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33mnonXla\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 832\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m OptionalXlaContext(\u001b[38;5;28mself\u001b[39m._jit_compile):\n\u001b[32m--> \u001b[39m\u001b[32m833\u001b[39m result = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_call\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 835\u001b[39m new_tracing_count = \u001b[38;5;28mself\u001b[39m.experimental_get_tracing_count()\n\u001b[32m 836\u001b[39m without_tracing = (tracing_count == new_tracing_count)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/tensorflow/python/eager/polymorphic_function/polymorphic_function.py:878\u001b[39m, in \u001b[36mFunction._call\u001b[39m\u001b[34m(self, *args, **kwds)\u001b[39m\n\u001b[32m 875\u001b[39m \u001b[38;5;28mself\u001b[39m._lock.release()\n\u001b[32m 876\u001b[39m \u001b[38;5;66;03m# In this case we have not created variables on the first call. So we can\u001b[39;00m\n\u001b[32m 877\u001b[39m \u001b[38;5;66;03m# run the first trace but we should fail if variables are created.\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m878\u001b[39m results = \u001b[43mtracing_compilation\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcall_function\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 879\u001b[39m \u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_variable_creation_config\u001b[49m\n\u001b[32m 880\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 881\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._created_variables:\n\u001b[32m 882\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[33m\"\u001b[39m\u001b[33mCreating variables on a non-first call to a function\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 883\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m decorated with tf.function.\u001b[39m\u001b[33m\"\u001b[39m)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/tensorflow/python/eager/polymorphic_function/tracing_compilation.py:139\u001b[39m, in \u001b[36mcall_function\u001b[39m\u001b[34m(args, kwargs, tracing_options)\u001b[39m\n\u001b[32m 137\u001b[39m bound_args = function.function_type.bind(*args, **kwargs)\n\u001b[32m 138\u001b[39m flat_inputs = function.function_type.unpack_inputs(bound_args)\n\u001b[32m--> \u001b[39m\u001b[32m139\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunction\u001b[49m\u001b[43m.\u001b[49m\u001b[43m_call_flat\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# pylint: disable=protected-access\u001b[39;49;00m\n\u001b[32m 140\u001b[39m \u001b[43m \u001b[49m\u001b[43mflat_inputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcaptured_inputs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mfunction\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcaptured_inputs\u001b[49m\n\u001b[32m 141\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/tensorflow/python/eager/polymorphic_function/concrete_function.py:1322\u001b[39m, in \u001b[36mConcreteFunction._call_flat\u001b[39m\u001b[34m(self, tensor_inputs, captured_inputs)\u001b[39m\n\u001b[32m 1318\u001b[39m possible_gradient_type = gradients_util.PossibleTapeGradientTypes(args)\n\u001b[32m 1319\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m (possible_gradient_type == gradients_util.POSSIBLE_GRADIENT_TYPES_NONE\n\u001b[32m 1320\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m executing_eagerly):\n\u001b[32m 1321\u001b[39m \u001b[38;5;66;03m# No tape is watching; skip to running the function.\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1322\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_inference_function\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcall_preflattened\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1323\u001b[39m forward_backward = \u001b[38;5;28mself\u001b[39m._select_forward_and_backward_functions(\n\u001b[32m 1324\u001b[39m args,\n\u001b[32m 1325\u001b[39m possible_gradient_type,\n\u001b[32m 1326\u001b[39m executing_eagerly)\n\u001b[32m 1327\u001b[39m forward_function, args_with_tangents = forward_backward.forward()\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/tensorflow/python/eager/polymorphic_function/atomic_function.py:216\u001b[39m, in \u001b[36mAtomicFunction.call_preflattened\u001b[39m\u001b[34m(self, args)\u001b[39m\n\u001b[32m 214\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mcall_preflattened\u001b[39m(\u001b[38;5;28mself\u001b[39m, args: Sequence[core.Tensor]) -> Any:\n\u001b[32m 215\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Calls with flattened tensor inputs and returns the structured output.\"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m216\u001b[39m flat_outputs = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mcall_flat\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 217\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.function_type.pack_output(flat_outputs)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/tensorflow/python/eager/polymorphic_function/atomic_function.py:251\u001b[39m, in \u001b[36mAtomicFunction.call_flat\u001b[39m\u001b[34m(self, *args)\u001b[39m\n\u001b[32m 249\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m record.stop_recording():\n\u001b[32m 250\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._bound_context.executing_eagerly():\n\u001b[32m--> \u001b[39m\u001b[32m251\u001b[39m outputs = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_bound_context\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcall_function\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 252\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 253\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 254\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mfunction_type\u001b[49m\u001b[43m.\u001b[49m\u001b[43mflat_outputs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 255\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 256\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 257\u001b[39m outputs = make_call_op_in_graph(\n\u001b[32m 258\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m 259\u001b[39m \u001b[38;5;28mlist\u001b[39m(args),\n\u001b[32m 260\u001b[39m \u001b[38;5;28mself\u001b[39m._bound_context.function_call_options.as_attrs(),\n\u001b[32m 261\u001b[39m )\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/tensorflow/python/eager/context.py:1688\u001b[39m, in \u001b[36mContext.call_function\u001b[39m\u001b[34m(self, name, tensor_inputs, num_outputs)\u001b[39m\n\u001b[32m 1686\u001b[39m cancellation_context = cancellation.context()\n\u001b[32m 1687\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m cancellation_context \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1688\u001b[39m outputs = \u001b[43mexecute\u001b[49m\u001b[43m.\u001b[49m\u001b[43mexecute\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 1689\u001b[39m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m.\u001b[49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mutf-8\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1690\u001b[39m \u001b[43m \u001b[49m\u001b[43mnum_outputs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mnum_outputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1691\u001b[39m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtensor_inputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1692\u001b[39m \u001b[43m \u001b[49m\u001b[43mattrs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mattrs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1693\u001b[39m \u001b[43m \u001b[49m\u001b[43mctx\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 1694\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1695\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1696\u001b[39m outputs = execute.execute_with_cancellation(\n\u001b[32m 1697\u001b[39m name.decode(\u001b[33m\"\u001b[39m\u001b[33mutf-8\u001b[39m\u001b[33m\"\u001b[39m),\n\u001b[32m 1698\u001b[39m num_outputs=num_outputs,\n\u001b[32m (...)\u001b[39m\u001b[32m 1702\u001b[39m cancellation_manager=cancellation_context,\n\u001b[32m 1703\u001b[39m )\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/tensorflow/python/eager/execute.py:53\u001b[39m, in \u001b[36mquick_execute\u001b[39m\u001b[34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[39m\n\u001b[32m 51\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 52\u001b[39m ctx.ensure_initialized()\n\u001b[32m---> \u001b[39m\u001b[32m53\u001b[39m tensors = \u001b[43mpywrap_tfe\u001b[49m\u001b[43m.\u001b[49m\u001b[43mTFE_Py_Execute\u001b[49m\u001b[43m(\u001b[49m\u001b[43mctx\u001b[49m\u001b[43m.\u001b[49m\u001b[43m_handle\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdevice_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mop_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 54\u001b[39m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mattrs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnum_outputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 55\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m core._NotOkStatusException \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 56\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "\u001b[31mKeyboardInterrupt\u001b[39m: " ] } ], "source": [ "model.fit(\n", " x=data_generator.flow(X_train, Y_train, batch_size=256),\n", " epochs=100,\n", " verbose=1,\n", " validation_data=(X_validation, Y_validation),\n", " steps_per_epoch=len(X_train) // 256\n", ")" ] }, { "cell_type": "markdown", "id": "ac373983-4d3e-42c8-9481-d57ce925f66d", "metadata": {}, "source": [ "## Testowanie" ] }, { "cell_type": "code", "execution_count": 37, "id": "96f39332-a855-473a-b12e-aea90ff9c045", "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 74ms/step\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAGbCAYAAAAr/4yjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAFRJJREFUeJzt3HuQVnX9wPHPcl3cBRRcXBRbVka0FMeCyryt5oUEbDKTgZEJFjEyrxU11eQFxVAnTcYrTKUzxqShmTMmXijM1HRSsISUUKFUZrjIxZkUCPb7+6PZz8/H3QU1FMzXa4Y/nrPf5+x3zzns+3nO84WqUkoJAIiITjt7AgDsOkQBgCQKACRRACCJAgBJFABIogBAEgUAkigAkERhJxs4cGBMmDAhHz/88MNRVVUVDz/88E6b09u9fY7vh+XLl0dVVVXceuutH4r97mgDBw6MSy65ZGdP433Tel3feeedO3sqbMdHOgq33nprVFVV5Z/q6uoYPHhwnHPOObFy5cqdPb135b777vuf/qXyUdcat3fyZ/ny5Tt7unyIddnZE9gVXHrppdHY2BgbN26MRx99NG666aa47777YtGiRbHbbrt9oHM5+uij480334xu3bq9q+fdd999ccMNN3xow9DQ0BBvvvlmdO3adWdPZZdUV1cXt912W8W2q6++Ol555ZX4yU9+0mYsvFeiEBEnnXRSDBs2LCIiJk2aFH379o1rrrkm7rnnnhg7dmy7z/nXv/4VNTU1O3wunTp1iurq6h2+311d6zu17Xm/jvuurqamJsaNG1ex7fbbb49169a12f5WpZTYuHFj9OjR4/2e4i7ho3p97Egf6dtHHfn85z8fERHLli2LiIgJEyZEbW1tvPjiizFixIjo2bNnnH766RER0dLSEtdee20cdNBBUV1dHXvttVdMnjw51q1bV7HPUkpMmzYtBgwYELvttlsce+yxsXjx4jbfu6PPFJ588skYMWJE7LHHHlFTUxOHHHJIzJgxI+d3ww03RERU3EZotaPnGBHx4osvxosvvrjdY7l27dqYMmVKDBkyJGpra6NXr15x0kknxV/+8peKce3d+9/WcT/mmGPi4IMPjqeffjoOP/zw6NGjRzQ2NsbNN9+83Tn99a9/jQkTJsR+++0X1dXVUV9fHxMnTozXXnutYtwll1wSVVVV8cILL8SECRNi9913j969e0dzc3O88cYbbfb7i1/8IoYOHRo9evSIPn36xJgxY+Lll1/e7nx2pIEDB8aoUaPigQceiGHDhkWPHj1i5syZ2/xspaqqqs07zFdffTUmTpwYe+21V3Tv3j0OOuig+PnPf97muf/85z/j+eeff8fza2lpicsvvzwGDBgQ1dXVcdxxx8ULL7zQZtycOXPyWO65554xbty4ePXVVyvGbOv6WLp0aZx66qlRX18f1dXVMWDAgBgzZkxs2LChYh+7wjnb1Xin0I7WX3Z9+/bNbVu2bInhw4fHkUceGT/+8Y/zttLkyZPj1ltvjebm5jjvvPNi2bJlcf3118fChQvjsccey9shF110UUybNi1GjBgRI0aMiAULFsSJJ54Ymzdv3u58HnrooRg1alT0798/zj///Kivr4/nnnsu7r333jj//PNj8uTJsWLFinjooYfa3GJ4v+Z43HHHRURs9/71Sy+9FL/5zW/itNNOi8bGxli5cmXMnDkzmpqa4m9/+1vsvffe23x+R8c9ImLdunUxYsSIGD16dIwdOzZ+9atfxVlnnRXdunWLiRMnbvN4vvTSS9Hc3Bz19fWxePHimDVrVixevDieeOKJiqBGRIwePToaGxtj+vTpsWDBgvjpT38a/fr1iyuvvDLHXH755XHhhRfG6NGjY9KkSbF69eq47rrr4uijj46FCxfG7rvvvs2fc0dasmRJjB07NiZPnhxnnnlmHHDAAe/q+StXrozDDjssqqqq4pxzzom6urqYO3dunHHGGfH666/HBRdckGO/+tWvxh/+8Id4p/8D/xVXXBGdOnWKKVOmxIYNG+Kqq66K008/PZ588skc03qtfvrTn47p06fHypUrY8aMGfHYY4+1OZbtXR+bN2+O4cOHx6ZNm+Lcc8+N+vr6ePXVV+Pee++N9evXR+/evSNi1zpnu5TyEXbLLbeUiCjz5s0rq1evLi+//HK5/fbbS9++fUuPHj3KK6+8UkopZfz48SUiyve+972K5//xj38sEVFmz55dsf3++++v2L5q1arSrVu3MnLkyNLS0pLjfvCDH5SIKOPHj89t8+fPLxFR5s+fX0opZcuWLaWxsbE0NDSUdevWVXyft+7r7LPPLu2dzvdjjqWU0tDQUBoaGtp8v7fbuHFj2bp1a8W2ZcuWle7du5dLL720YltElFtuuSW3dXTcSymlqampRES5+uqrc9umTZvKoYceWvr161c2b97c4X7feOONNvv75S9/WSKiPPLII7nt4osvLhFRJk6cWDH2lFNOKX379s3Hy5cvL507dy6XX355xbhnn322dOnSpc329jQ0NJSLL754u+PeauTIkW3OQUNDQ4mIcv/991dsb+84tIqIiu99xhlnlP79+5c1a9ZUjBszZkzp3bt3xfFrPQ/b03pdf/zjHy+bNm3K7TNmzCgRUZ599tlSSimbN28u/fr1KwcffHB58803c9y9995bIqJcdNFFua2j62PhwoUlIsqcOXM6nM+OOGf/q9w+iojjjz8+6urqYt99940xY8ZEbW1t3H333bHPPvtUjDvrrLMqHs+ZMyd69+4dJ5xwQqxZsyb/DB06NGpra2P+/PkRETFv3rzYvHlznHvuuRWvQt/6iqsjCxcujGXLlsUFF1zQ5pXL21/Rtuf9muPy5cvf0SqX7t27R6dO/7nMtm7dGq+99lrU1tbGAQccEAsWLNju8yPaHvdWXbp0icmTJ+fjbt26xeTJk2PVqlXx9NNPd7i/t95f37hxY6xZsyYOO+ywiIh25/T1r3+94vFRRx0Vr732Wrz++usREfHrX/86WlpaYvTo0RXHuL6+Pvbff/88xh+UxsbGGD58+Ht6bikl7rrrrjj55JOjlFLx8wwfPjw2bNhQcYwefvjhd/wuISKiubm5YhHFUUcdFRH/eUcZEfHUU0/FqlWr4hvf+EbFZ0wjR46MAw88MH7729+22efbr4/WdwIPPPBAu7f5Ina9c7YrcfsoIm644YYYPHhwdOnSJfbaa6844IAD8hdZqy5dusSAAQMqti1dujQ2bNgQ/fr1a3e/q1atioiIf/zjHxERsf/++1d8va6uLvbYY49tzq31VtbBBx/8zn+gD3iO29LS0hIzZsyIG2+8MZYtWxZbt27Nr7319lxH2jvurfbee+82HyoOHjw4Iv4TrdZf9G+3du3amDp1atx+++3587d6+z3niIiPfexjFY9bj8e6deuiV69esXTp0iiltDl2rT7oFVWNjY3v+bmrV6+O9evXx6xZs2LWrFntjnn7MXs3tnUsI/7/OmzvlteBBx4Yjz76aMW29q6PxsbG+Na3vhXXXHNNzJ49O4466qj44he/GOPGjctg7GrnbFciChHxmc98JlcfdeStr3hbtbS0RL9+/WL27NntPmdXWBq4s+f4ox/9KC688MKYOHFiXHbZZdGnT5/o1KlTXHDBBdHS0rLd57d33P9bo0ePjscffzy+853vxKGHHhq1tbXR0tISX/jCF9qdU+fOndvdT+sr5JaWlqiqqoq5c+e2O7a2tnaHzn972ltp1NG7yrdGOiLy5x83blyMHz++3ecccsgh73lu2zuW71ZH18fVV18dEyZMiHvuuScefPDBOO+882L69OnxxBNPxIABA3a5c7YrEYX/wqBBg2LevHlxxBFHbHPJX0NDQ0T859XJfvvtl9tXr17dZgVQe98jImLRokVx/PHHdziuo7/0H8Qct+XOO++MY489Nn72s59VbF+/fn3sueee73m/ERErVqxoswTx73//e0T8ZxVOe9atWxe/+93vYurUqXHRRRfl9qVLl77neQwaNChKKdHY2JjvVHY1ra/I169fX7G99ZV5q7q6uujZs2ds3bp1m9fb+6X1OlyyZEmuAmy1ZMmS/Po7MWTIkBgyZEj88Ic/jMcffzyOOOKIuPnmm2PatGkfinO2s/hM4b8wevTo2Lp1a1x22WVtvrZly5b8C3j88cdH165d47rrrqt4RXTttddu93t86lOfisbGxrj22mvb/IV+675afzG+fcz7Ncd3uiS1c+fObV4Fzpkzp83ywvdiy5YtMXPmzHy8efPmmDlzZtTV1cXQoUM7nE9E21em7+RcdOTLX/5ydO7cOaZOndpmv6WUNktdd4ZevXrFnnvuGY888kjF9htvvLHicefOnePUU0+Nu+66KxYtWtRmP6tXr654/G6XpG7PsGHDol+/fnHzzTfHpk2bcvvcuXPjueeei5EjR253H6+//nps2bKlYtuQIUOiU6dOuc8PwznbWbxT+C80NTXF5MmTY/r06fHMM8/EiSeeGF27do2lS5fGnDlzYsaMGfGVr3wl6urqYsqUKTF9+vQYNWpUjBgxIhYuXBhz587d7qvlTp06xU033RQnn3xyHHroodHc3Bz9+/eP559/PhYvXhwPPPBARET+EjzvvPNi+PDh0blz5xgzZsz7Nsd3uiR11KhRcemll0Zzc3Mcfvjh8eyzz8bs2bMr3o28V3vvvXdceeWVsXz58hg8eHDccccd8cwzz8SsWbM6vCfcq1evOProo+Oqq66Kf//737HPPvvEgw8+mP8m5b0YNGhQTJs2Lb7//e/H8uXL40tf+lL07Nkzli1bFnfffXd87WtfiylTprzn/e8okyZNiiuuuCImTZoUw4YNi0ceeSTfWb3VFVdcEfPnz4/PfvazceaZZ8YnPvGJWLt2bSxYsCDmzZsXa9euzbHvdknq9nTt2jWuvPLKaG5ujqamphg7dmwuSR04cGB885vf3O4+fv/738c555wTp512WgwePDi2bNkSt912WwYv4sNzznaKD3i10y6ldUnqn//8522OGz9+fKmpqenw67NmzSpDhw4tPXr0KD179ixDhgwp3/3ud8uKFStyzNatW8vUqVNL//79S48ePcoxxxxTFi1aVBoaGra5JLXVo48+Wk444YTSs2fPUlNTUw455JBy3XXX5de3bNlSzj333FJXV1eqqqraLBPckXMs5d0tSf32t7+d+zziiCPKn/70p9LU1FSamppyXEdLUjs67k1NTeWggw4qTz31VPnc5z5XqqurS0NDQ7n++usrxrW331deeaWccsopZffddy+9e/cup512WlmxYkWbpZmtS1JXr15dsc/W62bZsmUV2++6665y5JFHlpqamlJTU1MOPPDAcvbZZ5clS5Zs9zjtyCWpI0eObHf8G2+8Uc4444zSu3fv0rNnzzJ69OiyatWqNj93KaWsXLmynH322WXfffctXbt2LfX19eW4444rs2bNqhj3bpekvn2ZaEdLZe+4447yyU9+snTv3r306dOnnH766blEvFVH18dLL71UJk6cWAYNGlSqq6tLnz59yrHHHlvmzZvXZux/c87+V1WVsoMSDx+gY445JtasWdPuLY4Po9b/ifbD+n9X8b/DZwoAJFEAIIkCAMlnCgAk7xQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgAkUQAgiQIASRQASKIAQBIFAJIoAJBEAYAkCgCk/wPLCD4tuXsbKAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# Klasy CIFAR-10\n", "class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',\n", " 'dog', 'frog', 'horse', 'ship', 'truck']\n", "\n", "# Wybierz losowy indeks\n", "index = np.random.randint(0, len(X_validation))\n", "\n", "# Pobierz pojedynczy obrazek i etykietę\n", "image = X_validation[index]\n", "true_label = np.argmax(Y_validation[index])\n", "\n", "image_for_display = image * data_generator.std + data_generator.mean\n", "image_for_display = np.clip(image_for_display, 0, 255).astype('uint8')\n", "\n", "image_batch = np.expand_dims(image, axis=0)\n", "\n", "# Przewidywanie klasy\n", "prediction = model.predict(image_batch)\n", "predicted_class = np.argmax(prediction[0])\n", "\n", "# Wyświetlenie obrazka\n", "plt.imshow(image_for_display)\n", "plt.title(f\"Predicted: {class_names[predicted_class]} | True: {class_names[true_label]}\")\n", "plt.axis('off')\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "44cc5989-0cf6-49d1-8307-b9e4d2a1bbd5", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "# PyTorch" ] }, { "cell_type": "markdown", "id": "33166007-e9b7-4931-9c75-670544d4645e", "metadata": {}, "source": [ "biblioteka traktowana jako #2, za TensorFlowem\n", "Mocno Pythonowy framework, dużo rzeczy trzeba ustawiać i tworzyć, ale za to jest więcej możliwości niż w TensorFlow" ] }, { "cell_type": "code", "execution_count": 10, "id": "336c92ba-50fa-439e-b46e-52cf135049d7", "metadata": {}, "outputs": [], "source": [ "import torch" ] }, { "cell_type": "code", "execution_count": 11, "id": "e4cce36d-10d0-44d9-8ba7-33a0f6769495", "metadata": {}, "outputs": [], "source": [ "import torchvision.transforms as transforms\n", "from torchvision import datasets\n", "from torch.utils.data import DataLoader" ] }, { "cell_type": "code", "execution_count": 29, "id": "109a8b29-1c1f-4918-b969-c7173999510f", "metadata": {}, "outputs": [], "source": [ "train_transform = transforms.Compose([\n", " transforms.RandomHorizontalFlip(),\n", " transforms.RandomVerticalFlip(),\n", " transforms.ToTensor(),\n", " transforms.Normalize(\n", " [0.485, 0.456, 0.406],\n", " [0.229, 0.224, 0.225])\n", "])\n", "\n", "train_data = datasets.CIFAR10(\n", " root='data',\n", " train=True,\n", " download=True,\n", " transform=train_transform)" ] }, { "cell_type": "code", "execution_count": 30, "id": "930b465a-140c-47c1-bf54-54fcffc80f17", "metadata": {}, "outputs": [], "source": [ "train_loader = DataLoader(\n", " dataset=train_data,\n", " batch_size=32,\n", " shuffle=True,\n", " num_workers=2\n", ")" ] }, { "cell_type": "code", "execution_count": 31, "id": "6d20c732-fed0-431e-9cdc-e8659e8fb08a", "metadata": {}, "outputs": [], "source": [ "validation_transform = transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize(\n", " [0.485, 0.456, 0.406],\n", " [0.229, 0.224, 0.225])\n", "])\n", "\n", "validation_data = datasets.CIFAR10(\n", " root='data',\n", " train=False,\n", " download=True,\n", " transform=validation_transform)\n", "\n", "validation_loader = DataLoader(\n", " dataset=validation_data,\n", " batch_size=128,\n", " shuffle=True)" ] }, { "cell_type": "code", "execution_count": 32, "id": "a973a911-9f34-4810-9d87-00a5df461e1a", "metadata": {}, "outputs": [], "source": [ "torch.manual_seed(1234)\n", "classes = 10\n", "\n", "from torch.nn import Sequential, Conv2d, BatchNorm2d, GELU, MaxPool2d, Dropout2d, Linear, Flatten\n", "\n", "model = Sequential(\n", " Conv2d(in_channels=3, out_channels=32,\n", " kernel_size=3, padding=1),\n", " BatchNorm2d(32),\n", " GELU(),\n", " Conv2d(in_channels=32, out_channels=32,\n", " kernel_size=3, padding=1),\n", " BatchNorm2d(32),\n", " GELU(),\n", " MaxPool2d(kernel_size=2, stride=2),\n", " Dropout2d(0.2),\n", "\n", " Conv2d(in_channels=32, out_channels=64,\n", " kernel_size=3, padding=1),\n", " BatchNorm2d(64),\n", " GELU(),\n", " Conv2d(in_channels=64, out_channels=64,\n", " kernel_size=3, padding=1),\n", " BatchNorm2d(64),\n", " GELU(),\n", " MaxPool2d(kernel_size=2, stride=2),\n", " Dropout2d(p=0.3),\n", "\n", " Conv2d(in_channels=64, out_channels=128,\n", " kernel_size=3),\n", " BatchNorm2d(128),\n", " GELU(),\n", " Conv2d(in_channels=128, out_channels=128,\n", " kernel_size=3),\n", " BatchNorm2d(128),\n", " GELU(),\n", " MaxPool2d(kernel_size=2, stride=2),\n", " Dropout2d(p=0.5),\n", " Flatten(),\n", "\n", " Linear(512, classes),\n", ")" ] }, { "cell_type": "code", "execution_count": 33, "id": "8ea91d13-7d99-4dd3-8c59-d85b92964434", "metadata": {}, "outputs": [], "source": [ "def train_model(model, cost_function, optimizer, data_loader):\n", " # send the model to the GPU\n", " model.to(device)\n", "\n", " # set model to training mode\n", " model.train()\n", "\n", " current_loss = 0.0\n", " current_acc = 0\n", "\n", " # iterate over the training data\n", " for i, (inputs, labels) in enumerate(data_loader):\n", " # send the input/labels to the GPU\n", " inputs = inputs.to(device)\n", " labels = labels.to(device)\n", "\n", " # zero the parameter gradients\n", " optimizer.zero_grad()\n", "\n", " with torch.set_grad_enabled(True):\n", " # forward\n", " outputs = model(inputs)\n", " _, predictions = torch.max(outputs, 1)\n", " loss = cost_function(outputs, labels)\n", "\n", " # backward\n", " loss.backward()\n", " optimizer.step()\n", "\n", " # statistics\n", " current_loss += loss.item() * inputs.size(0)\n", " current_acc += torch.sum(predictions == labels.data)\n", "\n", " total_loss = current_loss / len(data_loader.dataset)\n", " total_acc = current_acc.double() / len(data_loader.dataset)\n", "\n", " print('Train Loss: {:.4f}; Accuracy: {:.4f}'.format(total_loss, total_acc))" ] }, { "cell_type": "code", "execution_count": 36, "id": "090590fa-01b4-4212-82bb-0086cbc4d4eb", "metadata": {}, "outputs": [], "source": [ "def test_model(model, cost_function, data_loader):\n", " # send the model to the GPU\n", " model.to(device)\n", "\n", " # set model in evaluation mode\n", " model.eval()\n", "\n", " current_loss = 0.0\n", " current_acc = 0\n", "\n", " # iterate over the validation data\n", " for i, (inputs, labels) in enumerate(data_loader):\n", " # send the input/labels to the GPU\n", " inputs = inputs.to(device)\n", " labels = labels.to(device)\n", "\n", " # forward\n", " with torch.set_grad_enabled(False):\n", " outputs = model(inputs)\n", " _, predictions = torch.max(outputs, 1)\n", " loss = cost_function(outputs, labels)\n", "\n", " # statistics\n", " current_loss += loss.item() * inputs.size(0)\n", " current_acc += torch.sum(predictions == labels.data)\n", "\n", " total_loss = current_loss / len(data_loader.dataset)\n", " total_acc = current_acc.double() / len(data_loader.dataset)\n", "\n", " print('Test Loss: {:.4f}; Accuracy: {:.4f}'.format(total_loss, total_acc))\n", "\n", " return total_loss, total_acc" ] }, { "cell_type": "code", "execution_count": 37, "id": "2d2ed49a-5216-4b71-9632-a7ce47ceed78", "metadata": {}, "outputs": [], "source": [ "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")" ] }, { "cell_type": "code", "execution_count": 38, "id": "4f537000-9338-4825-b4a5-da73d1f3fdc7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n", "Train Loss: 1.3657; Accuracy: 0.5059\n", "Test Loss: 1.1043; Accuracy: 0.6036\n", "Epoch 2/10\n", "Train Loss: 1.2027; Accuracy: 0.5700\n", "Test Loss: 0.9592; Accuracy: 0.6560\n", "Epoch 3/10\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[38]\u001b[39m\u001b[32m, line 7\u001b[39m\n\u001b[32m 5\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m epoch \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(epochs):\n\u001b[32m 6\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m'\u001b[39m\u001b[33mEpoch \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[33m/\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[33m'\u001b[39m.format(epoch + \u001b[32m1\u001b[39m, epochs))\n\u001b[32m----> \u001b[39m\u001b[32m7\u001b[39m \u001b[43mtrain_model\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcost_func\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moptimizer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtrain_loader\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 8\u001b[39m test_model(model, cost_func, validation_loader)\n", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[33]\u001b[39m\u001b[32m, line 12\u001b[39m, in \u001b[36mtrain_model\u001b[39m\u001b[34m(model, cost_function, optimizer, data_loader)\u001b[39m\n\u001b[32m 9\u001b[39m current_acc = \u001b[32m0\u001b[39m\n\u001b[32m 11\u001b[39m \u001b[38;5;66;03m# iterate over the training data\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m12\u001b[39m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mi\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlabels\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43menumerate\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mdata_loader\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[32m 13\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# send the input/labels to the GPU\u001b[39;49;00m\n\u001b[32m 14\u001b[39m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m.\u001b[49m\u001b[43mto\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdevice\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 15\u001b[39m \u001b[43m \u001b[49m\u001b[43mlabels\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mlabels\u001b[49m\u001b[43m.\u001b[49m\u001b[43mto\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdevice\u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/torch/utils/data/dataloader.py:733\u001b[39m, in \u001b[36m_BaseDataLoaderIter.__next__\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 730\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._sampler_iter \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 731\u001b[39m \u001b[38;5;66;03m# TODO(https://github.com/pytorch/pytorch/issues/76750)\u001b[39;00m\n\u001b[32m 732\u001b[39m \u001b[38;5;28mself\u001b[39m._reset() \u001b[38;5;66;03m# type: ignore[call-arg]\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m733\u001b[39m data = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_next_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 734\u001b[39m \u001b[38;5;28mself\u001b[39m._num_yielded += \u001b[32m1\u001b[39m\n\u001b[32m 735\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[32m 736\u001b[39m \u001b[38;5;28mself\u001b[39m._dataset_kind == _DatasetKind.Iterable\n\u001b[32m 737\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m._IterableDataset_len_called \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 738\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m._num_yielded > \u001b[38;5;28mself\u001b[39m._IterableDataset_len_called\n\u001b[32m 739\u001b[39m ):\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/torch/utils/data/dataloader.py:1491\u001b[39m, in \u001b[36m_MultiProcessingDataLoaderIter._next_data\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 1488\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._process_data(data, worker_id)\n\u001b[32m 1490\u001b[39m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m._shutdown \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m._tasks_outstanding > \u001b[32m0\u001b[39m\n\u001b[32m-> \u001b[39m\u001b[32m1491\u001b[39m idx, data = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_get_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1492\u001b[39m \u001b[38;5;28mself\u001b[39m._tasks_outstanding -= \u001b[32m1\u001b[39m\n\u001b[32m 1493\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._dataset_kind == _DatasetKind.Iterable:\n\u001b[32m 1494\u001b[39m \u001b[38;5;66;03m# Check for _IterableDatasetStopIteration\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/torch/utils/data/dataloader.py:1453\u001b[39m, in \u001b[36m_MultiProcessingDataLoaderIter._get_data\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 1449\u001b[39m \u001b[38;5;66;03m# In this case, `self._data_queue` is a `queue.Queue`,. But we don't\u001b[39;00m\n\u001b[32m 1450\u001b[39m \u001b[38;5;66;03m# need to call `.task_done()` because we don't use `.join()`.\u001b[39;00m\n\u001b[32m 1451\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1452\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1453\u001b[39m success, data = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_try_get_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1454\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m success:\n\u001b[32m 1455\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m data\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/torch/utils/data/dataloader.py:1284\u001b[39m, in \u001b[36m_MultiProcessingDataLoaderIter._try_get_data\u001b[39m\u001b[34m(self, timeout)\u001b[39m\n\u001b[32m 1271\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_try_get_data\u001b[39m(\u001b[38;5;28mself\u001b[39m, timeout=_utils.MP_STATUS_CHECK_INTERVAL):\n\u001b[32m 1272\u001b[39m \u001b[38;5;66;03m# Tries to fetch data from `self._data_queue` once for a given timeout.\u001b[39;00m\n\u001b[32m 1273\u001b[39m \u001b[38;5;66;03m# This can also be used as inner loop of fetching without timeout, with\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 1281\u001b[39m \u001b[38;5;66;03m# Returns a 2-tuple:\u001b[39;00m\n\u001b[32m 1282\u001b[39m \u001b[38;5;66;03m# (bool: whether successfully get data, any: data if successful else None)\u001b[39;00m\n\u001b[32m 1283\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1284\u001b[39m data = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_data_queue\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1285\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m (\u001b[38;5;28;01mTrue\u001b[39;00m, data)\n\u001b[32m 1286\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 1287\u001b[39m \u001b[38;5;66;03m# At timeout and error, we manually check whether any worker has\u001b[39;00m\n\u001b[32m 1288\u001b[39m \u001b[38;5;66;03m# failed. Note that this is the only mechanism for Windows to detect\u001b[39;00m\n\u001b[32m 1289\u001b[39m \u001b[38;5;66;03m# worker failures.\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32m/usr/lib/python3.12/multiprocessing/queues.py:122\u001b[39m, in \u001b[36mQueue.get\u001b[39m\u001b[34m(self, block, timeout)\u001b[39m\n\u001b[32m 120\u001b[39m \u001b[38;5;28mself\u001b[39m._rlock.release()\n\u001b[32m 121\u001b[39m \u001b[38;5;66;03m# unserialize the data after having released the lock\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m122\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_ForkingPickler\u001b[49m\u001b[43m.\u001b[49m\u001b[43mloads\u001b[49m\u001b[43m(\u001b[49m\u001b[43mres\u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/.local/share/virtualenvs/JupyterLab-9JRWupKp/lib/python3.12/site-packages/torch/multiprocessing/reductions.py:541\u001b[39m, in \u001b[36mrebuild_storage_fd\u001b[39m\u001b[34m(cls, df, size)\u001b[39m\n\u001b[32m 540\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mrebuild_storage_fd\u001b[39m(\u001b[38;5;28mcls\u001b[39m, df, size):\n\u001b[32m--> \u001b[39m\u001b[32m541\u001b[39m fd = \u001b[43mdf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mdetach\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 542\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 543\u001b[39m storage = storage_from_cache(\u001b[38;5;28mcls\u001b[39m, fd_id(fd))\n", "\u001b[36mFile \u001b[39m\u001b[32m/usr/lib/python3.12/multiprocessing/resource_sharer.py:57\u001b[39m, in \u001b[36mDupFd.detach\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 55\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mdetach\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[32m 56\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m'''Get the fd. This should only be called once.'''\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m57\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43m_resource_sharer\u001b[49m\u001b[43m.\u001b[49m\u001b[43mget_connection\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_id\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m conn:\n\u001b[32m 58\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m reduction.recv_handle(conn)\n", "\u001b[36mFile \u001b[39m\u001b[32m/usr/lib/python3.12/multiprocessing/resource_sharer.py:87\u001b[39m, in \u001b[36m_ResourceSharer.get_connection\u001b[39m\u001b[34m(ident)\u001b[39m\n\u001b[32m 85\u001b[39m address, key = ident\n\u001b[32m 86\u001b[39m c = Client(address, authkey=process.current_process().authkey)\n\u001b[32m---> \u001b[39m\u001b[32m87\u001b[39m \u001b[43mc\u001b[49m\u001b[43m.\u001b[49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mos\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgetpid\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 88\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m c\n", "\u001b[36mFile \u001b[39m\u001b[32m/usr/lib/python3.12/multiprocessing/connection.py:206\u001b[39m, in \u001b[36m_ConnectionBase.send\u001b[39m\u001b[34m(self, obj)\u001b[39m\n\u001b[32m 204\u001b[39m \u001b[38;5;28mself\u001b[39m._check_closed()\n\u001b[32m 205\u001b[39m \u001b[38;5;28mself\u001b[39m._check_writable()\n\u001b[32m--> \u001b[39m\u001b[32m206\u001b[39m \u001b[38;5;28mself\u001b[39m._send_bytes(\u001b[43m_ForkingPickler\u001b[49m\u001b[43m.\u001b[49m\u001b[43mdumps\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m)\n", "\u001b[36mFile \u001b[39m\u001b[32m/usr/lib/python3.12/multiprocessing/reduction.py:51\u001b[39m, in \u001b[36mForkingPickler.dumps\u001b[39m\u001b[34m(cls, obj, protocol)\u001b[39m\n\u001b[32m 48\u001b[39m \u001b[38;5;129m@classmethod\u001b[39m\n\u001b[32m 49\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mdumps\u001b[39m(\u001b[38;5;28mcls\u001b[39m, obj, protocol=\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[32m 50\u001b[39m buf = io.BytesIO()\n\u001b[32m---> \u001b[39m\u001b[32m51\u001b[39m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mbuf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprotocol\u001b[49m\u001b[43m)\u001b[49m.dump(obj)\n\u001b[32m 52\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m buf.getbuffer()\n", "\u001b[36mFile \u001b[39m\u001b[32m/usr/lib/python3.12/multiprocessing/reduction.py:39\u001b[39m, in \u001b[36mForkingPickler.__init__\u001b[39m\u001b[34m(self, *args)\u001b[39m\n\u001b[32m 38\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, *args):\n\u001b[32m---> \u001b[39m\u001b[32m39\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[34;43m__init__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 40\u001b[39m \u001b[38;5;28mself\u001b[39m.dispatch_table = \u001b[38;5;28mself\u001b[39m._copyreg_dispatch_table.copy()\n\u001b[32m 41\u001b[39m \u001b[38;5;28mself\u001b[39m.dispatch_table.update(\u001b[38;5;28mself\u001b[39m._extra_reducers)\n", "\u001b[31mKeyboardInterrupt\u001b[39m: " ] } ], "source": [ "cost_func = torch.nn.CrossEntropyLoss()\n", "optimizer = torch.optim.Adam(model.parameters())\n", "\n", "epochs = 10\n", "for epoch in range(epochs):\n", " print('Epoch {}/{}'.format(epoch + 1, epochs))\n", " train_model(model, cost_func, optimizer, train_loader)\n", " test_model(model, cost_func, validation_loader)" ] }, { "cell_type": "code", "execution_count": null, "id": "9f060ea9-b8de-46d4-8fdc-3a89f565d2f6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "01db7828-0e98-45b9-b332-9d86a148f3cc", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "# Sieć YOLO\n", "algorytm/sieć YOLO służy do rozpoznawania obiektów znajdujących się na zdjęciach\n", "np. kwadratowe ramki wokół obiektów, często z opisem pod ramką - to właśnie YOLO" ] }, { "cell_type": "code", "execution_count": null, "id": "a27ad14f-3a79-46d0-bfa6-154f85e9513a", "metadata": {}, "outputs": [], "source": [ "from ultralytics import YOLO\n", "\n", "model = YOLO(\"yolo11n.pt\")" ] }, { "cell_type": "code", "execution_count": null, "id": "031a2a4a-bf53-4c6a-84dd-1e8cacb8ca94", "metadata": {}, "outputs": [], "source": [ "result = model.predict('https://shropshiremammalgroup.com/wp-content/uploads/2020/05/wild-boar-forest-of-dean-robin-bennett-3.jpg?w=1024')\n", "print(result)" ] }, { "cell_type": "code", "execution_count": null, "id": "6ddb0744-22b9-4c2c-bc53-d6d8c02bd83c", "metadata": {}, "outputs": [], "source": [ "from PIL import Image\n", "\n", "Image.fromarray(result[0].plot())" ] }, { "cell_type": "markdown", "id": "ec06874f-c48a-43ce-b44e-364e4ed5ee37", "metadata": {}, "source": [ "# RNN - Recurrent Neural Network" ] }, { "cell_type": "code", "execution_count": 57, "id": "9bde4f30-f26c-4b37-bfa6-8b64460fe13d", "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import SimpleRNN, Embedding, Dense" ] }, { "cell_type": "code", "execution_count": 58, "id": "d2e9da87-1912-466f-b902-e45130d8fd32", "metadata": {}, "outputs": [], "source": [ "vocab_size = 10000\n", "embedding_dim = 64\n", "sequence_length = 100" ] }, { "cell_type": "code", "execution_count": 59, "id": "88156e8c-3c2a-467e-a018-a09c0f292de0", "metadata": {}, "outputs": [], "source": [ "model = Sequential()\n", "model.add(Embedding(vocab_size, embedding_dim, input_length=sequence_length))\n", "model.add(SimpleRNN(128))\n", "model.add(Dense(1,activation='sigmoid'))" ] }, { "cell_type": "code", "execution_count": 60, "id": "f976e119-8888-4316-a1b8-2352f74c42e8", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Model: \"sequential_7\"\n",
       "
\n" ], "text/plain": [ "\u001b[1mModel: \"sequential_7\"\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
       "┃ Layer (type)                     Output Shape                  Param # ┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
       "│ embedding_2 (Embedding)         │ ?                      │   0 (unbuilt) │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ simple_rnn_2 (SimpleRNN)        │ ?                      │   0 (unbuilt) │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense_6 (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_2 (\u001b[38;5;33mEmbedding\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ simple_rnn_2 (\u001b[38;5;33mSimpleRNN\u001b[0m) │ ? │ \u001b[38;5;34m0\u001b[0m (unbuilt) │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense_6 (\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": 61, "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": 105, "id": "862e9746-1f60-4036-b007-13240b285e2f", "metadata": {}, "outputs": [], "source": [ "text = \"\"\"\n", "Pewnemu bogatemu panu zachorowała żona, a kiedy poczuła, że nadszedł jej koniec, zawołała swoją jedyną córeczkę do łóżka i rzekła: \"Drogie dziecko, bądź pobożna i dobra, a dobry Bóg będzie z tobą. Będę patrzyła na ciebie z nieba i będę przy tobie.\" Potem zamknęła oczy i odeszła. Dziewczynka codziennie chodziła na grób matki, płakała, była pobożna i dobra. Kiedy nadeszła zima, śnieg przykrył białą chustą grób, a kiedy wiosenne słońce ją zdjęło, pan wziął sobie drugą żonę.\n", "Kobieta zabrała do domu dwie córki, które z twarzy były śniade i piękne, ale w sercach szpetne i czarne. Dla biednej pasierbicy nastał zły czas.\n", "\"Czy ta głupia gęś ma siedzieć z nami w izbie,\" mówiły, \"Kto chce jeść chleb, musi na niego zasłużyć. Precz do kuchni z tą dziewką!\"\n", "Zabrały jej piękne suknie i założyły stary szary fartuch i drewniane buty. \"Popatrzcie no na dumną księżniczkę, jaka umorusana!\" wołały, śmiały się i poprowadziły do kuchni. A tam od rana do wieczora musiała ciężko pracować i wstawać przed dniem, nosić wodę, rozpalać ogień, gotować i myć. Siostry nie szczędziły jej żadnej przykrości, szydziły z niej, sypały groch i soczewicę do popiołu, tak że musiała siedzieć i zbierać. Wieczorem, zmęczona po ciężkiej pracy nie szła do łóżka, lecz kładła się na popielisko obok pieca. A ponieważ ciągle była w kurzu i brudzie nazwano ją Kopciuszkiem.\n", "Zdarzyło się, że ojciec szedł na targ. Zapytał wtedy swoje pasierbice, co ma im przynieść. \"Piękne suknie!,\" powiedziała jedna; \"Perły i drogie kamienie,\" druga. - \"A ty, Kopciuszku,\" powiedział, \"co chcesz mieć?\" -\"Ojcze, pierwszą gałązkę, która wam kapelusz na waszej drodze do domu z głowy strąci, ułamcie ją dla mnie.\"\n", "Kupił więc obu pasierbicom piękne suknie, perły i drogie kamienie, a kiedy w drodze do domu jechał swym koniem przez zielony gaj, zaczepiła go gałązka leszczyny i strąciła mu kapelusz. Ułamał ją więc i zabrał ze sobą. Kiedy przybył do domu, dał pasierbicom, czego sobie życzyły, a kopciuszkowi gałązkę krzewu leszczyny. Kopciuszek podziękował mu, poszedł na grób matki i zasadził na nim gałązkę. Płakał tak bardzo, że łzy kapały na nią i ją zraszały. Gałązka urosła i stała się pięknym drzewem. Kopciuszek chodził pod nie co trzy dni, płakał i modlił się, a za każdym razem na drzewie siadał biały ptaszek i kiedy Kopciuszek wymawiał swoje życzenie, zrzucał mu czego chciał.\n", "Zdarzyło się też, że król wyprawiał ucztę, która miała trwać trzy dni. Zaprosił na nią wszystkie panny w kraju, aby jego syn znalazł sobie narzeczoną. Gdy przyrodnie siostry usłyszały, że i one mają się zjawić, były dobrej myśli, zawołały kopciuszka i powiedziały: \"Uczesz nam włosy, wyszczotkuj buty i zapnij klamerki, idziemy na Wesele na zamek króla.\"\n", "Kopciuszek usłuchał, ale płakał, bo też chciał iść w tan na wesele i poprosił macochę, by raczyła jej na to pozwolić.\n", "\"Ty kopciuszku,\" rzekła, \"pełna jesteś kurzu i brudu... i ty chcesz iść na wesele? Nie masz sukien ni butów, a chcesz tańczyć!\" A kiedy kopciuszek przestał prosić, powiedziała: \"Wysypałam ci miskę soczewicy do popiołu. Jeśli pozbierasz ją w dwie godziny, możesz z nami pójść\"\n", "Dziewczynka wyszła przez tylne drzwi do ogrodu i zawołała: \"Łaskawe gołąbki, turkaweczki, wszystkie ptaszki na niebie, przylećcie by pomóc mi zbierać.\n", "Dobre do garnuszka,\n", "a złe do brzuszka\"\n", "I wtedy przez kuchenne okno wleciały dwa białe gołąbki, potem turkaweczki, aż wreszcie furknęły wszystkie ptaszki na niebie wlatując do kuchni, usiadły wokół popieliska, że aż się od nich zaroiło. A gołąbki kiwały swoimi główkami i zaczęły robić pik, pik, pik, a wtedy i wszystkie inne ptaszki zaczęły robić pik, pik, pik i zbierały dobre ziarenka do miski. I nie minęła nawet godzina a wszystkie były gotowe i odleciały. Dziewczynka zaniosła miskę do macochy, cieszyła się i wierzyła, że będzie mogła pójść na wesele. Ale macocha powiedziała: \"Nie kopciuszku, nie masz sukien i nie umiesz tańczyć; tylko by się z ciebie śmiali.\"\n", "Wtedy kopciuszek zapłakał, a macocha powiedziała \"Jeśli w ciągu godziny wybierzesz z popiołu dwie miski pełne soczewicy, możesz pójść z nami, i pomyślała; \"Nigdy jej się to nie uda.\" A kiedy wysypała dwie miski soczewicy na popielisko, dziewczynka wyszła przez tylne drzwi do ogrodu i zawołała: \"Łaskawe gołąbki, turkaweczki, wszystkie ptaszki na niebie, przylećcie by pomóc mi zbierać.\n", "Dobre do garnuszka,\n", "a złe do brzuszka\"\n", "I wtedy przez kuchenne okno wleciały dwa białe gołąbki, potem turkaweczki, aż wreszcie furknęły wszystkie ptaszki na niebie wlatując do kuchni, usiadły wokół popieliska, że aż się od nich zaroiło. A gołąbki kiwały swoimi główkami i zaczęły robić pik, pik, pik, a wtedy i wszystkie inne ptaszki zaczęły robić pik, pik, pik i zbierały dobre ziarenka do miski. I zanim minęło pół godziny wszystkie były gotowe i odleciały. Dziewczynka zaniosła miskę do macochy, cieszyła się i wierzyła, że będzie mogła pójść na wesele. Ale macocha powiedziała: \"Nie pomoże ci to. Nie pójdziesz z nami, bo nie masz sukien i nie umiesz tańczyć; wstydziłybyśmy się ciebie.\" Odwróciła się do Kopciuszka plecami i pospieszyła za swymi córkami.\n", "Kiedy nikogo nie było już w domu, kopciuszek poszedł na grób swojej matki pod leszczynowym drzewem i zawołał:\n", "\"Drzewko, drzewko zrzuć na mnie oto\n", "srebro i złoto\"\n", "A ptaszek zrzucił jej suknię ze srebra i złota i pantofle przetykane jedwabiem i srebrem. W pośpiechu kopciuszek założył suknię i poszedł na wesele. Jego siostry i macocha nie poznały go i myślały, że to królewna z dalekiego kraju, tak piękna była w swej złotej sukni. O kopciuszku nawet nie pomyślały, o Kopciuszku, który siedział w domu, w brudzie i wyszukiwał soczewicy w popiele. Królewicz podszedł do niej, wziął ją za rękę i tańczył z nią. Nie chciał tańczyć z nikim innym trzymając ją cały czas za rękę, a kiedy podszedł ktoś by poprosić ją do tańca, mówił: \"To moja tancerka.\"\n", "Kopciuszek tańczył do wieczora aż w końcu chciał iść do domu. Ale królewicz powiedział: \"Pójdę z Tobą i odprowadzę cię,\" bo chciał zobaczyć, czyja była tak piękna dziewczyna. Kopciuszek jednak uciekł mu i wskoczył do gołębnika. Królewicz czekał, aż przyszedł ojciec kopciuszka i powiedział mu, że pewna nieznajoma dziewczyna wskoczyła do gołębnika. Stary pomyślał: \"Czy to był mój Kopciuszek?\" i musieli mu przynieść siekierę i bosak, aby mógł przeciąć gołębnik na pół. Lecz w środku nie było nikogo. Gdy weszli do domu, Kopciuszek leżał w popiele w swoim brudnym ubraniu, a w kominku paliła się ciemna olejowa lampka, Kopciuszek bowiem wyskoczył z tyłu gołębnika i pobiegł do leszczynowego drzewa. Tam zdjął swe piękne suknie i położył na grób, a ptak je zabrał. Potem położył się w swych szarych rzeczach na kuchennym popielisku.\n", "Następnego dnia, gdy uczta znowu się zaczynała, a rodzice i przyrodnie siostry już odeszły, kopciuszek podszedł do leszczyny i rzekł:\n", "\"Drzewko, drzewko zrzuć na mnie oto\n", "srebro i złoto\"\n", "A ptak zrzucił suknię jeszcze bardziej przepyszną niż poprzedniego dnia. Kiedy ukazał się na weselu w tej sukni, zdziwił się każdy jego urodą. Królewicz czekał aż przyjdzie by wziąć Kopciuszka za rękę i tańczyć tylko z nim, a kiedy podszedł ktoś by poprosić go do tańca, mówił: \"To moja tancerka.\" Kiedy przyszedł zaś wieczór, Kopciuszek chciał odejść, lecz królewicz szedł za nim, bo chciał zobaczyć do jakiego pójdzie domu. Kopciuszek jednak szybko skoczył do przodu i pobiegł do ogrodu za domem, w którym stało piękne wielkie drzewo, a na nim wisiały wspaniałe gruszki. Wspiął się na nie tak zwinnie, jakby to wiewiórka wiła się wśród gałęzi, a królewicz nie wiedział, gdzie Kopciuszek poszedł. Czekał jednak, aż zjawił się ojciec i rzekł do niego: \"Ta nieznajoma dziewczyna uciekła mi i - jak sądzę - wskoczyła na tę gruszę. Ojciec pomyślał: \"Czy to mój Kopciuszek?\" Kazał sobie wnet przynieść siekierę i ściął drzewo, lecz nie było na nim nikogo.\n", "Gdy poszli do kuchni, Kopciuszek jak zawsze leżał na popielisku, bo zeskoczył był z drugiej strony drzewa, ptaszkowi na leszczynowym drzewie oddał piękne suknie i włożył swój szary fartuch.\n", "Trzeciego dnia, gdy rodzice i przyrodnie siostry już poszli, Kopciuszek poszedł na grób matki i rzekł do drzewka:\n", "\"Drzewko, drzewko zrzuć na mnie oto\n", "srebro i złoto\"\n", "A ptaszek zrzucił mu suknię, która była taka wspaniała i błyszcząca, jakiej nie miał jeszcze nikt, a pantofle całe były ze złota. Kiedy w tej sukni przyszła na wesele, nikt z zachwytu głosu z siebie dobyć nie mógł. Królewicz tańczył tylko z Kopciuszkiem, a kiedy podchodził ktoś, by poprosić kopciuszka do tańca, mówił: \"To moja tancerka.\"\n", "Kiedy nadszedł wieczór, Kopciuszek chciał odejść, a królewicz chciał go odprowadzić, lecz dziewczyna tak szybko znikła mu z oczu, że nie mógł iść za nią. Królewicz obmyślił jednak podstęp i kazał wysmarować całe schody smołą. Kiedy kopciuszek szedł po nich, do smoły przykleił się lewy pantofel. Królewicz podniósł go. Był mały, delikatny i cały ze złota. Rankiem podszedł do człowieka, którego spotykał co wieczór i rzekł: \"żadna inna nie może zostać moją żoną niż ta, na którą będzie pasował ten złoty bucik.\" Ucieszyły się obie siostry, bo miały piękne nogi.\n", "Najstarsza poszła z butem do izby i chciała go przymierzyć, a była przy tym matka. Nie mogła jednak zmiścić wielkiego palca, bo but był na nią za mały. Wtedy matka podała jej nóż i rzekła: \"Odetnij tego palca: Kiedy będziesz królową, nie będziesz musiała chodzić pieszo.\" Dziewczyna obcięła palca, wcisnęła stopę w buta, a z bólu zacisnęła usta i wyszła do królewicza. Potem wziął ją jako narzeczoną na konia i odjechał. Musieli przejechać koło grobu, gdzie siedziały dwa gołąbki na leszczynowym drzewku i wołały:\n", "Pewnie wzrok z ciebie drwi,\n", "Bo buty pełne są krwi.\n", "Oczy oszukać się dały,\n", "Bo but jest dużo za mały.\n", "Prawdziwa panna jest w domu\n", "Nieznana jeszcze nikomu.\n", "Spojrzał więc na nogę i zobaczył, jak tryska krew. Zawrócił konia i odwiózł fałszywą narzeczoną do domu. Druga siostra musiała przymierzyć buta. Poszła więc do izby, szczęśliwa włożyła palce do buta, lecz pięta była za duża. Wtedy matka podała jej nóż i rzekła: \"Odetnij kawałek pięty: Kiedy będziesz królową, nie będziesz musiała chodzić pieszo.\" Dziewczyna obcięła kawałek pięty, wcisnęła stopę w buta, a z bólu zacisnęła usta i wyszła do królewicza.\n", "On zaś wziął ją jako narzeczoną na konia i odjechał. Kiedy przejeżdżali obok leszczynowego drzewka, dwa gołąbki zawołały:\n", "\"Pewnie wzrok z ciebie drwi,\n", "Bo buty pełne są krwi.\n", "Oczy oszukać się dały,\n", "Bo but jest dużo za mały.\n", "Prawdziwa panna jest w domu\n", "Nieznana jeszcze nikomu.\"\n", "Spojrzał na jej stopę i zobaczył, jak krew tryska z buta, a po białych pończochach sączy się do góry i barwi je na czerwono. Zawrócił więc konia i odwiózł fałszywą narzeczoną do domu.\n", "\"Nie o nią mi chodziło,\" powiedział., \"Czy macie jeszcze jakąś córkę?\"\n", "\"Nie,\" odrzekł pan, \"Jest jeszcze tylko mój mały lichy Kopciuszek po mojej zmarłej żonie, ale on na pewno nie jest tą panną.\"\n", "Królewicz powiedział, że mają ją przysłać, a matka odpowiedziała: \"Och nie, ona jest zbyt brudna i nie może się taka pokazać.\" Ale on chciał koniecznie ją zobaczyć i musieli ją zawołać. Kopciuszek umył sobie najpierw ręce i twarz, a potem poszedł pokłonić się królewiczowi, który podał mu złoty but. Potem usiadł na zydelku, zdjął ciężkiego drewniaka, i włożył pantofelek, który leżał jak ulał. A kiedy wstał, królewicz ujrzał jego twarz i poznał piękną dziewczynę, która z nim tańczyła i zawołał: \"Oto prawdziwa panna!\"\n", "Macocha i obie siostry wystraszyły się i zbladły ze złości. A on wziął Kopciuszka na konia i odjechał z nim. Kiedy przejeżdżali obok leszczynowego drzewka, zawołały dwa gołąbki:\n", "\"Widoku nic nie psuje\n", "Bo bucik pięknie pasuje\n", "Nie barwi go krew czerwona,\n", "Bo panną młodą zaprawdę jest ona.\"\n", "A kiedy to zawołały, usiadły Kopciuszkowi na ramionach, jeden z prawej, a drugi z lewej strony i tak zostały.\n", "Kiedy miał odbyć się ślub z królewiczem, przyszły fałszywe siostry i chciały się przypodobać, by mieć swój udział w szczęściu Kopciuszka. Kiedy narzeczeni wchodzili do kościoła, starsza była z prawej strony, a młodsza z lewej. I wtedy gołębie wydziobały każdej po tym właśnie oku. Kiedy zaś wychodzili, starsza była z lewej a młodsza z prawej, gołębie wydziobały każdej po drugim oku. I tak zostały ukarane ślepotą po kres życia za swe zło i fałsz.\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": 106, "id": "76e6afde-0194-4714-8b77-8a1876c5d128", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "767\n" ] } ], "source": [ "tokenizer = Tokenizer()\n", "tokenizer.fit_on_texts([text])\n", "total_words = len(tokenizer.word_index) + 1\n", "print(total_words)\n" ] }, { "cell_type": "code", "execution_count": 107, "id": "2b84df3b-93e1-4603-9284-97011baad75f", "metadata": {}, "outputs": [], "source": [ "input_sequences = []\n", "for line in text.split('.'):\n", " tokens = tokenizer.texts_to_sequences([line])[0]\n", " for i in range(1, len(tokens)):\n", " n_gram_sequence = tokens[:i+1]\n", " input_sequences.append(n_gram_sequence)\n", " " ] }, { "cell_type": "code", "execution_count": 108, "id": "e8c4750d-bb65-4038-bdf4-b4f194f5872e", "metadata": {}, "outputs": [], "source": [ "max_sequence_len = max([len(x) for x in input_sequences])\n", "input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre')" ] }, { "cell_type": "code", "execution_count": 109, "id": "ac784307-1b04-47da-b627-81a82a6c22d2", "metadata": {}, "outputs": [], "source": [ "model = tf.keras.Sequential([\n", " tf.keras.layers.Embedding(total_words, 10, input_length=max_sequence_len - 1),\n", " tf.keras.layers.SimpleRNN(100),\n", " tf.keras.layers.Dense(total_words, activation='softmax')\n", "])" ] }, { "cell_type": "code", "execution_count": 110, "id": "32f017ab-3603-42b3-8c13-546a3e0f5425", "metadata": {}, "outputs": [], "source": [ "X = input_sequences[:, :-1]\n", "y = input_sequences[:, -1]\n", "y = to_categorical(y, num_classes=total_words)" ] }, { "cell_type": "code", "execution_count": 111, "id": "11705dd1-aa5f-4e52-a122-81420774e6bd", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 12ms/step - accuracy: 0.0227 - loss: 6.5034\n", "Epoch 2/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.0527 - loss: 6.0484\n", "Epoch 3/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.0519 - loss: 6.0051\n", "Epoch 4/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.0662 - loss: 5.9677\n", "Epoch 5/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.0548 - loss: 5.9712\n", "Epoch 6/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.0556 - loss: 5.9043\n", "Epoch 7/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.0550 - loss: 5.9238\n", "Epoch 8/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.0585 - loss: 5.7557\n", "Epoch 9/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.0568 - loss: 5.6373\n", "Epoch 10/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.0694 - loss: 5.3867\n", "Epoch 11/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 17ms/step - accuracy: 0.0837 - loss: 5.1139\n", "Epoch 12/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.1167 - loss: 4.8405\n", "Epoch 13/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.1670 - loss: 4.4726\n", "Epoch 14/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.2001 - loss: 4.2676\n", "Epoch 15/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.2414 - loss: 3.9807\n", "Epoch 16/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.2795 - loss: 3.7808\n", "Epoch 17/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.3188 - loss: 3.5467\n", "Epoch 18/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.3674 - loss: 3.2855\n", "Epoch 19/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.4460 - loss: 3.0708\n", "Epoch 20/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.4988 - loss: 2.8333\n", "Epoch 21/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.5333 - loss: 2.6608\n", "Epoch 22/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.5689 - loss: 2.4732\n", "Epoch 23/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.6198 - loss: 2.2992\n", "Epoch 24/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.6715 - loss: 2.1395\n", "Epoch 25/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.6789 - loss: 2.0192\n", "Epoch 26/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.6972 - loss: 1.8845\n", "Epoch 27/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.7436 - loss: 1.7595\n", "Epoch 28/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.7557 - loss: 1.6361\n", "Epoch 29/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.7637 - loss: 1.5409\n", "Epoch 30/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.8207 - loss: 1.3351\n", "Epoch 31/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.8051 - loss: 1.3072\n", "Epoch 32/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 17ms/step - accuracy: 0.8244 - loss: 1.2233\n", "Epoch 33/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 18ms/step - accuracy: 0.8339 - loss: 1.1536\n", "Epoch 34/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 17ms/step - accuracy: 0.8307 - loss: 1.1527\n", "Epoch 35/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.8663 - loss: 0.9819\n", "Epoch 36/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.8572 - loss: 0.9780\n", "Epoch 37/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.8780 - loss: 0.8911\n", "Epoch 38/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.8870 - loss: 0.8246\n", "Epoch 39/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.8908 - loss: 0.8111\n", "Epoch 40/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9097 - loss: 0.7270\n", "Epoch 41/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9044 - loss: 0.7352\n", "Epoch 42/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9189 - loss: 0.6513\n", "Epoch 43/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.9163 - loss: 0.6176\n", "Epoch 44/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9252 - loss: 0.5839\n", "Epoch 45/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9372 - loss: 0.5575\n", "Epoch 46/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9345 - loss: 0.5296\n", "Epoch 47/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.9413 - loss: 0.5032\n", "Epoch 48/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9288 - loss: 0.5008\n", "Epoch 49/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9429 - loss: 0.4429\n", "Epoch 50/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9456 - loss: 0.4413\n", "Epoch 51/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9528 - loss: 0.3943\n", "Epoch 52/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9529 - loss: 0.3864\n", "Epoch 53/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9548 - loss: 0.3937\n", "Epoch 54/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9440 - loss: 0.3806\n", "Epoch 55/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9632 - loss: 0.3282\n", "Epoch 56/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9524 - loss: 0.3394\n", "Epoch 57/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9571 - loss: 0.3347\n", "Epoch 58/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9603 - loss: 0.3073\n", "Epoch 59/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9640 - loss: 0.2838\n", "Epoch 60/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9644 - loss: 0.2802\n", "Epoch 61/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9594 - loss: 0.2827\n", "Epoch 62/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9623 - loss: 0.2469\n", "Epoch 63/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9622 - loss: 0.2473\n", "Epoch 64/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9698 - loss: 0.2250\n", "Epoch 65/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9654 - loss: 0.2449\n", "Epoch 66/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 17ms/step - accuracy: 0.9728 - loss: 0.2020\n", "Epoch 67/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 18ms/step - accuracy: 0.9607 - loss: 0.2211\n", "Epoch 68/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 17ms/step - accuracy: 0.9648 - loss: 0.2014\n", "Epoch 69/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9656 - loss: 0.2023\n", "Epoch 70/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 17ms/step - accuracy: 0.9662 - loss: 0.1846\n", "Epoch 71/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 20ms/step - accuracy: 0.9670 - loss: 0.1770\n", "Epoch 72/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 26ms/step - accuracy: 0.9560 - loss: 0.2102\n", "Epoch 73/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 28ms/step - accuracy: 0.9637 - loss: 0.1712\n", "Epoch 74/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 20ms/step - accuracy: 0.9682 - loss: 0.1826\n", "Epoch 75/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9699 - loss: 0.1548\n", "Epoch 76/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9654 - loss: 0.1653\n", "Epoch 77/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9723 - loss: 0.1533\n", "Epoch 78/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 22ms/step - accuracy: 0.9676 - loss: 0.1573\n", "Epoch 79/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9603 - loss: 0.1726\n", "Epoch 80/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9687 - loss: 0.1472\n", "Epoch 81/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9673 - loss: 0.1455\n", "Epoch 82/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9694 - loss: 0.1410\n", "Epoch 83/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9692 - loss: 0.1314\n", "Epoch 84/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 18ms/step - accuracy: 0.9689 - loss: 0.1399\n", "Epoch 85/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9651 - loss: 0.1480\n", "Epoch 86/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9560 - loss: 0.1737\n", "Epoch 87/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9652 - loss: 0.1361\n", "Epoch 88/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.9692 - loss: 0.1295\n", "Epoch 89/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.9713 - loss: 0.1198\n", "Epoch 90/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9636 - loss: 0.1328\n", "Epoch 91/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9666 - loss: 0.1218\n", "Epoch 92/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9714 - loss: 0.1325\n", "Epoch 93/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9628 - loss: 0.1286\n", "Epoch 94/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9759 - loss: 0.1006\n", "Epoch 95/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9666 - loss: 0.1197\n", "Epoch 96/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9648 - loss: 0.1186\n", "Epoch 97/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9699 - loss: 0.1016\n", "Epoch 98/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.9642 - loss: 0.1219\n", "Epoch 99/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9681 - loss: 0.1097\n", "Epoch 100/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.9638 - loss: 0.1174\n", "Epoch 101/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 22ms/step - accuracy: 0.9614 - loss: 0.1133\n", "Epoch 102/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9634 - loss: 0.1051\n", "Epoch 103/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.9698 - loss: 0.1080\n", "Epoch 104/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9719 - loss: 0.1035\n", "Epoch 105/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.9617 - loss: 0.1238\n", "Epoch 106/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9792 - loss: 0.0871\n", "Epoch 107/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9680 - loss: 0.1019\n", "Epoch 108/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9749 - loss: 0.0932\n", "Epoch 109/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9626 - loss: 0.1079\n", "Epoch 110/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9697 - loss: 0.0935\n", "Epoch 111/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9658 - loss: 0.0991\n", "Epoch 112/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9734 - loss: 0.0809\n", "Epoch 113/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9642 - loss: 0.1029\n", "Epoch 114/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9757 - loss: 0.0875\n", "Epoch 115/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9645 - loss: 0.1038\n", "Epoch 116/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9649 - loss: 0.0981\n", "Epoch 117/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9662 - loss: 0.0977\n", "Epoch 118/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9702 - loss: 0.0848\n", "Epoch 119/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9614 - loss: 0.0943\n", "Epoch 120/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9678 - loss: 0.0958\n", "Epoch 121/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9694 - loss: 0.0874\n", "Epoch 122/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9678 - loss: 0.0825\n", "Epoch 123/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9660 - loss: 0.0889\n", "Epoch 124/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9699 - loss: 0.0835\n", "Epoch 125/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9691 - loss: 0.0830\n", "Epoch 126/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 17ms/step - accuracy: 0.9689 - loss: 0.0905\n", "Epoch 127/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9634 - loss: 0.0955\n", "Epoch 128/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9629 - loss: 0.1004\n", "Epoch 129/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.9654 - loss: 0.0919\n", "Epoch 130/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9710 - loss: 0.0749\n", "Epoch 131/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9675 - loss: 0.0874\n", "Epoch 132/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9679 - loss: 0.0859\n", "Epoch 133/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.9601 - loss: 0.0870\n", "Epoch 134/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9680 - loss: 0.0796\n", "Epoch 135/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9688 - loss: 0.0854\n", "Epoch 136/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9694 - loss: 0.0692\n", "Epoch 137/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9570 - loss: 0.0961\n", "Epoch 138/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.9642 - loss: 0.0844\n", "Epoch 139/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9672 - loss: 0.0853\n", "Epoch 140/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9581 - loss: 0.0968\n", "Epoch 141/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9742 - loss: 0.0701\n", "Epoch 142/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9681 - loss: 0.0804\n", "Epoch 143/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 20ms/step - accuracy: 0.9719 - loss: 0.0706\n", "Epoch 144/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9729 - loss: 0.0716\n", "Epoch 145/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9679 - loss: 0.0836\n", "Epoch 146/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 21ms/step - accuracy: 0.9642 - loss: 0.0934\n", "Epoch 147/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9652 - loss: 0.0881\n", "Epoch 148/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9682 - loss: 0.0828\n", "Epoch 149/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 19ms/step - accuracy: 0.9671 - loss: 0.0808\n", "Epoch 150/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.9713 - loss: 0.0733\n", "Epoch 151/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.9661 - loss: 0.0757\n", "Epoch 152/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.9689 - loss: 0.0741\n", "Epoch 153/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step - accuracy: 0.9589 - loss: 0.1052\n", "Epoch 154/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.9631 - loss: 0.0833\n", "Epoch 155/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 28ms/step - accuracy: 0.9738 - loss: 0.0671\n", "Epoch 156/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 19ms/step - accuracy: 0.9671 - loss: 0.0750\n", "Epoch 157/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 17ms/step - accuracy: 0.9753 - loss: 0.0599\n", "Epoch 158/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9644 - loss: 0.0812\n", "Epoch 159/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9653 - loss: 0.0835\n", "Epoch 160/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9586 - loss: 0.0921\n", "Epoch 161/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9624 - loss: 0.0829\n", "Epoch 162/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9608 - loss: 0.0960\n", "Epoch 163/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9630 - loss: 0.0792\n", "Epoch 164/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9638 - loss: 0.0828\n", "Epoch 165/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9681 - loss: 0.0739\n", "Epoch 166/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9554 - loss: 0.1047\n", "Epoch 167/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9657 - loss: 0.0815\n", "Epoch 168/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9728 - loss: 0.0688\n", "Epoch 169/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9686 - loss: 0.0836\n", "Epoch 170/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9597 - loss: 0.0834\n", "Epoch 171/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9698 - loss: 0.0661\n", "Epoch 172/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9759 - loss: 0.0639\n", "Epoch 173/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9648 - loss: 0.0788\n", "Epoch 174/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9590 - loss: 0.0832\n", "Epoch 175/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9679 - loss: 0.0687\n", "Epoch 176/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9621 - loss: 0.0810\n", "Epoch 177/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9650 - loss: 0.0808\n", "Epoch 178/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9567 - loss: 0.0842\n", "Epoch 179/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9243 - loss: 0.2690\n", "Epoch 180/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.9562 - loss: 0.1380\n", "Epoch 181/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9635 - loss: 0.0920\n", "Epoch 182/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9655 - loss: 0.0916\n", "Epoch 183/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9684 - loss: 0.0807\n", "Epoch 184/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9690 - loss: 0.0798\n", "Epoch 185/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9656 - loss: 0.0820\n", "Epoch 186/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9690 - loss: 0.0789\n", "Epoch 187/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9715 - loss: 0.0678\n", "Epoch 188/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9593 - loss: 0.1013\n", "Epoch 189/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9646 - loss: 0.0824\n", "Epoch 190/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9629 - loss: 0.0811\n", "Epoch 191/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.9667 - loss: 0.0712\n", "Epoch 192/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 16ms/step - accuracy: 0.9667 - loss: 0.0694\n", "Epoch 193/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 17ms/step - accuracy: 0.9723 - loss: 0.0600\n", "Epoch 194/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9648 - loss: 0.0808\n", "Epoch 195/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9753 - loss: 0.0602\n", "Epoch 196/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9716 - loss: 0.0641\n", "Epoch 197/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9656 - loss: 0.0812\n", "Epoch 198/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9594 - loss: 0.0814\n", "Epoch 199/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 15ms/step - accuracy: 0.9667 - loss: 0.0769\n", "Epoch 200/200\n", "\u001b[1m59/59\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step - accuracy: 0.9622 - loss: 0.0834\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", "model.fit(X, y, epochs=200, verbose=1)" ] }, { "cell_type": "code", "execution_count": 112, "id": "e1275c51-1ab3-4cad-8b3d-b657ba5016c5", "metadata": {}, "outputs": [], "source": [ "def generate_text(seed_text, next_words=5):\n", " for _ in range(next_words):\n", " token_list = tokenizer.texts_to_sequences([seed_text])[0]\n", " token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')\n", " predicted = np.argmax(model.predict(token_list, verbose=0), axis=-1)\n", " for word, index in tokenizer.word_index.items():\n", " if index == predicted:\n", " seed_text += \" \" + word\n", " break\n", " return seed_text" ] }, { "cell_type": "code", "execution_count": 120, "id": "13fae312-fd1c-4c92-a74a-55b0d23b0a00", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pantofel pasuje do człowieka którego spotykał co wieczór i rzekł żadna inna nie może zostać moją żoną\n" ] } ], "source": [ "print(generate_text(\"Pantofel pasuje\", 15))" ] }, { "cell_type": "code", "execution_count": null, "id": "e37bb303-eb64-47e8-b412-34a8ba4fdf23", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "ca748b23-1558-41f1-8473-76369c3ed888", "metadata": {}, "source": [ "#" ] }, { "cell_type": "code", "execution_count": null, "id": "c2fa8be6-540d-49cc-aff4-f891d59c6a95", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "4fab2fe0-4668-4b5f-a871-302287768791", "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 }