{ "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.mkdir('/content/drive/MyDrive/Colab Notebooks/is_lab3')\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": 4, "outputs": [] }, { "cell_type": "code", "source": [ "from google.colab import drive\n", "drive.mount('/content/drive')" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4H9UW0x9aaEQ", "outputId": "264ebd43-1773-4874-fbac-98ae491f292c" }, "execution_count": 2, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Mounted at /content/drive\n" ] } ] }, { "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": 43, "outputs": [] }, { "cell_type": "markdown", "source": [ "### 3) Разбили набор данных на обучающие и тестовые данные в соотношении 60 000:10 000 элементов. Параметр random_state выбрали равным (4k – 1)=15, где k=4 –номер бригады. Вывели размерности полученных обучающих и тестовых массивов данных." ], "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 = 15)\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": { "id": "BrSjcpEe1BeV", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "0299c15c-a632-4c99-8f60-f5a6f331a7dd" }, "execution_count": 44, "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": { "id": "xJH87ISq1B9h", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "4aa0f492-359c-4ac8-dd85-e66fa8757751" }, "execution_count": 45, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Shape of transformed X train: (60000, 28, 28, 1)\n", "Shape of transformed X test: (10000, 28, 28, 1)\n", "Shape of transformed y train: (60000, 10)\n", "Shape of transformed y test: (10000, 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": { "id": "Un561zSH1Cmv", "colab": { "base_uri": "https://localhost:8080/", "height": 353 }, "outputId": "02469669-3b81-49ba-b5ea-6bbf019a13d9" }, "execution_count": 46, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1mModel: \"sequential_3\"\u001b[0m\n" ], "text/html": [ "
Model: \"sequential_3\"\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_10 (\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_7 (\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_11 (\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_8 (\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_6 (\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_3 (\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_4 (\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_10 (Conv2D) │ (None, 26, 26, 32) │ 320 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_7 (MaxPooling2D) │ (None, 13, 13, 32) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_11 (Conv2D) │ (None, 11, 11, 64) │ 18,496 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_8 (MaxPooling2D) │ (None, 5, 5, 64) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_6 (Dropout) │ (None, 5, 5, 64) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten_3 (Flatten) │ (None, 1600) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_4 (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": { "id": "q_h8PxkN9m0v", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "62f45088-0758-4ef0-a718-e0ab53195750" }, "execution_count": 47, "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[1m7s\u001b[0m 35ms/step - accuracy: 0.6005 - loss: 1.3162 - val_accuracy: 0.9470 - val_loss: 0.1911\n", "Epoch 2/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9392 - loss: 0.2061 - val_accuracy: 0.9640 - val_loss: 0.1177\n", "Epoch 3/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9598 - loss: 0.1344 - val_accuracy: 0.9728 - val_loss: 0.0931\n", "Epoch 4/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9671 - loss: 0.1093 - val_accuracy: 0.9783 - val_loss: 0.0776\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.9727 - loss: 0.0872 - val_accuracy: 0.9798 - val_loss: 0.0676\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.9738 - loss: 0.0834 - val_accuracy: 0.9803 - val_loss: 0.0614\n", "Epoch 7/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9801 - loss: 0.0671 - val_accuracy: 0.9830 - val_loss: 0.0555\n", "Epoch 8/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.9794 - loss: 0.0665 - val_accuracy: 0.9847 - val_loss: 0.0515\n", "Epoch 9/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.9810 - loss: 0.0598 - val_accuracy: 0.9847 - val_loss: 0.0485\n", "Epoch 10/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 12ms/step - accuracy: 0.9813 - loss: 0.0578 - val_accuracy: 0.9853 - val_loss: 0.0463\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.9834 - loss: 0.0535 - val_accuracy: 0.9853 - val_loss: 0.0441\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.9845 - loss: 0.0492 - val_accuracy: 0.9867 - 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 10ms/step - accuracy: 0.9842 - loss: 0.0491 - val_accuracy: 0.9867 - val_loss: 0.0417\n", "Epoch 14/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9859 - loss: 0.0441 - val_accuracy: 0.9877 - val_loss: 0.0401\n", "Epoch 15/15\n", "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - accuracy: 0.9853 - loss: 0.0446 - val_accuracy: 0.9877 - val_loss: 0.0382\n" ] }, { "output_type": "execute_result", "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",
"│ dense_20 (\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_21 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m1,010\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
],
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ dense_20 (Dense) │ (None, 100) │ 78,500 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_21 (Dense) │ (None, 10) │ 1,010 │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m79,512\u001b[0m (310.60 KB)\n"
],
"text/html": [
"Total params: 79,512 (310.60 KB)\n", "\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m79,510\u001b[0m (310.59 KB)\n" ], "text/html": [ "
Trainable params: 79,510 (310.59 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": { "id": "0ki8fhJrEyEt", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "7f68607f-562f-4d80-8aca-5aa6de683947" }, "execution_count": 21, "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": { "id": "0Yj0fzLNE12k", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "1e47e205-8f77-4a6f-eec3-dc6b004f76f6" }, "execution_count": 22, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 3ms/step - accuracy: 0.9474 - loss: 0.1746\n", "Loss on test data: 0.18537543714046478\n", "Accuracy on test data: 0.9453999996185303\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.988 ; loss:0.036 |\n", "| Полносвязная | 79,512 | 50 | accuracy:0.9454 ; loss:0.185 |\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", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "be86c640-a56d-4856-852b-7e0ebf26aaaa" }, "execution_count": 23, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz\n", "\u001b[1m170498071/170498071\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 0us/step\n" ] } ] }, { "cell_type": "markdown", "source": [ "### 2) Разбили набор данных на обучающие и тестовые данные в соотношении 50 000:10 000 элементов. Параметр random_state выбрали равным (4k – 1)=15, где k=4 –номер бригады. Вывели размерности полученных обучающих и тестовых массивов данных." ], "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 = 15)\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": { "id": "DlnFbQogKD2v", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "a87bf7a7-68ed-401e-a39e-a08d63fbd809" }, "execution_count": 24, "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": { "id": "TW8D67KEKhVE", "colab": { "base_uri": "https://localhost:8080/", "height": 826 }, "outputId": "670357d5-a937-414e-e95d-ecbad3b416e6" }, "execution_count": 25, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
Model: \"sequential_1\"\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_2 (\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 │ (\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_3 (\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_1 │ (\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_2 (\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_1 (\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_4 (\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_2 │ (\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_5 (\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_3 │ (\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_3 (\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_2 (\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_6 (\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_4 │ (\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_7 (\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_5 │ (\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_4 (\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_3 (\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_1 (\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_1 (\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_4 (\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_2 (\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_2 (Conv2D) │ (None, 32, 32, 32) │ 896 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization │ (None, 32, 32, 32) │ 128 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_3 (Conv2D) │ (None, 32, 32, 32) │ 9,248 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_1 │ (None, 32, 32, 32) │ 128 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_2 (MaxPooling2D) │ (None, 16, 16, 32) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_1 (Dropout) │ (None, 16, 16, 32) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_4 (Conv2D) │ (None, 16, 16, 64) │ 18,496 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_2 │ (None, 16, 16, 64) │ 256 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_5 (Conv2D) │ (None, 16, 16, 64) │ 36,928 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_3 │ (None, 16, 16, 64) │ 256 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_3 (MaxPooling2D) │ (None, 8, 8, 64) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_2 (Dropout) │ (None, 8, 8, 64) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_6 (Conv2D) │ (None, 8, 8, 128) │ 73,856 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_4 │ (None, 8, 8, 128) │ 512 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv2d_7 (Conv2D) │ (None, 8, 8, 128) │ 147,584 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ batch_normalization_5 │ (None, 8, 8, 128) │ 512 │\n",
"│ (BatchNormalization) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ max_pooling2d_4 (MaxPooling2D) │ (None, 4, 4, 128) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_3 (Dropout) │ (None, 4, 4, 128) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ flatten_1 (Flatten) │ (None, 2048) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_1 (Dense) │ (None, 128) │ 262,272 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout_4 (Dropout) │ (None, 128) │ 0 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_2 (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": { "id": "3otvqMjjOdq5", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "dc91afb5-d8a9-4541-9104-9dd6cce4d8fe" }, "execution_count": 28, "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[1m30s\u001b[0m 26ms/step - accuracy: 0.2649 - loss: 2.1252 - val_accuracy: 0.4706 - val_loss: 1.4156\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.4601 - loss: 1.4764 - val_accuracy: 0.5836 - val_loss: 1.1330\n", "Epoch 3/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.5653 - loss: 1.2306 - val_accuracy: 0.6386 - val_loss: 1.0458\n", "Epoch 4/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.6361 - loss: 1.0504 - val_accuracy: 0.6950 - val_loss: 0.8850\n", "Epoch 5/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.6788 - loss: 0.9410 - val_accuracy: 0.7124 - val_loss: 0.8396\n", "Epoch 6/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.6999 - loss: 0.8709 - val_accuracy: 0.7282 - val_loss: 0.7933\n", "Epoch 7/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.7321 - loss: 0.7877 - val_accuracy: 0.7426 - val_loss: 0.7512\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.7522 - loss: 0.7415 - val_accuracy: 0.7510 - val_loss: 0.7512\n", "Epoch 9/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.7654 - loss: 0.6900 - val_accuracy: 0.7766 - val_loss: 0.6617\n", "Epoch 10/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.7855 - loss: 0.6378 - val_accuracy: 0.7578 - val_loss: 0.7086\n", "Epoch 11/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.7883 - loss: 0.6206 - val_accuracy: 0.7872 - val_loss: 0.6364\n", "Epoch 12/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8030 - loss: 0.5865 - val_accuracy: 0.7576 - val_loss: 0.7369\n", "Epoch 13/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8072 - loss: 0.5700 - val_accuracy: 0.7958 - val_loss: 0.5959\n", "Epoch 14/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8219 - loss: 0.5243 - val_accuracy: 0.8142 - val_loss: 0.5654\n", "Epoch 15/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8273 - loss: 0.5082 - val_accuracy: 0.7914 - val_loss: 0.6319\n", "Epoch 16/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8374 - loss: 0.4829 - val_accuracy: 0.8262 - val_loss: 0.5276\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.8353 - loss: 0.4944 - val_accuracy: 0.8072 - val_loss: 0.5965\n", "Epoch 18/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8428 - loss: 0.4644 - val_accuracy: 0.8310 - val_loss: 0.5173\n", "Epoch 19/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.8506 - loss: 0.4382 - val_accuracy: 0.8094 - val_loss: 0.6068\n", "Epoch 20/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8534 - loss: 0.4367 - val_accuracy: 0.8204 - val_loss: 0.5567\n", "Epoch 21/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 10ms/step - accuracy: 0.8567 - loss: 0.4203 - val_accuracy: 0.8298 - val_loss: 0.5206\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.8572 - loss: 0.4125 - val_accuracy: 0.8096 - val_loss: 0.5871\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.8659 - loss: 0.3902 - val_accuracy: 0.8352 - val_loss: 0.5270\n", "Epoch 24/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.8687 - loss: 0.3854 - val_accuracy: 0.8294 - val_loss: 0.5306\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.8686 - loss: 0.3820 - val_accuracy: 0.8276 - val_loss: 0.5693\n", "Epoch 26/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.8730 - loss: 0.3675 - val_accuracy: 0.8400 - val_loss: 0.5132\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.8741 - loss: 0.3597 - val_accuracy: 0.8352 - val_loss: 0.5377\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.8762 - loss: 0.3631 - val_accuracy: 0.8426 - val_loss: 0.5101\n", "Epoch 29/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8864 - loss: 0.3382 - val_accuracy: 0.8150 - val_loss: 0.5927\n", "Epoch 30/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8881 - loss: 0.3253 - val_accuracy: 0.8390 - val_loss: 0.5130\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.8867 - loss: 0.3306 - val_accuracy: 0.8406 - val_loss: 0.5136\n", "Epoch 32/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.8869 - loss: 0.3284 - val_accuracy: 0.8464 - val_loss: 0.4983\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.8907 - loss: 0.3224 - val_accuracy: 0.8490 - val_loss: 0.4849\n", "Epoch 34/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 10ms/step - accuracy: 0.8962 - loss: 0.3082 - val_accuracy: 0.8292 - val_loss: 0.5812\n", "Epoch 35/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.8938 - loss: 0.3085 - val_accuracy: 0.8318 - val_loss: 0.5522\n", "Epoch 36/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.8937 - loss: 0.3166 - val_accuracy: 0.8430 - val_loss: 0.5358\n", "Epoch 37/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9012 - loss: 0.2844 - val_accuracy: 0.8552 - val_loss: 0.5092\n", "Epoch 38/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.9023 - loss: 0.2928 - val_accuracy: 0.8456 - val_loss: 0.5474\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.9082 - loss: 0.2685 - val_accuracy: 0.8500 - val_loss: 0.4935\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.9040 - loss: 0.2683 - val_accuracy: 0.8526 - val_loss: 0.4914\n", "Epoch 41/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9061 - loss: 0.2696 - val_accuracy: 0.8374 - val_loss: 0.5551\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.9074 - loss: 0.2685 - val_accuracy: 0.8504 - val_loss: 0.5127\n", "Epoch 43/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9081 - loss: 0.2675 - val_accuracy: 0.8508 - val_loss: 0.5055\n", "Epoch 44/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.9132 - loss: 0.2537 - val_accuracy: 0.8540 - val_loss: 0.5132\n", "Epoch 45/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step - accuracy: 0.9145 - loss: 0.2426 - val_accuracy: 0.8568 - val_loss: 0.4913\n", "Epoch 46/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.9148 - loss: 0.2461 - val_accuracy: 0.8560 - val_loss: 0.5101\n", "Epoch 47/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9158 - loss: 0.2474 - val_accuracy: 0.8514 - val_loss: 0.5321\n", "Epoch 48/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 10ms/step - accuracy: 0.9197 - loss: 0.2367 - val_accuracy: 0.8450 - val_loss: 0.5670\n", "Epoch 49/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 10ms/step - accuracy: 0.9153 - loss: 0.2506 - val_accuracy: 0.8492 - val_loss: 0.5532\n", "Epoch 50/50\n", "\u001b[1m704/704\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.9223 - loss: 0.2278 - val_accuracy: 0.8478 - val_loss: 0.5545\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "