{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Простейшие нейронные сети с Keras\n", "\n", "**ВНИМАНИЕ:** Чтобы работать с Keras, у вас уже должен быть установлен хотя бы один из фреймворков — Theano или Tensorflow.\n", "\n", "## 1. О данных и бэйзлайнах\n", "\n", "В этом задании нам доведётся построить несколько своих первых нейронных сетей для решения задачи классификации. Вам придётся так подобрать число нейронов, чтобы с одной стороны модель была не очень сложной и не переобучалась, а с другой стороны давала бы достаточно хороший прогноз. \n", "\n", "Делать всё это мы будем на животных. Ежегодно около 7.6 миллионов бедных животных в США оказываются в приютах. Часть из них находит себе новую семью, часть возвращается к старому (бывает, что питомец потерялся и его нашли на улице), а часть погибает. Ужегодно усыпляется около 2.7 млн. собак и кошек. \n", "\n", "Используя датасет с входной информацией (цвет, пол, возраст и т.п.) из одного из приютов, мы попытаемся спрогнозировать что произойдёт с новыми животными, которые попадут в этот приют. Данные, используемые в тетрадке уже были предварительно обработаны и приведены в удобную для построения моделей форму. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "plt.style.use('ggplot')\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(26729, 37)\n", "(26729,)\n" ] }, { "data": { "text/html": [ "
\n", " | IsDog | \n", "Age | \n", "HasName | \n", "NameLength | \n", "NameFreq | \n", "MixColor | \n", "ColorFreqAsIs | \n", "ColorFreqBase | \n", "TabbyColor | \n", "MixBreed | \n", "... | \n", "SexStatus_Flawed | \n", "SexStatus_Intact | \n", "SexStatus_Unknown | \n", "Weekday_0 | \n", "Weekday_1 | \n", "Weekday_2 | \n", "Weekday_3 | \n", "Weekday_4 | \n", "Weekday_5 | \n", "Weekday_6 | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | \n", "1 | \n", "365.0 | \n", "1 | \n", "7 | \n", "0.000157 | \n", "1 | \n", "0.032919 | \n", "0.463624 | \n", "0 | \n", "1 | \n", "... | \n", "1 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "1 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "
1 | \n", "0 | \n", "365.0 | \n", "1 | \n", "5 | \n", "0.000655 | \n", "0 | \n", "0.008092 | \n", "0.015005 | \n", "1 | \n", "1 | \n", "... | \n", "1 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "1 | \n", "
2 | \n", "1 | \n", "730.0 | \n", "1 | \n", "6 | \n", "0.000052 | \n", "1 | \n", "0.026293 | \n", "0.357521 | \n", "0 | \n", "1 | \n", "... | \n", "1 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "1 | \n", "0 | \n", "
3 | \n", "0 | \n", "21.0 | \n", "0 | \n", "7 | \n", "0.285871 | \n", "0 | \n", "0.000471 | \n", "0.058418 | \n", "0 | \n", "1 | \n", "... | \n", "0 | \n", "1 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "1 | \n", "0 | \n", "0 | \n", "
4 | \n", "1 | \n", "730.0 | \n", "0 | \n", "7 | \n", "0.285871 | \n", "0 | \n", "0.023831 | \n", "0.075353 | \n", "0 | \n", "0 | \n", "... | \n", "1 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "1 | \n", "0 | \n", "0 | \n", "
5 rows × 37 columns
\n", "Model: \"Archibald\"\n",
"
\n"
],
"text/plain": [
"\u001b[1mModel: \"Archibald\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n", "┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n", "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n", "│ dense_3 (Dense) │ (None, 25) │ 950 │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ activation_2 (Activation) │ (None, 25) │ 0 │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dense_4 (Dense) │ (None, 25) │ 650 │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ activation_3 (Activation) │ (None, 25) │ 0 │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dense_5 (Dense) │ (None, 4) │ 104 │\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", "│ dense_3 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m25\u001b[0m) │ \u001b[38;5;34m950\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ activation_2 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m25\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;34m25\u001b[0m) │ \u001b[38;5;34m650\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ activation_3 (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m25\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;34m4\u001b[0m) │ \u001b[38;5;34m104\u001b[0m │\n", "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Total params: 1,704 (6.66 KB)\n", "\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m1,704\u001b[0m (6.66 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Trainable params: 1,704 (6.66 KB)\n", "\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m1,704\u001b[0m (6.66 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.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Видим, что нужно оценить огромное количество параметров. На оценку каждого параметра придётся совсем маленькое количество наблюдений. " ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "12.548708920187794" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train.shape[0]/1704" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Отлично! Модель собрана. Осталось её обучить. Метод `fit` позволяет сделать это. Он принимает на вход обучаюзиую выборку `X_train, y_train`. Параметр `batch_size` это размер батча. Этот параметр ограничивает количество примеров, которое за раз подаётся в нашу нейронную сеть. Количиство эпох для обучения, `epochs`, это сичсло проходов модели по обучающей выборке. \n", "\n", "Обычно нейросетки обучаются довольно долго. В связи с этим обучать их на раздичных фолдах и оценивать качество работы модели на кросс-валидации не очень быстрое занятие, которое себе может позволить далеко не каждый. Для проверки качества обычно внутри обучения с помощью параметра `validation_split` часть выборки оставляют под валидацию, которая осуществляется после каждой эпохи. Как только качество на валидации начнёт падать, это будет означать, что модель переобучилаcь. \n", "\n", "Всё, что будет нам возвращать метод `.fit`, мы запишем в переменную `hist`. После обученя модели там окажется вся история ошибок на каждом шаге обучения. Отключить сообщения о том, на каком этапе обучения в данный момент находится модель, можно с параметром `verbose = 0`. Переменную $y$ для успешного обучения сетки нужно будет перевести в матрицу из дамми-переменных с помощью команды `to_categorical`. " ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0., 0., 1., 0.],\n", " [0., 1., 0., 0.],\n", " [1., 0., 0., 0.],\n", " ...,\n", " [1., 0., 0., 0.],\n", " [0., 0., 0., 1.],\n", " [0., 0., 0., 1.]])" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "to_categorical(y)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 5ms/step - accuracy: 0.4029 - loss: 1.2188 - val_accuracy: 0.4178 - val_loss: 1.1468\n", "Epoch 2/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4230 - loss: 1.1437 - val_accuracy: 0.4171 - val_loss: 1.1438\n", "Epoch 3/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 5ms/step - accuracy: 0.4215 - loss: 1.1427 - val_accuracy: 0.4171 - val_loss: 1.1397\n", "Epoch 4/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4246 - loss: 1.1387 - val_accuracy: 0.4127 - val_loss: 1.1389\n", "Epoch 5/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4145 - loss: 1.1445 - val_accuracy: 0.4199 - val_loss: 1.1373\n", "Epoch 6/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4284 - loss: 1.1370 - val_accuracy: 0.4171 - val_loss: 1.1371\n", "Epoch 7/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4312 - loss: 1.1398 - val_accuracy: 0.4010 - val_loss: 1.1458\n", "Epoch 8/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4158 - loss: 1.1444 - val_accuracy: 0.4171 - val_loss: 1.1342\n", "Epoch 9/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 4ms/step - accuracy: 0.4167 - loss: 1.1404 - val_accuracy: 0.4171 - val_loss: 1.1349\n", "Epoch 10/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4295 - loss: 1.1383 - val_accuracy: 0.4122 - val_loss: 1.1377\n", "Epoch 11/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4181 - loss: 1.1311 - val_accuracy: 0.4171 - val_loss: 1.1353\n", "Epoch 12/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4183 - loss: 1.1401 - val_accuracy: 0.4171 - val_loss: 1.1360\n", "Epoch 13/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4167 - loss: 1.1428 - val_accuracy: 0.4171 - val_loss: 1.1360\n", "Epoch 14/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4159 - loss: 1.1381 - val_accuracy: 0.4171 - val_loss: 1.1385\n", "Epoch 15/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 4ms/step - accuracy: 0.4218 - loss: 1.1360 - val_accuracy: 0.4017 - val_loss: 1.1367\n", "Epoch 16/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4227 - loss: 1.1350 - val_accuracy: 0.4129 - val_loss: 1.1367\n", "Epoch 17/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4207 - loss: 1.1454 - val_accuracy: 0.4178 - val_loss: 1.1425\n", "Epoch 18/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4259 - loss: 1.1288 - val_accuracy: 0.4178 - val_loss: 1.1359\n", "Epoch 19/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4228 - loss: 1.1365 - val_accuracy: 0.4171 - val_loss: 1.1399\n", "Epoch 20/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4219 - loss: 1.1361 - val_accuracy: 0.4171 - val_loss: 1.1393\n", "Epoch 21/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4293 - loss: 1.1348 - val_accuracy: 0.4131 - val_loss: 1.1410\n", "Epoch 22/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4210 - loss: 1.1458 - val_accuracy: 0.4022 - val_loss: 1.1407\n", "Epoch 23/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4163 - loss: 1.1417 - val_accuracy: 0.4171 - val_loss: 1.1595\n", "Epoch 24/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4270 - loss: 1.1592 - val_accuracy: 0.4171 - val_loss: 1.1533\n", "Epoch 25/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4253 - loss: 1.1588 - val_accuracy: 0.4171 - val_loss: 1.1539\n", "Epoch 26/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4304 - loss: 1.1565 - val_accuracy: 0.4171 - val_loss: 1.1531\n", "Epoch 27/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4312 - loss: 1.1560 - val_accuracy: 0.4171 - val_loss: 1.1555\n", "Epoch 28/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4245 - loss: 1.1588 - val_accuracy: 0.4171 - val_loss: 1.1532\n", "Epoch 29/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4266 - loss: 1.1566 - val_accuracy: 0.4171 - val_loss: 1.1548\n", "Epoch 30/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4267 - loss: 1.1572 - val_accuracy: 0.4171 - val_loss: 1.1549\n", "Epoch 31/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4183 - loss: 1.1635 - val_accuracy: 0.4171 - val_loss: 1.1531\n", "Epoch 32/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4193 - loss: 1.1577 - val_accuracy: 0.4171 - val_loss: 1.1536\n", "Epoch 33/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4314 - loss: 1.1495 - val_accuracy: 0.4171 - val_loss: 1.1540\n", "Epoch 34/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4099 - loss: 1.1594 - val_accuracy: 0.4171 - val_loss: 1.1538\n", "Epoch 35/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4198 - loss: 1.1651 - val_accuracy: 0.4171 - val_loss: 1.1537\n", "Epoch 36/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4289 - loss: 1.1574 - val_accuracy: 0.4122 - val_loss: 1.1546\n", "Epoch 37/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4284 - loss: 1.1495 - val_accuracy: 0.4171 - val_loss: 1.1532\n", "Epoch 38/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4209 - loss: 1.1596 - val_accuracy: 0.4171 - val_loss: 1.1522\n", "Epoch 39/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4269 - loss: 1.1481 - val_accuracy: 0.4171 - val_loss: 1.1534\n", "Epoch 40/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4149 - loss: 1.1664 - val_accuracy: 0.4171 - val_loss: 1.1689\n", "Epoch 41/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4267 - loss: 1.1727 - val_accuracy: 0.4199 - val_loss: 1.1570\n", "Epoch 42/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4173 - loss: 1.1712 - val_accuracy: 0.4199 - val_loss: 1.1552\n", "Epoch 43/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4226 - loss: 1.1583 - val_accuracy: 0.4199 - val_loss: 1.1539\n", "Epoch 44/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4178 - loss: 1.1594 - val_accuracy: 0.4199 - val_loss: 1.1528\n", "Epoch 45/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4183 - loss: 1.1659 - val_accuracy: 0.4199 - val_loss: 1.1526\n", "Epoch 46/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4258 - loss: 1.1476 - val_accuracy: 0.4199 - val_loss: 1.1526\n", "Epoch 47/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4211 - loss: 1.1593 - val_accuracy: 0.4159 - val_loss: 1.1423\n", "Epoch 48/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - accuracy: 0.4155 - loss: 1.1452 - val_accuracy: 0.4159 - val_loss: 1.1427\n", "Epoch 49/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4236 - loss: 1.1393 - val_accuracy: 0.4199 - val_loss: 1.1393\n", "Epoch 50/50\n", "\u001b[1m535/535\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.4235 - loss: 1.1474 - val_accuracy: 0.4199 - val_loss: 1.1512\n" ] } ], "source": [ "hist = model.fit(X_train, to_categorical(y_train), validation_split=0.2, epochs=50, verbose=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Посмотрим на динамику ошибок нашей модели во времени. " ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "