{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "gpuType": "T4" }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "accelerator": "GPU" }, "cells": [ { "cell_type": "markdown", "source": [ "## Задание 1" ], "metadata": { "id": "oZs0KGcz01BY" } }, { "cell_type": "markdown", "source": [ "### 1) В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули." ], "metadata": { "id": "gz18QPRz03Ec" } }, { "cell_type": "code", "source": [ "# импорт модулей\n", "import os\n", "os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab3')\n", "\n", "from tensorflow import keras\n", "from tensorflow.keras import layers\n", "from tensorflow.keras.models import Sequential\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from sklearn.metrics import classification_report, confusion_matrix\n", "from sklearn.metrics import ConfusionMatrixDisplay" ], "metadata": { "id": "mr9IszuQ1ANG" }, "execution_count": 40, "outputs": [] }, { "cell_type": "markdown", "source": [ "### 2) Загрузили набор данных MNIST, содержащий размеченные изображения рукописных цифр. " ], "metadata": { "id": "FFRtE0TN1AiA" } }, { "cell_type": "code", "source": [ "# загрузка датасета\n", "from keras.datasets import mnist\n", "(X_train, y_train), (X_test, y_test) = mnist.load_data()" ], "metadata": { "id": "Ixw5Sp0_1A-w" }, "execution_count": 41, "outputs": [] }, { "cell_type": "markdown", "source": [ "### 3) Разбили набор данных на обучающие и тестовые данные в соотношении 60 000:10 000 элементов. Параметр random_state выбрали равным (4k – 1)=23, где k=6 –номер бригады. Вывели размерности полученных обучающих и тестовых массивов данных." ], "metadata": { "id": "aCo_lUXl1BPV" } }, { "cell_type": "code", "source": [ "# создание своего разбиения датасета\n", "from sklearn.model_selection import train_test_split\n", "\n", "# объединяем в один набор\n", "X = np.concatenate((X_train, X_test))\n", "y = np.concatenate((y_train, y_test))\n", "\n", "# разбиваем по вариантам\n", "X_train, X_test, y_train, y_test = train_test_split(X, y,\n", " test_size = 10000,\n", " train_size = 60000,\n", " random_state = 23)\n", "# вывод размерностей\n", "print('Shape of X train:', X_train.shape)\n", "print('Shape of y train:', y_train.shape)\n", "print('Shape of X test:', X_test.shape)\n", "print('Shape of y test:', y_test.shape)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "BrSjcpEe1BeV", "outputId": "7952fd1d-10e4-453b-c687-49a858e48d78" }, "execution_count": 42, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Shape of X train: (60000, 28, 28)\n", "Shape of y train: (60000,)\n", "Shape of X test: (10000, 28, 28)\n", "Shape of y test: (10000,)\n" ] } ] }, { "cell_type": "markdown", "source": [ "### 4) Провели предобработку данных: привели обучающие и тестовые данные к формату, пригодному для обучения сверточной нейронной сети. Входные данные принимают значения от 0 до 1, метки цифр закодированы по принципу «one-hot encoding». Вывели размерности предобработанных обучающих и тестовых массивов данных." ], "metadata": { "id": "4hclnNaD1BuB" } }, { "cell_type": "code", "source": [ "# Зададим параметры данных и модели\n", "num_classes = 10\n", "input_shape = (28, 28, 1)\n", "\n", "# Приведение входных данных к диапазону [0, 1]\n", "X_train = X_train / 255\n", "X_test = X_test / 255\n", "\n", "# Расширяем размерность входных данных, чтобы каждое изображение имело\n", "# размерность (высота, ширина, количество каналов)\n", "\n", "X_train = np.expand_dims(X_train, -1)\n", "X_test = np.expand_dims(X_test, -1)\n", "print('Shape of transformed X train:', X_train.shape)\n", "print('Shape of transformed X test:', X_test.shape)\n", "\n", "# переведем метки в one-hot\n", "y_train = keras.utils.to_categorical(y_train, num_classes)\n", "y_test = keras.utils.to_categorical(y_test, num_classes)\n", "print('Shape of transformed y train:', y_train.shape)\n", "print('Shape of transformed y test:', y_test.shape)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "xJH87ISq1B9h", "outputId": "c3cec4ef-3b57-4d93-9412-58c1231708b5" }, "execution_count": 39, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Shape of transformed X train: (50000, 32, 32, 3, 1, 1, 1, 1)\n", "Shape of transformed X test: (10000, 32, 32, 3, 1, 1, 1, 1)\n", "Shape of transformed y train: (50000, 10, 10, 10, 10)\n", "Shape of transformed y test: (10000, 10, 10, 10, 10)\n" ] } ] }, { "cell_type": "markdown", "source": [ "### 5) Реализовали модель сверточной нейронной сети и обучили ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывели информацию об архитектуре нейронной сети." ], "metadata": { "id": "7x99O8ig1CLh" } }, { "cell_type": "code", "source": [ "# создаем модель\n", "model = Sequential()\n", "model.add(layers.Conv2D(32, kernel_size=(3, 3), activation=\"relu\", input_shape=input_shape))\n", "model.add(layers.MaxPooling2D(pool_size=(2, 2)))\n", "model.add(layers.Conv2D(64, kernel_size=(3, 3), activation=\"relu\"))\n", "model.add(layers.MaxPooling2D(pool_size=(2, 2)))\n", "model.add(layers.Dropout(0.5))\n", "model.add(layers.Flatten())\n", "model.add(layers.Dense(num_classes, activation=\"softmax\"))\n", "\n", "model.summary()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 416 }, "id": "Un561zSH1Cmv", "outputId": "131f4e97-7b44-45ea-f266-36366c063fcb" }, "execution_count": 6, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.12/dist-packages/keras/src/layers/convolutional/base_conv.py:113: 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" ] }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1mModel: \"sequential\"\u001b[0m\n" ], "text/html": [ "
Model: \"sequential\"\n",
"\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"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 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m26\u001b[0m, \u001b[38;5;34m26\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m320\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m13\u001b[0m, \u001b[38;5;34m13\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m11\u001b[0m, \u001b[38;5;34m11\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m18,496\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_1 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1600\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m16,010\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
],
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ conv2d (Conv2D) │ (None, 26, 26, 32) │ 320 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d (MaxPooling2D) │ (None, 13, 13, 32) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_1 (Conv2D) │ (None, 11, 11, 64) │ 18,496 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_1 (MaxPooling2D) │ (None, 5, 5, 64) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout (Dropout) │ (None, 5, 5, 64) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten (Flatten) │ (None, 1600) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense (Dense) │ (None, 10) │ 16,010 │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m34,826\u001b[0m (136.04 KB)\n"
],
"text/html": [
"Total params: 34,826 (136.04 KB)\n", "\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m34,826\u001b[0m (136.04 KB)\n" ], "text/html": [ "
Trainable params: 34,826 (136.04 KB)\n", "\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" ], "text/html": [ "
Non-trainable params: 0 (0.00 B)\n", "\n" ] }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "# компилируем и обучаем модель\n", "batch_size = 512\n", "epochs = 15\n", "model.compile(loss=\"categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"])\n", "model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "q_h8PxkN9m0v", "outputId": "a855528a-f08e-47b9-c1c9-5db7fcae47af" }, "execution_count": 8, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 36ms/step - accuracy: 0.9800 - loss: 0.0627 - val_accuracy: 0.9838 - val_loss: 0.0546\n", "Epoch 2/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 11ms/step - accuracy: 0.9814 - loss: 0.0590 - val_accuracy: 0.9840 - val_loss: 0.0505\n", "Epoch 3/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 11ms/step - accuracy: 0.9839 - loss: 0.0532 - val_accuracy: 0.9845 - val_loss: 0.0486\n", "Epoch 4/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 9ms/step - accuracy: 0.9839 - loss: 0.0511 - val_accuracy: 0.9845 - val_loss: 0.0466\n", "Epoch 5/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9870 - loss: 0.0437 - val_accuracy: 0.9857 - val_loss: 0.0464\n", "Epoch 6/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9866 - loss: 0.0440 - val_accuracy: 0.9865 - val_loss: 0.0443\n", "Epoch 7/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 9ms/step - accuracy: 0.9872 - loss: 0.0434 - val_accuracy: 0.9855 - val_loss: 0.0455\n", "Epoch 8/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9871 - loss: 0.0395 - val_accuracy: 0.9865 - val_loss: 0.0451\n", "Epoch 9/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9878 - loss: 0.0373 - val_accuracy: 0.9882 - val_loss: 0.0422\n", "Epoch 10/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9897 - loss: 0.0331 - val_accuracy: 0.9872 - val_loss: 0.0435\n", "Epoch 11/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9894 - loss: 0.0339 - val_accuracy: 0.9880 - val_loss: 0.0424\n", "Epoch 12/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9898 - loss: 0.0334 - val_accuracy: 0.9875 - val_loss: 0.0419\n", "Epoch 13/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 11ms/step - accuracy: 0.9900 - loss: 0.0330 - val_accuracy: 0.9873 - val_loss: 0.0415\n", "Epoch 14/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 11ms/step - accuracy: 0.9905 - loss: 0.0315 - val_accuracy: 0.9885 - val_loss: 0.0396\n", "Epoch 15/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 11ms/step - accuracy: 0.9892 - loss: 0.0328 - val_accuracy: 0.9877 - val_loss: 0.0408\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "
Model: \"sequential_10\"\n",
"\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"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",
"│ dense_22 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m) │ \u001b[38;5;34m78,500\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_23 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m50\u001b[0m) │ \u001b[38;5;34m5,050\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_24 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m510\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
],
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ dense_22 (Dense) │ (None, 100) │ 78,500 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_23 (Dense) │ (None, 50) │ 5,050 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_24 (Dense) │ (None, 10) │ 510 │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m84,062\u001b[0m (328.37 KB)\n"
],
"text/html": [
"Total params: 84,062 (328.37 KB)\n", "\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m84,060\u001b[0m (328.36 KB)\n" ], "text/html": [ "
Trainable params: 84,060 (328.36 KB)\n", "\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" ], "text/html": [ "
Non-trainable params: 0 (0.00 B)\n", "\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Optimizer params: \u001b[0m\u001b[38;5;34m2\u001b[0m (12.00 B)\n" ], "text/html": [ "
Optimizer params: 2 (12.00 B)\n", "\n" ] }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "# развернем каждое изображение 28*28 в вектор 784\n", "X_train, X_test, y_train, y_test = train_test_split(X, y,\n", " test_size = 10000,\n", " train_size = 60000,\n", " random_state = 23)\n", "num_pixels = X_train.shape[1] * X_train.shape[2]\n", "X_train = X_train.reshape(X_train.shape[0], num_pixels) / 255\n", "X_test = X_test.reshape(X_test.shape[0], num_pixels) / 255\n", "print('Shape of transformed X train:', X_train.shape)\n", "print('Shape of transformed X train:', X_test.shape)\n", "\n", "# переведем метки в one-hot\n", "y_train = keras.utils.to_categorical(y_train, num_classes)\n", "y_test = keras.utils.to_categorical(y_test, num_classes)\n", "print('Shape of transformed y train:', y_train.shape)\n", "print('Shape of transformed y test:', y_test.shape)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "0ki8fhJrEyEt", "outputId": "3d6e1e24-242c-4683-9491-980302ee1557" }, "execution_count": 24, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Shape of transformed X train: (60000, 784)\n", "Shape of transformed X train: (10000, 784)\n", "Shape of transformed y train: (60000, 10)\n", "Shape of transformed y test: (10000, 10)\n" ] } ] }, { "cell_type": "code", "source": [ "# Оценка качества работы модели на тестовых данных\n", "scores = model_lr1.evaluate(X_test, y_test)\n", "print('Loss on test data:', scores[0])\n", "print('Accuracy on test data:', scores[1])" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "0Yj0fzLNE12k", "outputId": "889a4241-e4c2-4af6-9472-eca25d3a2f96" }, "execution_count": 25, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 8ms/step - accuracy: 0.9453 - loss: 0.1872\n", "Loss on test data: 0.19880765676498413\n", "Accuracy on test data: 0.9416000247001648\n" ] } ] }, { "cell_type": "markdown", "source": [ "### 11) Сравнили обученную модель сверточной сети и наилучшую модель полносвязной сети из лабораторной работы №1 по следующим показателям:\n", "### - количество настраиваемых параметров в сети\n", "### - количество эпох обучения\n", "### - качество классификации тестовой выборки.\n", "### Сделали выводы по результатам применения сверточной нейронной сети для распознавания изображений. " ], "metadata": { "id": "MsM3ew3d1FYq" } }, { "cell_type": "markdown", "source": [ "Таблица1:" ], "metadata": { "id": "xxFO4CXbIG88" } }, { "cell_type": "markdown", "source": [ "| Модель | Количество настраиваемых параметров | Количество эпох обучения | Качество классификации тестовой выборки |\n", "|----------|-------------------------------------|---------------------------|-----------------------------------------|\n", "| Сверточная | 34 826 | 15 | accuracy:0.990 ; loss:0.029 |\n", "| Полносвязная | 84 062 | 50 | accuracy:0.942 ; loss:0.198 |\n" ], "metadata": { "id": "xvoivjuNFlEf" } }, { "cell_type": "markdown", "source": [ "По результатам применения сверточной НС, а также по результатам таблицы 1 делаем выводы, что сверточная НС намного лучше справляется с задачами распознования изображений, чем полносвязная - имеет меньше настраиваемых параметров, быстрее обучается, имеет лучшие показатели качества." ], "metadata": { "id": "YctF8h_sIB-P" } }, { "cell_type": "markdown", "source": [ "## Задание 2" ], "metadata": { "id": "wCLHZPGB1F1y" } }, { "cell_type": "markdown", "source": [ "### В новом блокноте выполнили п. 2–8 задания 1, изменив набор данных MNIST на CIFAR-10, содержащий размеченные цветные изображения объектов, разделенные на 10 классов. \n", "### При этом:\n", "### - в п. 3 разбиение данных на обучающие и тестовые произвели в соотношении 50 000:10 000\n", "### - после разбиения данных (между п. 3 и 4) вывели 25 изображений из обучающей выборки с подписями классов\n", "### - в п. 7 одно из тестовых изображений должно распознаваться корректно, а другое – ошибочно. " ], "metadata": { "id": "DUOYls124TT8" } }, { "cell_type": "markdown", "source": [ "### 1) Загрузили набор данных CIFAR-10, содержащий цветные изображения размеченные на 10 классов: самолет, автомобиль, птица, кошка, олень, собака, лягушка, лошадь, корабль, грузовик." ], "metadata": { "id": "XDStuSpEJa8o" } }, { "cell_type": "code", "source": [ "# загрузка датасета\n", "from keras.datasets import cifar10\n", "\n", "(X_train, y_train), (X_test, y_test) = cifar10.load_data()" ], "metadata": { "id": "y0qK7eKL4Tjy" }, "execution_count": 61, "outputs": [] }, { "cell_type": "markdown", "source": [ "### 2) Разбили набор данных на обучающие и тестовые данные в соотношении 50 000:10 000 элементов. Параметр random_state выбрали равным (4k – 1)=23, где k=6 –номер бригады. Вывели размерности полученных обучающих и тестовых массивов данных." ], "metadata": { "id": "wTHiBy-ZJ5oh" } }, { "cell_type": "code", "source": [ "# создание своего разбиения датасета\n", "\n", "# объединяем в один набор\n", "X = np.concatenate((X_train, X_test))\n", "y = np.concatenate((y_train, y_test))\n", "\n", "# разбиваем по вариантам\n", "X_train, X_test, y_train, y_test = train_test_split(X, y,\n", " test_size = 10000,\n", " train_size = 50000,\n", " random_state = 23)\n", "# вывод размерностей\n", "print('Shape of X train:', X_train.shape)\n", "print('Shape of y train:', y_train.shape)\n", "print('Shape of X test:', X_test.shape)\n", "print('Shape of y test:', y_test.shape)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "DlnFbQogKD2v", "outputId": "8a448d6d-21c3-4742-88a6-c3ca7b7f6acf" }, "execution_count": 62, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Shape of X train: (50000, 32, 32, 3)\n", "Shape of y train: (50000, 1)\n", "Shape of X test: (10000, 32, 32, 3)\n", "Shape of y test: (10000, 1)\n" ] } ] }, { "cell_type": "markdown", "source": [ "### Вывели 25 изображений из обучающей выборки с подписью классов." ], "metadata": { "id": "pj3bMaz1KZ3a" } }, { "cell_type": "code", "source": [ "class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',\n", " 'dog', 'frog', 'horse', 'ship', 'truck']\n", "\n", "plt.figure(figsize=(10,10))\n", "for i in range(25):\n", " plt.subplot(5,5,i+1)\n", " plt.xticks([])\n", " plt.yticks([])\n", " plt.grid(False)\n", " plt.imshow(X_train[i])\n", " plt.xlabel(class_names[y_train[i][0]])\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 826 }, "id": "TW8D67KEKhVE", "outputId": "c61586aa-a116-4331-874a-8e93b811aa6e" }, "execution_count": 63, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
Model: \"sequential_9\"\n",
"\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"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_41 (\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_6 │ (\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",
"│ conv2d_42 (\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_7 │ (\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",
"│ max_pooling2d_26 (\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_24 (\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_43 (\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_8 │ (\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",
"│ conv2d_44 (\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_9 │ (\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",
"│ max_pooling2d_27 (\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_25 (\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_45 (\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_10 │ (\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",
"│ conv2d_46 (\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_11 │ (\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",
"│ max_pooling2d_28 (\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_26 (\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_9 (\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_17 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m262,272\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_27 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_18 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m1,290\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
],
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ conv2d_41 (Conv2D) │ (None, 32, 32, 32) │ 896 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_6 │ (None, 32, 32, 32) │ 128 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_42 (Conv2D) │ (None, 32, 32, 32) │ 9,248 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_7 │ (None, 32, 32, 32) │ 128 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_26 (MaxPooling2D) │ (None, 16, 16, 32) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_24 (Dropout) │ (None, 16, 16, 32) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_43 (Conv2D) │ (None, 16, 16, 64) │ 18,496 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_8 │ (None, 16, 16, 64) │ 256 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_44 (Conv2D) │ (None, 16, 16, 64) │ 36,928 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_9 │ (None, 16, 16, 64) │ 256 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_27 (MaxPooling2D) │ (None, 8, 8, 64) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_25 (Dropout) │ (None, 8, 8, 64) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_45 (Conv2D) │ (None, 8, 8, 128) │ 73,856 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_10 │ (None, 8, 8, 128) │ 512 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_46 (Conv2D) │ (None, 8, 8, 128) │ 147,584 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_11 │ (None, 8, 8, 128) │ 512 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_28 (MaxPooling2D) │ (None, 4, 4, 128) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_26 (Dropout) │ (None, 4, 4, 128) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten_9 (Flatten) │ (None, 2048) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_17 (Dense) │ (None, 128) │ 262,272 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_27 (Dropout) │ (None, 128) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_18 (Dense) │ (None, 10) │ 1,290 │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m552,362\u001b[0m (2.11 MB)\n"
],
"text/html": [
"Total params: 552,362 (2.11 MB)\n", "\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m551,466\u001b[0m (2.10 MB)\n" ], "text/html": [ "
Trainable params: 551,466 (2.10 MB)\n", "\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m896\u001b[0m (3.50 KB)\n" ], "text/html": [ "
Non-trainable params: 896 (3.50 KB)\n", "\n" ] }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "# компилируем и обучаем модель\n", "batch_size = 64\n", "epochs = 50\n", "model.compile(loss=\"categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"])\n", "model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3otvqMjjOdq5", "outputId": "d4f520c7-ad85-4030-fda8-0c3b40e38474" }, "execution_count": 78, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m27s\u001b[0m 22ms/step - accuracy: 0.2561 - loss: 2.1138 - val_accuracy: 0.3748 - val_loss: 1.7757\n", "Epoch 2/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.4652 - loss: 1.4737 - val_accuracy: 0.5676 - val_loss: 1.2540\n", "Epoch 3/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.5844 - loss: 1.1821 - val_accuracy: 0.6148 - val_loss: 1.1905\n", "Epoch 4/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.6486 - loss: 1.0157 - val_accuracy: 0.6302 - val_loss: 1.0861\n", "Epoch 5/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.6782 - loss: 0.9326 - val_accuracy: 0.7200 - val_loss: 0.8344\n", "Epoch 6/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.7147 - loss: 0.8370 - val_accuracy: 0.7302 - val_loss: 0.7885\n", "Epoch 7/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.7334 - loss: 0.8017 - val_accuracy: 0.7486 - val_loss: 0.7221\n", "Epoch 8/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.7546 - loss: 0.7279 - val_accuracy: 0.6798 - val_loss: 1.0590\n", "Epoch 9/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.7678 - loss: 0.6993 - val_accuracy: 0.7798 - val_loss: 0.6510\n", "Epoch 10/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.7798 - loss: 0.6633 - val_accuracy: 0.7786 - val_loss: 0.6803\n", "Epoch 11/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.7920 - loss: 0.6171 - val_accuracy: 0.8112 - val_loss: 0.5666\n", "Epoch 12/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.8066 - loss: 0.5883 - val_accuracy: 0.7916 - val_loss: 0.6229\n", "Epoch 13/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8152 - loss: 0.5569 - val_accuracy: 0.8032 - val_loss: 0.6079\n", "Epoch 14/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8176 - loss: 0.5424 - val_accuracy: 0.8144 - val_loss: 0.5756\n", "Epoch 15/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8259 - loss: 0.5199 - val_accuracy: 0.8148 - val_loss: 0.5837\n", "Epoch 16/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8344 - loss: 0.4949 - val_accuracy: 0.8312 - val_loss: 0.5084\n", "Epoch 17/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8395 - loss: 0.4730 - val_accuracy: 0.8164 - val_loss: 0.5550\n", "Epoch 18/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8409 - loss: 0.4684 - val_accuracy: 0.8322 - val_loss: 0.5004\n", "Epoch 19/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8487 - loss: 0.4503 - val_accuracy: 0.8304 - val_loss: 0.5245\n", "Epoch 20/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8503 - loss: 0.4443 - val_accuracy: 0.8232 - val_loss: 0.5722\n", "Epoch 21/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8528 - loss: 0.4330 - val_accuracy: 0.8050 - val_loss: 0.6315\n", "Epoch 22/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8594 - loss: 0.4132 - val_accuracy: 0.8416 - val_loss: 0.5008\n", "Epoch 23/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8703 - loss: 0.3894 - val_accuracy: 0.8388 - val_loss: 0.5021\n", "Epoch 24/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8679 - loss: 0.3885 - val_accuracy: 0.8314 - val_loss: 0.5092\n", "Epoch 25/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8706 - loss: 0.3783 - val_accuracy: 0.8468 - val_loss: 0.4800\n", "Epoch 26/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8762 - loss: 0.3613 - val_accuracy: 0.8486 - val_loss: 0.4745\n", "Epoch 27/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8817 - loss: 0.3467 - val_accuracy: 0.8500 - val_loss: 0.4696\n", "Epoch 28/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8782 - loss: 0.3548 - val_accuracy: 0.8456 - val_loss: 0.4820\n", "Epoch 29/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 11ms/step - accuracy: 0.8816 - loss: 0.3472 - val_accuracy: 0.8528 - val_loss: 0.4728\n", "Epoch 30/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8882 - loss: 0.3312 - val_accuracy: 0.8464 - val_loss: 0.4996\n", "Epoch 31/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8887 - loss: 0.3213 - val_accuracy: 0.8516 - val_loss: 0.4806\n", "Epoch 32/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8909 - loss: 0.3191 - val_accuracy: 0.8484 - val_loss: 0.4971\n", "Epoch 33/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8934 - loss: 0.3152 - val_accuracy: 0.8400 - val_loss: 0.5208\n", "Epoch 34/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8958 - loss: 0.3092 - val_accuracy: 0.8480 - val_loss: 0.5120\n", "Epoch 35/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.8972 - loss: 0.3051 - val_accuracy: 0.8590 - val_loss: 0.4839\n", "Epoch 36/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 9ms/step - accuracy: 0.8967 - loss: 0.3109 - val_accuracy: 0.8480 - val_loss: 0.5045\n", "Epoch 37/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.9008 - loss: 0.2958 - val_accuracy: 0.8440 - val_loss: 0.5190\n", "Epoch 38/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9013 - loss: 0.2885 - val_accuracy: 0.8588 - val_loss: 0.4711\n", "Epoch 39/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9043 - loss: 0.2812 - val_accuracy: 0.8484 - val_loss: 0.5248\n", "Epoch 40/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.9088 - loss: 0.2686 - val_accuracy: 0.8580 - val_loss: 0.4680\n", "Epoch 41/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.9083 - loss: 0.2720 - val_accuracy: 0.8448 - val_loss: 0.5072\n", "Epoch 42/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.9085 - loss: 0.2663 - val_accuracy: 0.8558 - val_loss: 0.4776\n", "Epoch 43/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.9103 - loss: 0.2620 - val_accuracy: 0.8618 - val_loss: 0.4663\n", "Epoch 44/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9111 - loss: 0.2565 - val_accuracy: 0.8626 - val_loss: 0.4854\n", "Epoch 45/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9125 - loss: 0.2573 - val_accuracy: 0.8650 - val_loss: 0.4487\n", "Epoch 46/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 10ms/step - accuracy: 0.9145 - loss: 0.2525 - val_accuracy: 0.8532 - val_loss: 0.5370\n", "Epoch 47/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.9128 - loss: 0.2532 - val_accuracy: 0.8520 - val_loss: 0.5219\n", "Epoch 48/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9130 - loss: 0.2532 - val_accuracy: 0.8656 - val_loss: 0.4698\n", "Epoch 49/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9120 - loss: 0.2552 - val_accuracy: 0.8544 - val_loss: 0.4921\n", "Epoch 50/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 9ms/step - accuracy: 0.9181 - loss: 0.2383 - val_accuracy: 0.8582 - val_loss: 0.4826\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "