ckiias/lec2.ipynb

159 KiB
Raw Blame History

Глубокое обучение

Инициализация Keras

В качестве бэкенда используется jax

Бэкенд должен указываться до импорта keras

In [1]:
import os

os.environ["KERAS_BACKEND"] = "jax"
import keras

print(keras.__version__)
3.9.2

Классификация

Загрузка набора данных для задачи классификации

База данных MNIST (сокращение от "Modified National Institute of Standards and Technology") — объёмная база данных образцов рукописного написания цифр. База данных является стандартом, предложенным Национальным институтом стандартов и технологий США с целью обучения и сопоставления методов распознавания изображений с помощью машинного обучения в первую очередь на основе нейронных сетей. Данные состоят из заранее подготовленных примеров изображений, на основе которых проводится обучение и тестирование систем.

База данных MNIST содержит 60000 изображений для обучения и 10000 изображений для тестирования.

In [2]:
from keras.api.datasets import mnist

(X_train, y_train), (X_valid, y_valid) = mnist.load_data()

Отображение данных

Образцы из набора прошли сглаживание и приведены к серому полутоновому изображению размером 28x28 пикселей.

Под каждым изображением представлено соответствующее ему значение целевого признака (класс).

In [3]:
from turtle import width
from matplotlib import pyplot as plt

fig, axes = plt.subplots(3, 4, figsize=(5, 5))
for k in range(12):
    current_axes = axes[k % 3][k % 4]
    current_axes.imshow(X_train[k], cmap='grey')
    current_axes.get_xaxis().set_ticks([])
    current_axes.get_yaxis().set_ticks([])
    current_axes.set_xlabel(y_train[k])
plt.tight_layout()
plt.show()

Предобработка данных

Количество классов - 10 (от 0 до 9).

Все изображения из X трансформируются в векторы длиной 784 (28*28) признака и нормализуются.

Для целевых признаков применяется унитарное кодирование в бинарные векторы длиной 10 (нормализация).

In [4]:
n_classes = 10

X_train = X_train.reshape(60000, 784).astype("float32") / 255
X_valid = X_valid.reshape(10000, 784).astype("float32") / 255
y_train = keras.utils.to_categorical(y_train, n_classes)
y_valid = keras.utils.to_categorical(y_valid, n_classes)

display(X_train[0])
display(y_train[0])
array([0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.01176471, 0.07058824, 0.07058824,
       0.07058824, 0.49411765, 0.53333336, 0.6862745 , 0.10196079,
       0.6509804 , 1.        , 0.96862745, 0.49803922, 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.11764706, 0.14117648, 0.36862746, 0.6039216 ,
       0.6666667 , 0.99215686, 0.99215686, 0.99215686, 0.99215686,
       0.99215686, 0.88235295, 0.6745098 , 0.99215686, 0.9490196 ,
       0.7647059 , 0.2509804 , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.19215687, 0.93333334,
       0.99215686, 0.99215686, 0.99215686, 0.99215686, 0.99215686,
       0.99215686, 0.99215686, 0.99215686, 0.9843137 , 0.3647059 ,
       0.32156864, 0.32156864, 0.21960784, 0.15294118, 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.07058824, 0.85882354, 0.99215686, 0.99215686,
       0.99215686, 0.99215686, 0.99215686, 0.7764706 , 0.7137255 ,
       0.96862745, 0.94509804, 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.3137255 , 0.6117647 , 0.41960785, 0.99215686, 0.99215686,
       0.8039216 , 0.04313726, 0.        , 0.16862746, 0.6039216 ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.05490196,
       0.00392157, 0.6039216 , 0.99215686, 0.3529412 , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.54509807,
       0.99215686, 0.74509805, 0.00784314, 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.04313726, 0.74509805, 0.99215686,
       0.27450982, 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.13725491, 0.94509804, 0.88235295, 0.627451  ,
       0.42352942, 0.00392157, 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.31764707, 0.9411765 , 0.99215686, 0.99215686, 0.46666667,
       0.09803922, 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.1764706 ,
       0.7294118 , 0.99215686, 0.99215686, 0.5882353 , 0.10588235,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.0627451 , 0.3647059 ,
       0.9882353 , 0.99215686, 0.73333335, 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.9764706 , 0.99215686,
       0.9764706 , 0.2509804 , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.18039216, 0.50980395,
       0.7176471 , 0.99215686, 0.99215686, 0.8117647 , 0.00784314,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.15294118,
       0.5803922 , 0.8980392 , 0.99215686, 0.99215686, 0.99215686,
       0.98039216, 0.7137255 , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.09411765, 0.44705883, 0.8666667 , 0.99215686, 0.99215686,
       0.99215686, 0.99215686, 0.7882353 , 0.30588236, 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.09019608, 0.25882354, 0.8352941 , 0.99215686,
       0.99215686, 0.99215686, 0.99215686, 0.7764706 , 0.31764707,
       0.00784314, 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.07058824, 0.67058825, 0.85882354,
       0.99215686, 0.99215686, 0.99215686, 0.99215686, 0.7647059 ,
       0.3137255 , 0.03529412, 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.21568628, 0.6745098 ,
       0.8862745 , 0.99215686, 0.99215686, 0.99215686, 0.99215686,
       0.95686275, 0.52156866, 0.04313726, 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.53333336, 0.99215686, 0.99215686, 0.99215686,
       0.83137256, 0.5294118 , 0.5176471 , 0.0627451 , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        ], dtype=float32)
array([0., 0., 0., 0., 0., 1., 0., 0., 0., 0.])

Проектирование архитектуры простой ИНС

Сеть состоит из:

  • входного слоя с 784 входами (InputLayer);
  • скрытого полносвязного слоя с 64 sigmoid-нейронами (dense_2);
  • выходного слоя с 10 softmax-нейронами (многоклассовая классификация) (dense_3).

Количество параметров в слоях:

  • dense_2: 784 64 + 64 = 50 176 + 64 = 50 240. У каждого из 64 нейронов 784 входа с 784 параметрами (w x) + 64 смещения (b).
  • dense_3: 64 * 10 + 10 = 640 + 10 = 650.

Всего параметров: 50 240 + 650 = 50 890.

Все параметры настраиваются в процессе обучения.

In [5]:
from keras.api.models import Sequential
from keras.api.layers import Dense, InputLayer

simple_model = Sequential()
simple_model.add(InputLayer(shape=(28*28,)))
simple_model.add(Dense(64, activation="sigmoid"))
simple_model.add(Dense(n_classes, activation="softmax"))
simple_model.summary()
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                     Output Shape                  Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense (Dense)                   │ (None, 64)             │        50,240 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_1 (Dense)                 │ (None, 10)             │           650 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 50,890 (198.79 KB)
 Trainable params: 50,890 (198.79 KB)
 Non-trainable params: 0 (0.00 B)

Обучение простой модели

Функция стоимости: MSE (квадратичная функция)

Оптимизатор: стохастический градиентный спуск (SGD)

Скорость обучения: 0.01

Количество эпох: 200

Размер пакета: 128

Всего пакетов: 60 000 / 128 = 468.75 (468 пакетов по 128 изображений и 1 пакет с 96 изображениями)

Метрика оценки качества: accuracy

Оценка качества и стоимость на обучающей выборке:\ accuracy: 0.4650 - loss: 0.0849

Оценка качества и стоимость на тестовой выборке:\ val_accuracy: 0.4703 - val_loss: 0.0845

In [6]:
from keras.api.optimizers import SGD

simple_model.compile(
    loss="mean_squared_error",
    optimizer=SGD(learning_rate=0.01),
    metrics=["accuracy"],
)

simple_model.fit(
    X_train,
    y_train,
    batch_size=128,
    epochs=200,
    validation_data=(X_valid, y_valid),
)
Epoch 1/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.1217 - loss: 0.0930 - val_accuracy: 0.1302 - val_loss: 0.0919
Epoch 2/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 797us/step - accuracy: 0.1303 - loss: 0.0916 - val_accuracy: 0.1377 - val_loss: 0.0909
Epoch 3/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 749us/step - accuracy: 0.1397 - loss: 0.0906 - val_accuracy: 0.1498 - val_loss: 0.0902
Epoch 4/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 832us/step - accuracy: 0.1451 - loss: 0.0901 - val_accuracy: 0.1616 - val_loss: 0.0897
Epoch 5/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 763us/step - accuracy: 0.1590 - loss: 0.0896 - val_accuracy: 0.1792 - val_loss: 0.0892
Epoch 6/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 695us/step - accuracy: 0.1774 - loss: 0.0891 - val_accuracy: 0.2015 - val_loss: 0.0888
Epoch 7/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 771us/step - accuracy: 0.2010 - loss: 0.0888 - val_accuracy: 0.2305 - val_loss: 0.0885
Epoch 8/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 862us/step - accuracy: 0.2317 - loss: 0.0885 - val_accuracy: 0.2665 - val_loss: 0.0882
Epoch 9/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 931us/step - accuracy: 0.2713 - loss: 0.0881 - val_accuracy: 0.3034 - val_loss: 0.0878
Epoch 10/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 735us/step - accuracy: 0.3060 - loss: 0.0878 - val_accuracy: 0.3347 - val_loss: 0.0875
Epoch 11/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 711us/step - accuracy: 0.3334 - loss: 0.0875 - val_accuracy: 0.3617 - val_loss: 0.0872
Epoch 12/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 841us/step - accuracy: 0.3607 - loss: 0.0872 - val_accuracy: 0.3854 - val_loss: 0.0869
Epoch 13/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 782us/step - accuracy: 0.3807 - loss: 0.0869 - val_accuracy: 0.4040 - val_loss: 0.0866
Epoch 14/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 800us/step - accuracy: 0.3964 - loss: 0.0867 - val_accuracy: 0.4214 - val_loss: 0.0863
Epoch 15/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 747us/step - accuracy: 0.4183 - loss: 0.0863 - val_accuracy: 0.4375 - val_loss: 0.0860
Epoch 16/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 828us/step - accuracy: 0.4257 - loss: 0.0860 - val_accuracy: 0.4483 - val_loss: 0.0857
Epoch 17/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 831us/step - accuracy: 0.4421 - loss: 0.0857 - val_accuracy: 0.4594 - val_loss: 0.0853
Epoch 18/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 809us/step - accuracy: 0.4493 - loss: 0.0854 - val_accuracy: 0.4693 - val_loss: 0.0850
Epoch 19/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 903us/step - accuracy: 0.4597 - loss: 0.0850 - val_accuracy: 0.4793 - val_loss: 0.0846
Epoch 20/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 996us/step - accuracy: 0.4715 - loss: 0.0846 - val_accuracy: 0.4873 - val_loss: 0.0843
Epoch 21/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 915us/step - accuracy: 0.4783 - loss: 0.0843 - val_accuracy: 0.4939 - val_loss: 0.0839
Epoch 22/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - accuracy: 0.4842 - loss: 0.0839 - val_accuracy: 0.5003 - val_loss: 0.0835
Epoch 23/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 938us/step - accuracy: 0.4904 - loss: 0.0836 - val_accuracy: 0.5059 - val_loss: 0.0832
Epoch 24/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 867us/step - accuracy: 0.4936 - loss: 0.0832 - val_accuracy: 0.5099 - val_loss: 0.0828
Epoch 25/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 941us/step - accuracy: 0.4990 - loss: 0.0828 - val_accuracy: 0.5142 - val_loss: 0.0823
Epoch 26/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.5010 - loss: 0.0824 - val_accuracy: 0.5187 - val_loss: 0.0819
Epoch 27/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.5052 - loss: 0.0820 - val_accuracy: 0.5223 - val_loss: 0.0815
Epoch 28/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - accuracy: 0.5082 - loss: 0.0816 - val_accuracy: 0.5268 - val_loss: 0.0811
Epoch 29/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.5127 - loss: 0.0811 - val_accuracy: 0.5304 - val_loss: 0.0806
Epoch 30/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 923us/step - accuracy: 0.5189 - loss: 0.0807 - val_accuracy: 0.5343 - val_loss: 0.0802
Epoch 31/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 844us/step - accuracy: 0.5180 - loss: 0.0803 - val_accuracy: 0.5379 - val_loss: 0.0797
Epoch 32/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 732us/step - accuracy: 0.5233 - loss: 0.0798 - val_accuracy: 0.5414 - val_loss: 0.0792
Epoch 33/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 806us/step - accuracy: 0.5250 - loss: 0.0793 - val_accuracy: 0.5446 - val_loss: 0.0787
Epoch 34/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 861us/step - accuracy: 0.5325 - loss: 0.0788 - val_accuracy: 0.5480 - val_loss: 0.0782
Epoch 35/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 873us/step - accuracy: 0.5349 - loss: 0.0783 - val_accuracy: 0.5511 - val_loss: 0.0777
Epoch 36/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 927us/step - accuracy: 0.5351 - loss: 0.0778 - val_accuracy: 0.5545 - val_loss: 0.0772
Epoch 37/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 928us/step - accuracy: 0.5426 - loss: 0.0773 - val_accuracy: 0.5591 - val_loss: 0.0767
Epoch 38/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 899us/step - accuracy: 0.5458 - loss: 0.0768 - val_accuracy: 0.5618 - val_loss: 0.0762
Epoch 39/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 877us/step - accuracy: 0.5514 - loss: 0.0764 - val_accuracy: 0.5650 - val_loss: 0.0757
Epoch 40/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 885us/step - accuracy: 0.5581 - loss: 0.0757 - val_accuracy: 0.5666 - val_loss: 0.0752
Epoch 41/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 845us/step - accuracy: 0.5623 - loss: 0.0751 - val_accuracy: 0.5709 - val_loss: 0.0746
Epoch 42/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 826us/step - accuracy: 0.5606 - loss: 0.0748 - val_accuracy: 0.5743 - val_loss: 0.0741
Epoch 43/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 793us/step - accuracy: 0.5669 - loss: 0.0742 - val_accuracy: 0.5767 - val_loss: 0.0736
Epoch 44/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 804us/step - accuracy: 0.5684 - loss: 0.0736 - val_accuracy: 0.5807 - val_loss: 0.0730
Epoch 45/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 865us/step - accuracy: 0.5733 - loss: 0.0731 - val_accuracy: 0.5843 - val_loss: 0.0725
Epoch 46/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 868us/step - accuracy: 0.5780 - loss: 0.0725 - val_accuracy: 0.5900 - val_loss: 0.0720
Epoch 47/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 834us/step - accuracy: 0.5784 - loss: 0.0722 - val_accuracy: 0.5937 - val_loss: 0.0714
Epoch 48/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 897us/step - accuracy: 0.5810 - loss: 0.0716 - val_accuracy: 0.5957 - val_loss: 0.0709
Epoch 49/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 908us/step - accuracy: 0.5852 - loss: 0.0710 - val_accuracy: 0.5989 - val_loss: 0.0704
Epoch 50/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 867us/step - accuracy: 0.5891 - loss: 0.0705 - val_accuracy: 0.6031 - val_loss: 0.0698
Epoch 51/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 877us/step - accuracy: 0.5936 - loss: 0.0699 - val_accuracy: 0.6062 - val_loss: 0.0693
Epoch 52/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 925us/step - accuracy: 0.5938 - loss: 0.0696 - val_accuracy: 0.6092 - val_loss: 0.0688
Epoch 53/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 973us/step - accuracy: 0.5974 - loss: 0.0690 - val_accuracy: 0.6109 - val_loss: 0.0682
Epoch 54/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 873us/step - accuracy: 0.6022 - loss: 0.0683 - val_accuracy: 0.6139 - val_loss: 0.0677
Epoch 55/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 953us/step - accuracy: 0.6052 - loss: 0.0679 - val_accuracy: 0.6179 - val_loss: 0.0672
Epoch 56/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 911us/step - accuracy: 0.6093 - loss: 0.0674 - val_accuracy: 0.6207 - val_loss: 0.0667
Epoch 57/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 874us/step - accuracy: 0.6134 - loss: 0.0669 - val_accuracy: 0.6244 - val_loss: 0.0662
Epoch 58/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 878us/step - accuracy: 0.6126 - loss: 0.0665 - val_accuracy: 0.6261 - val_loss: 0.0656
Epoch 59/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 837us/step - accuracy: 0.6177 - loss: 0.0659 - val_accuracy: 0.6289 - val_loss: 0.0651
Epoch 60/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 910us/step - accuracy: 0.6224 - loss: 0.0654 - val_accuracy: 0.6308 - val_loss: 0.0646
Epoch 61/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 842us/step - accuracy: 0.6295 - loss: 0.0647 - val_accuracy: 0.6336 - val_loss: 0.0641
Epoch 62/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - accuracy: 0.6281 - loss: 0.0644 - val_accuracy: 0.6363 - val_loss: 0.0636
Epoch 63/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.6307 - loss: 0.0638 - val_accuracy: 0.6413 - val_loss: 0.0631
Epoch 64/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 908us/step - accuracy: 0.6346 - loss: 0.0634 - val_accuracy: 0.6452 - val_loss: 0.0627
Epoch 65/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 796us/step - accuracy: 0.6368 - loss: 0.0630 - val_accuracy: 0.6493 - val_loss: 0.0622
Epoch 66/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 817us/step - accuracy: 0.6375 - loss: 0.0626 - val_accuracy: 0.6525 - val_loss: 0.0617
Epoch 67/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 895us/step - accuracy: 0.6433 - loss: 0.0622 - val_accuracy: 0.6561 - val_loss: 0.0612
Epoch 68/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 791us/step - accuracy: 0.6477 - loss: 0.0614 - val_accuracy: 0.6598 - val_loss: 0.0607
Epoch 69/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 910us/step - accuracy: 0.6497 - loss: 0.0612 - val_accuracy: 0.6647 - val_loss: 0.0603
Epoch 70/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 904us/step - accuracy: 0.6534 - loss: 0.0606 - val_accuracy: 0.6674 - val_loss: 0.0598
Epoch 71/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 727us/step - accuracy: 0.6596 - loss: 0.0601 - val_accuracy: 0.6695 - val_loss: 0.0594
Epoch 72/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 659us/step - accuracy: 0.6605 - loss: 0.0598 - val_accuracy: 0.6731 - val_loss: 0.0589
Epoch 73/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 732us/step - accuracy: 0.6656 - loss: 0.0591 - val_accuracy: 0.6770 - val_loss: 0.0584
Epoch 74/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 712us/step - accuracy: 0.6699 - loss: 0.0588 - val_accuracy: 0.6797 - val_loss: 0.0580
Epoch 75/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 769us/step - accuracy: 0.6747 - loss: 0.0583 - val_accuracy: 0.6829 - val_loss: 0.0576
Epoch 76/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 742us/step - accuracy: 0.6751 - loss: 0.0579 - val_accuracy: 0.6855 - val_loss: 0.0571
Epoch 77/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 740us/step - accuracy: 0.6758 - loss: 0.0576 - val_accuracy: 0.6883 - val_loss: 0.0567
Epoch 78/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 738us/step - accuracy: 0.6848 - loss: 0.0570 - val_accuracy: 0.6914 - val_loss: 0.0563
Epoch 79/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 804us/step - accuracy: 0.6872 - loss: 0.0564 - val_accuracy: 0.6949 - val_loss: 0.0558
Epoch 80/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 768us/step - accuracy: 0.6886 - loss: 0.0563 - val_accuracy: 0.6977 - val_loss: 0.0554
Epoch 81/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 765us/step - accuracy: 0.6933 - loss: 0.0557 - val_accuracy: 0.7008 - val_loss: 0.0550
Epoch 82/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 795us/step - accuracy: 0.6968 - loss: 0.0551 - val_accuracy: 0.7040 - val_loss: 0.0546
Epoch 83/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 798us/step - accuracy: 0.6965 - loss: 0.0551 - val_accuracy: 0.7077 - val_loss: 0.0542
Epoch 84/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 755us/step - accuracy: 0.7000 - loss: 0.0545 - val_accuracy: 0.7113 - val_loss: 0.0538
Epoch 85/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 782us/step - accuracy: 0.7028 - loss: 0.0542 - val_accuracy: 0.7132 - val_loss: 0.0534
Epoch 86/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 723us/step - accuracy: 0.7048 - loss: 0.0539 - val_accuracy: 0.7149 - val_loss: 0.0530
Epoch 87/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 788us/step - accuracy: 0.7078 - loss: 0.0534 - val_accuracy: 0.7172 - val_loss: 0.0526
Epoch 88/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 738us/step - accuracy: 0.7100 - loss: 0.0529 - val_accuracy: 0.7191 - val_loss: 0.0522
Epoch 89/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 780us/step - accuracy: 0.7132 - loss: 0.0526 - val_accuracy: 0.7200 - val_loss: 0.0518
Epoch 90/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 839us/step - accuracy: 0.7164 - loss: 0.0521 - val_accuracy: 0.7233 - val_loss: 0.0514
Epoch 91/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 709us/step - accuracy: 0.7173 - loss: 0.0517 - val_accuracy: 0.7254 - val_loss: 0.0510
Epoch 92/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 697us/step - accuracy: 0.7213 - loss: 0.0515 - val_accuracy: 0.7273 - val_loss: 0.0507
Epoch 93/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 675us/step - accuracy: 0.7231 - loss: 0.0510 - val_accuracy: 0.7297 - val_loss: 0.0503
Epoch 94/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 682us/step - accuracy: 0.7227 - loss: 0.0508 - val_accuracy: 0.7321 - val_loss: 0.0499
Epoch 95/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 753us/step - accuracy: 0.7235 - loss: 0.0506 - val_accuracy: 0.7350 - val_loss: 0.0496
Epoch 96/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 675us/step - accuracy: 0.7283 - loss: 0.0500 - val_accuracy: 0.7371 - val_loss: 0.0492
Epoch 97/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 670us/step - accuracy: 0.7300 - loss: 0.0496 - val_accuracy: 0.7382 - val_loss: 0.0488
Epoch 98/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 680us/step - accuracy: 0.7328 - loss: 0.0493 - val_accuracy: 0.7402 - val_loss: 0.0485
Epoch 99/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 702us/step - accuracy: 0.7338 - loss: 0.0491 - val_accuracy: 0.7416 - val_loss: 0.0481
Epoch 100/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 696us/step - accuracy: 0.7358 - loss: 0.0487 - val_accuracy: 0.7435 - val_loss: 0.0478
Epoch 101/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 703us/step - accuracy: 0.7375 - loss: 0.0483 - val_accuracy: 0.7453 - val_loss: 0.0475
Epoch 102/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 700us/step - accuracy: 0.7374 - loss: 0.0481 - val_accuracy: 0.7468 - val_loss: 0.0471
Epoch 103/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 759us/step - accuracy: 0.7400 - loss: 0.0477 - val_accuracy: 0.7483 - val_loss: 0.0468
Epoch 104/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 707us/step - accuracy: 0.7412 - loss: 0.0475 - val_accuracy: 0.7502 - val_loss: 0.0465
Epoch 105/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 711us/step - accuracy: 0.7424 - loss: 0.0472 - val_accuracy: 0.7516 - val_loss: 0.0461
Epoch 106/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 761us/step - accuracy: 0.7455 - loss: 0.0467 - val_accuracy: 0.7539 - val_loss: 0.0458
Epoch 107/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 718us/step - accuracy: 0.7485 - loss: 0.0463 - val_accuracy: 0.7560 - val_loss: 0.0455
Epoch 108/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 745us/step - accuracy: 0.7490 - loss: 0.0460 - val_accuracy: 0.7588 - val_loss: 0.0452
Epoch 109/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 782us/step - accuracy: 0.7521 - loss: 0.0456 - val_accuracy: 0.7607 - val_loss: 0.0449
Epoch 110/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 796us/step - accuracy: 0.7542 - loss: 0.0451 - val_accuracy: 0.7621 - val_loss: 0.0446
Epoch 111/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 751us/step - accuracy: 0.7558 - loss: 0.0449 - val_accuracy: 0.7635 - val_loss: 0.0443
Epoch 112/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 768us/step - accuracy: 0.7568 - loss: 0.0446 - val_accuracy: 0.7658 - val_loss: 0.0439
Epoch 113/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 848us/step - accuracy: 0.7598 - loss: 0.0443 - val_accuracy: 0.7676 - val_loss: 0.0436
Epoch 114/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 789us/step - accuracy: 0.7588 - loss: 0.0443 - val_accuracy: 0.7697 - val_loss: 0.0433
Epoch 115/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 811us/step - accuracy: 0.7617 - loss: 0.0440 - val_accuracy: 0.7727 - val_loss: 0.0431
Epoch 116/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 867us/step - accuracy: 0.7634 - loss: 0.0437 - val_accuracy: 0.7746 - val_loss: 0.0428
Epoch 117/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 834us/step - accuracy: 0.7650 - loss: 0.0434 - val_accuracy: 0.7770 - val_loss: 0.0425
Epoch 118/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 729us/step - accuracy: 0.7706 - loss: 0.0429 - val_accuracy: 0.7792 - val_loss: 0.0422
Epoch 119/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 676us/step - accuracy: 0.7693 - loss: 0.0428 - val_accuracy: 0.7817 - val_loss: 0.0419
Epoch 120/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 742us/step - accuracy: 0.7732 - loss: 0.0424 - val_accuracy: 0.7841 - val_loss: 0.0416
Epoch 121/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 700us/step - accuracy: 0.7724 - loss: 0.0422 - val_accuracy: 0.7864 - val_loss: 0.0414
Epoch 122/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 705us/step - accuracy: 0.7760 - loss: 0.0420 - val_accuracy: 0.7890 - val_loss: 0.0411
Epoch 123/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 685us/step - accuracy: 0.7797 - loss: 0.0416 - val_accuracy: 0.7911 - val_loss: 0.0408
Epoch 124/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 791us/step - accuracy: 0.7798 - loss: 0.0414 - val_accuracy: 0.7927 - val_loss: 0.0405
Epoch 125/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 707us/step - accuracy: 0.7831 - loss: 0.0411 - val_accuracy: 0.7951 - val_loss: 0.0403
Epoch 126/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 659us/step - accuracy: 0.7845 - loss: 0.0410 - val_accuracy: 0.7968 - val_loss: 0.0400
Epoch 127/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 768us/step - accuracy: 0.7861 - loss: 0.0407 - val_accuracy: 0.7983 - val_loss: 0.0398
Epoch 128/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 754us/step - accuracy: 0.7894 - loss: 0.0404 - val_accuracy: 0.8005 - val_loss: 0.0395
Epoch 129/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 742us/step - accuracy: 0.7918 - loss: 0.0402 - val_accuracy: 0.8016 - val_loss: 0.0392
Epoch 130/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 775us/step - accuracy: 0.7946 - loss: 0.0399 - val_accuracy: 0.8046 - val_loss: 0.0390
Epoch 131/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 832us/step - accuracy: 0.7928 - loss: 0.0398 - val_accuracy: 0.8067 - val_loss: 0.0387
Epoch 132/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 775us/step - accuracy: 0.7974 - loss: 0.0394 - val_accuracy: 0.8080 - val_loss: 0.0385
Epoch 133/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 669us/step - accuracy: 0.7985 - loss: 0.0392 - val_accuracy: 0.8103 - val_loss: 0.0383
Epoch 134/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 829us/step - accuracy: 0.8031 - loss: 0.0387 - val_accuracy: 0.8119 - val_loss: 0.0380
Epoch 135/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 696us/step - accuracy: 0.8024 - loss: 0.0386 - val_accuracy: 0.8138 - val_loss: 0.0378
Epoch 136/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 796us/step - accuracy: 0.8035 - loss: 0.0385 - val_accuracy: 0.8158 - val_loss: 0.0375
Epoch 137/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 857us/step - accuracy: 0.8061 - loss: 0.0382 - val_accuracy: 0.8171 - val_loss: 0.0373
Epoch 138/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 811us/step - accuracy: 0.8057 - loss: 0.0381 - val_accuracy: 0.8193 - val_loss: 0.0371
Epoch 139/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 755us/step - accuracy: 0.8090 - loss: 0.0377 - val_accuracy: 0.8201 - val_loss: 0.0369
Epoch 140/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 863us/step - accuracy: 0.8108 - loss: 0.0377 - val_accuracy: 0.8212 - val_loss: 0.0366
Epoch 141/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 735us/step - accuracy: 0.8104 - loss: 0.0373 - val_accuracy: 0.8225 - val_loss: 0.0364
Epoch 142/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 723us/step - accuracy: 0.8155 - loss: 0.0369 - val_accuracy: 0.8236 - val_loss: 0.0362
Epoch 143/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 711us/step - accuracy: 0.8163 - loss: 0.0367 - val_accuracy: 0.8250 - val_loss: 0.0360
Epoch 144/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 872us/step - accuracy: 0.8165 - loss: 0.0368 - val_accuracy: 0.8258 - val_loss: 0.0358
Epoch 145/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 831us/step - accuracy: 0.8207 - loss: 0.0362 - val_accuracy: 0.8275 - val_loss: 0.0355
Epoch 146/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 717us/step - accuracy: 0.8186 - loss: 0.0363 - val_accuracy: 0.8287 - val_loss: 0.0353
Epoch 147/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 787us/step - accuracy: 0.8209 - loss: 0.0361 - val_accuracy: 0.8297 - val_loss: 0.0351
Epoch 148/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 728us/step - accuracy: 0.8207 - loss: 0.0360 - val_accuracy: 0.8306 - val_loss: 0.0349
Epoch 149/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 749us/step - accuracy: 0.8244 - loss: 0.0356 - val_accuracy: 0.8316 - val_loss: 0.0347
Epoch 150/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 805us/step - accuracy: 0.8228 - loss: 0.0356 - val_accuracy: 0.8320 - val_loss: 0.0345
Epoch 151/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 741us/step - accuracy: 0.8252 - loss: 0.0350 - val_accuracy: 0.8331 - val_loss: 0.0343
Epoch 152/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 767us/step - accuracy: 0.8275 - loss: 0.0349 - val_accuracy: 0.8344 - val_loss: 0.0341
Epoch 153/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 874us/step - accuracy: 0.8277 - loss: 0.0348 - val_accuracy: 0.8353 - val_loss: 0.0339
Epoch 154/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 815us/step - accuracy: 0.8269 - loss: 0.0349 - val_accuracy: 0.8365 - val_loss: 0.0337
Epoch 155/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 795us/step - accuracy: 0.8280 - loss: 0.0346 - val_accuracy: 0.8376 - val_loss: 0.0335
Epoch 156/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 859us/step - accuracy: 0.8330 - loss: 0.0344 - val_accuracy: 0.8392 - val_loss: 0.0334
Epoch 157/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 818us/step - accuracy: 0.8307 - loss: 0.0341 - val_accuracy: 0.8405 - val_loss: 0.0332
Epoch 158/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 859us/step - accuracy: 0.8341 - loss: 0.0337 - val_accuracy: 0.8414 - val_loss: 0.0330
Epoch 159/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 817us/step - accuracy: 0.8358 - loss: 0.0336 - val_accuracy: 0.8420 - val_loss: 0.0328
Epoch 160/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 882us/step - accuracy: 0.8338 - loss: 0.0337 - val_accuracy: 0.8421 - val_loss: 0.0326
Epoch 161/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 827us/step - accuracy: 0.8344 - loss: 0.0334 - val_accuracy: 0.8429 - val_loss: 0.0325
Epoch 162/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 817us/step - accuracy: 0.8372 - loss: 0.0330 - val_accuracy: 0.8439 - val_loss: 0.0323
Epoch 163/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 703us/step - accuracy: 0.8363 - loss: 0.0329 - val_accuracy: 0.8444 - val_loss: 0.0321
Epoch 164/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 762us/step - accuracy: 0.8368 - loss: 0.0329 - val_accuracy: 0.8450 - val_loss: 0.0319
Epoch 165/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 714us/step - accuracy: 0.8373 - loss: 0.0327 - val_accuracy: 0.8461 - val_loss: 0.0318
Epoch 166/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 710us/step - accuracy: 0.8380 - loss: 0.0326 - val_accuracy: 0.8468 - val_loss: 0.0316
Epoch 167/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 782us/step - accuracy: 0.8398 - loss: 0.0325 - val_accuracy: 0.8476 - val_loss: 0.0315
Epoch 168/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 762us/step - accuracy: 0.8409 - loss: 0.0322 - val_accuracy: 0.8486 - val_loss: 0.0313
Epoch 169/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 696us/step - accuracy: 0.8406 - loss: 0.0321 - val_accuracy: 0.8493 - val_loss: 0.0311
Epoch 170/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 750us/step - accuracy: 0.8407 - loss: 0.0320 - val_accuracy: 0.8499 - val_loss: 0.0310
Epoch 171/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 799us/step - accuracy: 0.8438 - loss: 0.0317 - val_accuracy: 0.8507 - val_loss: 0.0308
Epoch 172/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 756us/step - accuracy: 0.8417 - loss: 0.0317 - val_accuracy: 0.8514 - val_loss: 0.0307
Epoch 173/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 740us/step - accuracy: 0.8441 - loss: 0.0314 - val_accuracy: 0.8520 - val_loss: 0.0305
Epoch 174/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 760us/step - accuracy: 0.8424 - loss: 0.0315 - val_accuracy: 0.8529 - val_loss: 0.0304
Epoch 175/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 750us/step - accuracy: 0.8462 - loss: 0.0312 - val_accuracy: 0.8542 - val_loss: 0.0302
Epoch 176/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 732us/step - accuracy: 0.8447 - loss: 0.0312 - val_accuracy: 0.8546 - val_loss: 0.0301
Epoch 177/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 759us/step - accuracy: 0.8468 - loss: 0.0308 - val_accuracy: 0.8550 - val_loss: 0.0299
Epoch 178/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 705us/step - accuracy: 0.8481 - loss: 0.0306 - val_accuracy: 0.8553 - val_loss: 0.0298
Epoch 179/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 678us/step - accuracy: 0.8475 - loss: 0.0306 - val_accuracy: 0.8557 - val_loss: 0.0296
Epoch 180/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 724us/step - accuracy: 0.8465 - loss: 0.0307 - val_accuracy: 0.8565 - val_loss: 0.0295
Epoch 181/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 722us/step - accuracy: 0.8505 - loss: 0.0302 - val_accuracy: 0.8571 - val_loss: 0.0294
Epoch 182/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 729us/step - accuracy: 0.8495 - loss: 0.0302 - val_accuracy: 0.8575 - val_loss: 0.0292
Epoch 183/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 750us/step - accuracy: 0.8505 - loss: 0.0300 - val_accuracy: 0.8579 - val_loss: 0.0291
Epoch 184/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 766us/step - accuracy: 0.8497 - loss: 0.0300 - val_accuracy: 0.8583 - val_loss: 0.0290
Epoch 185/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 753us/step - accuracy: 0.8524 - loss: 0.0297 - val_accuracy: 0.8589 - val_loss: 0.0288
Epoch 186/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 772us/step - accuracy: 0.8520 - loss: 0.0297 - val_accuracy: 0.8594 - val_loss: 0.0287
Epoch 187/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 740us/step - accuracy: 0.8503 - loss: 0.0297 - val_accuracy: 0.8596 - val_loss: 0.0286
Epoch 188/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 697us/step - accuracy: 0.8539 - loss: 0.0293 - val_accuracy: 0.8606 - val_loss: 0.0284
Epoch 189/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 818us/step - accuracy: 0.8537 - loss: 0.0291 - val_accuracy: 0.8613 - val_loss: 0.0283
Epoch 190/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 661us/step - accuracy: 0.8506 - loss: 0.0295 - val_accuracy: 0.8617 - val_loss: 0.0282
Epoch 191/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 709us/step - accuracy: 0.8535 - loss: 0.0292 - val_accuracy: 0.8625 - val_loss: 0.0281
Epoch 192/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 779us/step - accuracy: 0.8552 - loss: 0.0289 - val_accuracy: 0.8627 - val_loss: 0.0279
Epoch 193/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 784us/step - accuracy: 0.8553 - loss: 0.0287 - val_accuracy: 0.8634 - val_loss: 0.0278
Epoch 194/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 761us/step - accuracy: 0.8543 - loss: 0.0287 - val_accuracy: 0.8642 - val_loss: 0.0277
Epoch 195/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 896us/step - accuracy: 0.8547 - loss: 0.0287 - val_accuracy: 0.8647 - val_loss: 0.0276
Epoch 196/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 810us/step - accuracy: 0.8526 - loss: 0.0287 - val_accuracy: 0.8647 - val_loss: 0.0275
Epoch 197/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 882us/step - accuracy: 0.8550 - loss: 0.0283 - val_accuracy: 0.8646 - val_loss: 0.0274
Epoch 198/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 844us/step - accuracy: 0.8567 - loss: 0.0284 - val_accuracy: 0.8653 - val_loss: 0.0273
Epoch 199/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 726us/step - accuracy: 0.8578 - loss: 0.0280 - val_accuracy: 0.8657 - val_loss: 0.0271
Epoch 200/200
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 904us/step - accuracy: 0.8595 - loss: 0.0278 - val_accuracy: 0.8662 - val_loss: 0.0270
Out[6]:
<keras.src.callbacks.history.History at 0x14f329790>

Оценка качества простой модели

Лучшее качество модели: 86.6 %

In [7]:
simple_model.evaluate(X_valid, y_valid)
313/313 ━━━━━━━━━━━━━━━━━━━━ 0s 850us/step - accuracy: 0.8494 - loss: 0.0299
Out[7]:
[0.027035443112254143, 0.8661999702453613]

Проектирование архитектуры более сложной ИНС

Добавлен дополнительный скрытый полносвязный слой

Все скрытые слои используют ReLU-нейроны

In [8]:
difficult_model = Sequential()
difficult_model.add(InputLayer(shape=(28 * 28,)))
difficult_model.add(Dense(64, activation="relu"))
difficult_model.add(Dense(64, activation="relu"))
difficult_model.add(Dense(10, activation="softmax"))
difficult_model.summary()
Model: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                     Output Shape                  Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense_2 (Dense)                 │ (None, 64)             │        50,240 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_3 (Dense)                 │ (None, 64)             │         4,160 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_4 (Dense)                 │ (None, 10)             │           650 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 55,050 (215.04 KB)
 Trainable params: 55,050 (215.04 KB)
 Non-trainable params: 0 (0.00 B)

Обучение более сложной модели

Функция стоимости изменена на перекрестную энтропию (лучше подходит для классификации)

Количество эпох уменьшено с 200 до 20

In [9]:
difficult_model.compile(
    loss="categorical_crossentropy",
    optimizer=SGD(learning_rate=0.1),
    metrics=["accuracy"],
)

difficult_model.fit(
    X_train,
    y_train,
    batch_size=128,
    epochs=20,
    validation_data=(X_valid, y_valid),
)
Epoch 1/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.7680 - loss: 0.8001 - val_accuracy: 0.9225 - val_loss: 0.2617
Epoch 2/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 922us/step - accuracy: 0.9279 - loss: 0.2443 - val_accuracy: 0.9413 - val_loss: 0.2026
Epoch 3/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9458 - loss: 0.1841 - val_accuracy: 0.9488 - val_loss: 0.1680
Epoch 4/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 897us/step - accuracy: 0.9555 - loss: 0.1511 - val_accuracy: 0.9585 - val_loss: 0.1303
Epoch 5/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 853us/step - accuracy: 0.9614 - loss: 0.1277 - val_accuracy: 0.9583 - val_loss: 0.1377
Epoch 6/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 765us/step - accuracy: 0.9669 - loss: 0.1110 - val_accuracy: 0.9658 - val_loss: 0.1079
Epoch 7/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 759us/step - accuracy: 0.9722 - loss: 0.0937 - val_accuracy: 0.9691 - val_loss: 0.0995
Epoch 8/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 879us/step - accuracy: 0.9745 - loss: 0.0850 - val_accuracy: 0.9654 - val_loss: 0.1110
Epoch 9/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 840us/step - accuracy: 0.9774 - loss: 0.0783 - val_accuracy: 0.9661 - val_loss: 0.1048
Epoch 10/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 668us/step - accuracy: 0.9790 - loss: 0.0701 - val_accuracy: 0.9700 - val_loss: 0.0961
Epoch 11/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 832us/step - accuracy: 0.9817 - loss: 0.0636 - val_accuracy: 0.9716 - val_loss: 0.0902
Epoch 12/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 774us/step - accuracy: 0.9839 - loss: 0.0562 - val_accuracy: 0.9738 - val_loss: 0.0833
Epoch 13/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 759us/step - accuracy: 0.9846 - loss: 0.0544 - val_accuracy: 0.9748 - val_loss: 0.0822
Epoch 14/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 662us/step - accuracy: 0.9856 - loss: 0.0487 - val_accuracy: 0.9733 - val_loss: 0.0842
Epoch 15/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 701us/step - accuracy: 0.9879 - loss: 0.0454 - val_accuracy: 0.9741 - val_loss: 0.0840
Epoch 16/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 678us/step - accuracy: 0.9873 - loss: 0.0414 - val_accuracy: 0.9738 - val_loss: 0.0861
Epoch 17/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 700us/step - accuracy: 0.9886 - loss: 0.0384 - val_accuracy: 0.9742 - val_loss: 0.0827
Epoch 18/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 668us/step - accuracy: 0.9895 - loss: 0.0363 - val_accuracy: 0.9745 - val_loss: 0.0813
Epoch 19/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 651us/step - accuracy: 0.9901 - loss: 0.0335 - val_accuracy: 0.9761 - val_loss: 0.0777
Epoch 20/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 0s 649us/step - accuracy: 0.9922 - loss: 0.0304 - val_accuracy: 0.9737 - val_loss: 0.0894
Out[9]:
<keras.src.callbacks.history.History at 0x14fb49be0>

Оценка качества более сложной модели

Лучшее качество модели: 97.4 %

При этом количество эпох обучения значительно сократилось (с 200 до 20).

In [10]:
difficult_model.evaluate(X_valid, y_valid)
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9689 - loss: 0.1073
Out[10]:
[0.08943505585193634, 0.9736999869346619]

Проектирование архитектуры глубокой ИНС

В ИНС теперь три скрытых полносвязных слоя с ReLU-нейронами

Для выходов каждого скрытого слоя используется пакетная нормализация

Для последнего скрытого слоя применяется прореживание, при котором отключается 20 % случайных нейронов

Keras автоматически корректирует значения (умножает входы на 0.8)

In [11]:
from keras.api.layers import Dropout
from keras.api.layers import BatchNormalization

deep_model = Sequential()
deep_model.add(InputLayer(shape=(28 * 28,)))
deep_model.add(Dense(64, activation="relu"))
deep_model.add(BatchNormalization())
deep_model.add(Dense(64, activation="relu"))
deep_model.add(BatchNormalization())
deep_model.add(Dense(64, activation="relu"))
deep_model.add(BatchNormalization())
deep_model.add(Dropout(0.2))
deep_model.add(Dense(10, activation="softmax"))
deep_model.summary()
Model: "sequential_2"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                     Output Shape                  Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense_5 (Dense)                 │ (None, 64)             │        50,240 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ batch_normalization             │ (None, 64)             │           256 │
│ (BatchNormalization)            │                        │               │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_6 (Dense)                 │ (None, 64)             │         4,160 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ batch_normalization_1           │ (None, 64)             │           256 │
│ (BatchNormalization)            │                        │               │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_7 (Dense)                 │ (None, 64)             │         4,160 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ batch_normalization_2           │ (None, 64)             │           256 │
│ (BatchNormalization)            │                        │               │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout (Dropout)               │ (None, 64)             │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_8 (Dense)                 │ (None, 10)             │           650 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 59,978 (234.29 KB)
 Trainable params: 59,594 (232.79 KB)
 Non-trainable params: 384 (1.50 KB)

Обучение глубокой модели

Вместо SGD используется оптимизатор Adam

In [12]:
deep_model.compile(
    loss="categorical_crossentropy",
    optimizer="adam",
    metrics=["accuracy"],
)

deep_model.fit(
    X_train,
    y_train,
    batch_size=128,
    epochs=20,
    validation_data=(X_valid, y_valid),
)
Epoch 1/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 2s 4ms/step - accuracy: 0.7737 - loss: 0.7278 - val_accuracy: 0.9490 - val_loss: 0.1610
Epoch 2/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9508 - loss: 0.1621 - val_accuracy: 0.9622 - val_loss: 0.1260
Epoch 3/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9643 - loss: 0.1164 - val_accuracy: 0.9659 - val_loss: 0.1077
Epoch 4/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9716 - loss: 0.0913 - val_accuracy: 0.9672 - val_loss: 0.1038
Epoch 5/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9770 - loss: 0.0773 - val_accuracy: 0.9717 - val_loss: 0.0893
Epoch 6/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9801 - loss: 0.0647 - val_accuracy: 0.9714 - val_loss: 0.0937
Epoch 7/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9806 - loss: 0.0597 - val_accuracy: 0.9731 - val_loss: 0.0951
Epoch 8/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9836 - loss: 0.0527 - val_accuracy: 0.9709 - val_loss: 0.0981
Epoch 9/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9841 - loss: 0.0472 - val_accuracy: 0.9706 - val_loss: 0.0941
Epoch 10/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9869 - loss: 0.0405 - val_accuracy: 0.9733 - val_loss: 0.0916
Epoch 11/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9874 - loss: 0.0385 - val_accuracy: 0.9733 - val_loss: 0.0943
Epoch 12/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9879 - loss: 0.0363 - val_accuracy: 0.9738 - val_loss: 0.0953
Epoch 13/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9885 - loss: 0.0328 - val_accuracy: 0.9749 - val_loss: 0.0926
Epoch 14/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9898 - loss: 0.0313 - val_accuracy: 0.9741 - val_loss: 0.0953
Epoch 15/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9903 - loss: 0.0296 - val_accuracy: 0.9729 - val_loss: 0.0987
Epoch 16/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9914 - loss: 0.0251 - val_accuracy: 0.9744 - val_loss: 0.0936
Epoch 17/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9911 - loss: 0.0256 - val_accuracy: 0.9737 - val_loss: 0.1036
Epoch 18/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9916 - loss: 0.0254 - val_accuracy: 0.9742 - val_loss: 0.0942
Epoch 19/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9910 - loss: 0.0247 - val_accuracy: 0.9713 - val_loss: 0.1125
Epoch 20/20
469/469 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9926 - loss: 0.0240 - val_accuracy: 0.9731 - val_loss: 0.1057
Out[12]:
<keras.src.callbacks.history.History at 0x169167d70>

Оценка качества глубокой модели

Лучшее качество модели: 97.3 %

Качество модели незначительно улучшилось за счет улучшения архитектуры сети и смены оптимизатора

In [13]:
deep_model.evaluate(X_valid, y_valid)
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 1ms/step - accuracy: 0.9674 - loss: 0.1266
Out[13]:
[0.10574997216463089, 0.9731000065803528]

Регрессия

Загрузка данных для задачи регрессии

Набор данных о жилье в Бостоне собран Службой переписи населения США.

Входные признаки:

  • CRIM — уровень преступности на душу населения по районам;
  • ZN — доля жилых земель, отведенных под участки площадью более 25 000 кв. футов;
  • INDUS — доля неторговых акров в городе;
  • CHAS — 1, если участок граничит с рекой; 0 в противном случае;
  • NOX — концентрация оксидов азота;
  • RM — среднее количество комнат в помещении;
  • AGE — доля домов, построенных до 1940 года;
  • DIS — взвешенные расстояния до пяти центров занятости Бостона;
  • RAD — индекс доступности радиальных автомагистралей;
  • TAX — ставка налога на имущество на полную стоимость;
  • PTRATIO — соотношение учеников и учителей по районам;
  • B — доля чернокожих по районам;
  • LSTAT — % населения с более низким статусом.

Целевой признак:

  • MEDV — медианная стоимость домов в тысячах долларов США.

Данные уже предобработаны

In [14]:
from keras.api.datasets import boston_housing

(X_train, y_train), (X_valid, y_valid) = boston_housing.load_data()

display(X_train)
display(y_train)
array([[1.23247e+00, 0.00000e+00, 8.14000e+00, ..., 2.10000e+01,
        3.96900e+02, 1.87200e+01],
       [2.17700e-02, 8.25000e+01, 2.03000e+00, ..., 1.47000e+01,
        3.95380e+02, 3.11000e+00],
       [4.89822e+00, 0.00000e+00, 1.81000e+01, ..., 2.02000e+01,
        3.75520e+02, 3.26000e+00],
       ...,
       [3.46600e-02, 3.50000e+01, 6.06000e+00, ..., 1.69000e+01,
        3.62250e+02, 7.83000e+00],
       [2.14918e+00, 0.00000e+00, 1.95800e+01, ..., 1.47000e+01,
        2.61950e+02, 1.57900e+01],
       [1.43900e-02, 6.00000e+01, 2.93000e+00, ..., 1.56000e+01,
        3.76700e+02, 4.38000e+00]])
array([15.2, 42.3, 50. , 21.1, 17.7, 18.5, 11.3, 15.6, 15.6, 14.4, 12.1,
       17.9, 23.1, 19.9, 15.7,  8.8, 50. , 22.5, 24.1, 27.5, 10.9, 30.8,
       32.9, 24. , 18.5, 13.3, 22.9, 34.7, 16.6, 17.5, 22.3, 16.1, 14.9,
       23.1, 34.9, 25. , 13.9, 13.1, 20.4, 20. , 15.2, 24.7, 22.2, 16.7,
       12.7, 15.6, 18.4, 21. , 30.1, 15.1, 18.7,  9.6, 31.5, 24.8, 19.1,
       22. , 14.5, 11. , 32. , 29.4, 20.3, 24.4, 14.6, 19.5, 14.1, 14.3,
       15.6, 10.5,  6.3, 19.3, 19.3, 13.4, 36.4, 17.8, 13.5, 16.5,  8.3,
       14.3, 16. , 13.4, 28.6, 43.5, 20.2, 22. , 23. , 20.7, 12.5, 48.5,
       14.6, 13.4, 23.7, 50. , 21.7, 39.8, 38.7, 22.2, 34.9, 22.5, 31.1,
       28.7, 46. , 41.7, 21. , 26.6, 15. , 24.4, 13.3, 21.2, 11.7, 21.7,
       19.4, 50. , 22.8, 19.7, 24.7, 36.2, 14.2, 18.9, 18.3, 20.6, 24.6,
       18.2,  8.7, 44. , 10.4, 13.2, 21.2, 37. , 30.7, 22.9, 20. , 19.3,
       31.7, 32. , 23.1, 18.8, 10.9, 50. , 19.6,  5. , 14.4, 19.8, 13.8,
       19.6, 23.9, 24.5, 25. , 19.9, 17.2, 24.6, 13.5, 26.6, 21.4, 11.9,
       22.6, 19.6,  8.5, 23.7, 23.1, 22.4, 20.5, 23.6, 18.4, 35.2, 23.1,
       27.9, 20.6, 23.7, 28. , 13.6, 27.1, 23.6, 20.6, 18.2, 21.7, 17.1,
        8.4, 25.3, 13.8, 22.2, 18.4, 20.7, 31.6, 30.5, 20.3,  8.8, 19.2,
       19.4, 23.1, 23. , 14.8, 48.8, 22.6, 33.4, 21.1, 13.6, 32.2, 13.1,
       23.4, 18.9, 23.9, 11.8, 23.3, 22.8, 19.6, 16.7, 13.4, 22.2, 20.4,
       21.8, 26.4, 14.9, 24.1, 23.8, 12.3, 29.1, 21. , 19.5, 23.3, 23.8,
       17.8, 11.5, 21.7, 19.9, 25. , 33.4, 28.5, 21.4, 24.3, 27.5, 33.1,
       16.2, 23.3, 48.3, 22.9, 22.8, 13.1, 12.7, 22.6, 15. , 15.3, 10.5,
       24. , 18.5, 21.7, 19.5, 33.2, 23.2,  5. , 19.1, 12.7, 22.3, 10.2,
       13.9, 16.3, 17. , 20.1, 29.9, 17.2, 37.3, 45.4, 17.8, 23.2, 29. ,
       22. , 18. , 17.4, 34.6, 20.1, 25. , 15.6, 24.8, 28.2, 21.2, 21.4,
       23.8, 31. , 26.2, 17.4, 37.9, 17.5, 20. ,  8.3, 23.9,  8.4, 13.8,
        7.2, 11.7, 17.1, 21.6, 50. , 16.1, 20.4, 20.6, 21.4, 20.6, 36.5,
        8.5, 24.8, 10.8, 21.9, 17.3, 18.9, 36.2, 14.9, 18.2, 33.3, 21.8,
       19.7, 31.6, 24.8, 19.4, 22.8,  7.5, 44.8, 16.8, 18.7, 50. , 50. ,
       19.5, 20.1, 50. , 17.2, 20.8, 19.3, 41.3, 20.4, 20.5, 13.8, 16.5,
       23.9, 20.6, 31.5, 23.3, 16.8, 14. , 33.8, 36.1, 12.8, 18.3, 18.7,
       19.1, 29. , 30.1, 50. , 50. , 22. , 11.9, 37.6, 50. , 22.7, 20.8,
       23.5, 27.9, 50. , 19.3, 23.9, 22.6, 15.2, 21.7, 19.2, 43.8, 20.3,
       33.2, 19.9, 22.5, 32.7, 22. , 17.1, 19. , 15. , 16.1, 25.1, 23.7,
       28.7, 37.2, 22.6, 16.4, 25. , 29.8, 22.1, 17.4, 18.1, 30.3, 17.5,
       24.7, 12.6, 26.5, 28.7, 13.3, 10.4, 24.4, 23. , 20. , 17.8,  7. ,
       11.8, 24.4, 13.8, 19.4, 25.2, 19.4, 19.4, 29.1])

Проектирование ИНС для задачи регрессии

Для решения задачи регрессии в выходном слое используются нейроны с линейной функцией активации

Создавать более сложную архитектуру не имеет смысла, так как в наборе данных мало признаков

In [15]:
reg_model = Sequential()
reg_model.add(InputLayer(shape=(13,)))
reg_model.add(Dense(32, activation="relu"))
reg_model.add(BatchNormalization())
reg_model.add(Dense(16, activation="relu"))
reg_model.add(BatchNormalization())
reg_model.add(Dropout(0.2))
reg_model.add(Dense(1, activation="linear"))
reg_model.summary()
Model: "sequential_3"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                     Output Shape                  Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense_9 (Dense)                 │ (None, 32)             │           448 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ batch_normalization_3           │ (None, 32)             │           128 │
│ (BatchNormalization)            │                        │               │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_10 (Dense)                │ (None, 16)             │           528 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ batch_normalization_4           │ (None, 16)             │            64 │
│ (BatchNormalization)            │                        │               │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_1 (Dropout)             │ (None, 16)             │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_11 (Dense)                │ (None, 1)              │            17 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 1,185 (4.63 KB)
 Trainable params: 1,089 (4.25 KB)
 Non-trainable params: 96 (384.00 B)

Обучение модели для регрессии

Функция стоимости: MSE (лучше подходит для задачи регрессии)

In [16]:
reg_model.compile(
    loss="mean_squared_error",
    optimizer="adam",
)

reg_model.fit(
    X_train,
    y_train,
    batch_size=8,
    epochs=32,
    validation_data=(X_valid, y_valid),
)
Epoch 1/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 1s 16ms/step - loss: 601.7983 - val_loss: 533.4313
Epoch 2/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 406us/step - loss: 565.4746 - val_loss: 511.8965
Epoch 3/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 387us/step - loss: 546.8860 - val_loss: 498.2231
Epoch 4/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 589us/step - loss: 508.6799 - val_loss: 477.7539
Epoch 5/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 499us/step - loss: 459.7863 - val_loss: 449.6629
Epoch 6/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 620us/step - loss: 443.5108 - val_loss: 440.0035
Epoch 7/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 533us/step - loss: 411.8610 - val_loss: 433.9403
Epoch 8/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 483us/step - loss: 401.8837 - val_loss: 403.7916
Epoch 9/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 442us/step - loss: 327.4671 - val_loss: 336.9683
Epoch 10/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 456us/step - loss: 294.0855 - val_loss: 307.6475
Epoch 11/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 366us/step - loss: 263.6659 - val_loss: 284.4071
Epoch 12/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 347us/step - loss: 271.5737 - val_loss: 212.2185
Epoch 13/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 819us/step - loss: 191.6893 - val_loss: 262.1397
Epoch 14/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 351us/step - loss: 146.1058 - val_loss: 190.2726
Epoch 15/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 351us/step - loss: 140.3470 - val_loss: 107.0253
Epoch 16/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 344us/step - loss: 112.8817 - val_loss: 44.3060
Epoch 17/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 318us/step - loss: 97.8928 - val_loss: 94.4347
Epoch 18/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 325us/step - loss: 69.6717 - val_loss: 47.5913
Epoch 19/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 336us/step - loss: 77.6726 - val_loss: 31.8441
Epoch 20/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 342us/step - loss: 59.1488 - val_loss: 63.5918
Epoch 21/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 321us/step - loss: 58.7572 - val_loss: 48.5345
Epoch 22/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 342us/step - loss: 52.5399 - val_loss: 38.4719
Epoch 23/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 328us/step - loss: 50.7571 - val_loss: 34.1380
Epoch 24/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 366us/step - loss: 48.0917 - val_loss: 48.2067
Epoch 25/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 372us/step - loss: 40.9145 - val_loss: 26.2381
Epoch 26/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 352us/step - loss: 57.9949 - val_loss: 23.5171
Epoch 27/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 376us/step - loss: 45.4554 - val_loss: 39.4339
Epoch 28/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 361us/step - loss: 43.5602 - val_loss: 61.3742
Epoch 29/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 372us/step - loss: 46.8815 - val_loss: 42.7337
Epoch 30/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 373us/step - loss: 44.2500 - val_loss: 33.6492
Epoch 31/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 381us/step - loss: 36.4661 - val_loss: 29.0794
Epoch 32/32
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 386us/step - loss: 44.0898 - val_loss: 19.0642
Out[16]:
<keras.src.callbacks.history.History at 0x16e8fb470>

Оценка качества модели для регрессии

Средняя ошибка на тестовой выборке: 19.1 тысячи долларов

In [17]:
import numpy as np

y_hat = reg_model.predict(np.reshape(X_valid[42], [1, 13]))
display(y_hat[0][0])
display(y_valid[42])
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 84ms/step
17.616888
14.1