Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

511 KiB

1) В среде Google Colab создать новый блокнот (notebook). Импортировать необходимые для работы библиотеки и модули.

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
current_directory = os.getcwd()
print("Текущая директория:", current_directory)
Текущая директория: /content/drive/MyDrive/Colab Notebooks
# импорт модулей
from tensorflow import keras
import matplotlib.pyplot as plt
import numpy as np
import sklearn

2) Загрузить набор данных MNIST, содержащий размеченные изображения рукописных цифр.

# загрузка датасета
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()

3) Разбить набор данных на обучающие и тестовые данные в соотношении 60 000:10 000 элементов. При разбиении параметр random_state выбрать равным (4k – 1), где k - номер бригады, k = 6 => random_state = 23

# создание своего разбиения датасета
from sklearn.model_selection import train_test_split

# объединяем в один набор
X = np.concatenate((X_train, X_test))
y = np.concatenate((y_train, y_test))

# разбиваем по вариантам
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    test_size = 10000,
                                                    train_size = 60000,
                                                    random_state = 23)
# вывод размерностей
print('Shape of X train:', X_train.shape)
print('Shape of y train:', y_train.shape)
print('Shape of X test:', X_test.shape)
print('Shape of y test:', y_test.shape)
Shape of X train: (60000, 28, 28)
Shape of y train: (60000,)
Shape of X test: (10000, 28, 28)
Shape of y test: (10000,)

4) Вывести первые 4 элемента обучающих данных (изображения и метки цифр).

# вывод изображения
for i in range(4):
  plt.imshow(X_train[i], cmap=plt.get_cmap('gray'))
  plt.show()
  # вывод метки для этого изображения
  print(y_train[i])

6

4

4
Exception ignored in: <function _xla_gc_callback at 0x7d7da4828ae0>
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/dist-packages/jax/_src/lib/__init__.py", line 96, in _xla_gc_callback
    def _xla_gc_callback(*args):
    
KeyboardInterrupt: 

3

5) Провести предобработку данных: привести обучающие и тестовые данные к формату, пригодному для обучения нейронной сети. Входные данные должны принимать значения от 0 до 1, метки цифр должны быть закодированы по принципу «one-hot encoding». Вывести размерности предобработанных обучающих и тестовых массивов данных.

# развернем каждое изображение 28*28 в вектор 784
num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], num_pixels) / 255
X_test = X_test.reshape(X_test.shape[0], num_pixels) / 255
print('Shape of transformed X train:', X_train.shape)
Shape of transformed X train: (60000, 784)
# переведем метки в one-hot
from keras.utils import to_categorical
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
print('Shape of transformed y train:', y_train.shape)
num_classes = y_train.shape[1]
Shape of transformed y train: (60000, 10)

6) Реализовать модель однослойной нейронной сети и обучить ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывести информацию об архитектуре нейронной сети. Вывести график функции ошибки на обучающих и валидационных данных по эпохам.
При реализации модели нейронной сети задать следующую архитектуру и параметры обучения:

  • количество скрытых слоев: 0
  • функция активации выходного слоя: softmax
  • функция ошибки: categorical_crossentropy
  • алгоритм обучения: sgd
  • метрика качества: accuracy
  • количество эпох: 50
  • доля валидационных данных от обучающих: 0.1
from keras.models import Sequential
from keras.layers import Dense

# создаем модель
model_1output = Sequential()
model_1output.add(Dense(units=num_classes, input_dim=num_pixels, activation='softmax'))
# компилируем модель
model_1output.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

# вывод информации об архитектуре модели
print(model_1output.summary())
Model: "sequential_9"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                     Output Shape                  Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense_21 (Dense)                │ (None, 10)             │         7,850 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 7,850 (30.66 KB)
 Trainable params: 7,850 (30.66 KB)
 Non-trainable params: 0 (0.00 B)
None
# Обучаем модель
H_1output = model_1output.fit(X_train, y_train, validation_split=0.1, epochs=50)
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.7138 - loss: 1.1461 - val_accuracy: 0.8675 - val_loss: 0.5159
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.8734 - loss: 0.4895 - val_accuracy: 0.8863 - val_loss: 0.4293
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.8909 - loss: 0.4183 - val_accuracy: 0.8938 - val_loss: 0.3940
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 3ms/step - accuracy: 0.8982 - loss: 0.3807 - val_accuracy: 0.8978 - val_loss: 0.3723
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.8992 - loss: 0.3713 - val_accuracy: 0.9035 - val_loss: 0.3573
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.9030 - loss: 0.3549 - val_accuracy: 0.9055 - val_loss: 0.3480
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.9048 - loss: 0.3416 - val_accuracy: 0.9093 - val_loss: 0.3395
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.9064 - loss: 0.3378 - val_accuracy: 0.9097 - val_loss: 0.3354
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9084 - loss: 0.3281 - val_accuracy: 0.9118 - val_loss: 0.3282
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 3ms/step - accuracy: 0.9113 - loss: 0.3189 - val_accuracy: 0.9118 - val_loss: 0.3237
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 2ms/step - accuracy: 0.9114 - loss: 0.3197 - val_accuracy: 0.9118 - val_loss: 0.3204
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 2ms/step - accuracy: 0.9143 - loss: 0.3095 - val_accuracy: 0.9152 - val_loss: 0.3165
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.9140 - loss: 0.3086 - val_accuracy: 0.9153 - val_loss: 0.3139
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 3ms/step - accuracy: 0.9145 - loss: 0.3085 - val_accuracy: 0.9148 - val_loss: 0.3122
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9134 - loss: 0.3099 - val_accuracy: 0.9173 - val_loss: 0.3097
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9160 - loss: 0.3046 - val_accuracy: 0.9168 - val_loss: 0.3083
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 2ms/step - accuracy: 0.9151 - loss: 0.3037 - val_accuracy: 0.9180 - val_loss: 0.3057
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.9137 - loss: 0.3053 - val_accuracy: 0.9180 - val_loss: 0.3038
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9157 - loss: 0.2996 - val_accuracy: 0.9185 - val_loss: 0.3021
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9179 - loss: 0.2968 - val_accuracy: 0.9178 - val_loss: 0.3009
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9198 - loss: 0.2943 - val_accuracy: 0.9188 - val_loss: 0.2998
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 2ms/step - accuracy: 0.9168 - loss: 0.2936 - val_accuracy: 0.9180 - val_loss: 0.2989
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.9187 - loss: 0.2928 - val_accuracy: 0.9185 - val_loss: 0.2971
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.9189 - loss: 0.2917 - val_accuracy: 0.9188 - val_loss: 0.2966
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9202 - loss: 0.2877 - val_accuracy: 0.9195 - val_loss: 0.2947
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9192 - loss: 0.2891 - val_accuracy: 0.9195 - val_loss: 0.2940
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 2ms/step - accuracy: 0.9217 - loss: 0.2883 - val_accuracy: 0.9198 - val_loss: 0.2932
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9203 - loss: 0.2822 - val_accuracy: 0.9200 - val_loss: 0.2922
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9203 - loss: 0.2881 - val_accuracy: 0.9202 - val_loss: 0.2910
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.9198 - loss: 0.2857 - val_accuracy: 0.9202 - val_loss: 0.2911
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 2ms/step - accuracy: 0.9188 - loss: 0.2898 - val_accuracy: 0.9198 - val_loss: 0.2906
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9219 - loss: 0.2829 - val_accuracy: 0.9207 - val_loss: 0.2893
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.9226 - loss: 0.2782 - val_accuracy: 0.9213 - val_loss: 0.2889
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9212 - loss: 0.2796 - val_accuracy: 0.9213 - val_loss: 0.2878
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9228 - loss: 0.2793 - val_accuracy: 0.9208 - val_loss: 0.2873
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.9233 - loss: 0.2774 - val_accuracy: 0.9217 - val_loss: 0.2866
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 3ms/step - accuracy: 0.9227 - loss: 0.2775 - val_accuracy: 0.9205 - val_loss: 0.2865
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9237 - loss: 0.2715 - val_accuracy: 0.9213 - val_loss: 0.2855
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9236 - loss: 0.2721 - val_accuracy: 0.9208 - val_loss: 0.2859
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9226 - loss: 0.2782 - val_accuracy: 0.9218 - val_loss: 0.2846
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9241 - loss: 0.2725 - val_accuracy: 0.9208 - val_loss: 0.2843
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9250 - loss: 0.2701 - val_accuracy: 0.9215 - val_loss: 0.2841
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9248 - loss: 0.2732 - val_accuracy: 0.9222 - val_loss: 0.2834
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9250 - loss: 0.2756 - val_accuracy: 0.9218 - val_loss: 0.2830
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9251 - loss: 0.2731 - val_accuracy: 0.9223 - val_loss: 0.2826
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 3ms/step - accuracy: 0.9237 - loss: 0.2712 - val_accuracy: 0.9225 - val_loss: 0.2820
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.9254 - loss: 0.2722 - val_accuracy: 0.9237 - val_loss: 0.2815
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9253 - loss: 0.2677 - val_accuracy: 0.9223 - val_loss: 0.2813
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9243 - loss: 0.2740 - val_accuracy: 0.9232 - val_loss: 0.2816
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 2ms/step - accuracy: 0.9244 - loss: 0.2711 - val_accuracy: 0.9223 - val_loss: 0.2809
# вывод графика ошибки по эпохам
plt.plot(H.history['loss'])
plt.plot(H.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs')
plt.show()

7) Применить обученную модель к тестовым данным. Вывести значение функции ошибки и значение метрики качества классификации на тестовых данных.

# Оценка качества работы модели на тестовых данных
scores = model_1output.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9249 - loss: 0.2666
Loss on test data: 0.28093650937080383
Accuracy on test data: 0.921500027179718

8) Добавить в модель один скрытый и провести обучение и тестирование (повторить п. 6–7) при 100, 300, 500 нейронах в скрытом слое. По метрике качества классификации на тестовых данных выбрать наилучшее количество нейронов в скрытом слое. В качестве функции активации нейронов в скрытом слое использовать функцию sigmoid.

При 100 нейронах в скрытом слое:

# создаем модель
model_1h100 = Sequential()
model_1h100.add(Dense(units=100, input_dim=num_pixels, activation='sigmoid'))
model_1h100.add(Dense(units=num_classes, activation='softmax'))
# компилируем модель
model_1h100.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

# вывод информации об архитектуре модели
print(model_1h100.summary())
Model: "sequential_6"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                     Output Shape                  Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense_13 (Dense)                │ (None, 100)            │        78,500 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_14 (Dense)                │ (None, 10)             │         1,010 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 79,510 (310.59 KB)
 Trainable params: 79,510 (310.59 KB)
 Non-trainable params: 0 (0.00 B)
None
# Обучаем модель
H_1h100 = model_1h100.fit(X_train, y_train, validation_split=0.1, epochs=50)
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.5149 - loss: 1.8602 - val_accuracy: 0.8267 - val_loss: 0.9482
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8325 - loss: 0.8319 - val_accuracy: 0.8600 - val_loss: 0.6231
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8654 - loss: 0.5794 - val_accuracy: 0.8765 - val_loss: 0.5055
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8787 - loss: 0.4856 - val_accuracy: 0.8842 - val_loss: 0.4450
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8888 - loss: 0.4301 - val_accuracy: 0.8907 - val_loss: 0.4096
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.8915 - loss: 0.4000 - val_accuracy: 0.8937 - val_loss: 0.3849
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8987 - loss: 0.3766 - val_accuracy: 0.8968 - val_loss: 0.3671
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9022 - loss: 0.3517 - val_accuracy: 0.9000 - val_loss: 0.3531
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9042 - loss: 0.3451 - val_accuracy: 0.9030 - val_loss: 0.3428
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9109 - loss: 0.3219 - val_accuracy: 0.9053 - val_loss: 0.3337
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9082 - loss: 0.3241 - val_accuracy: 0.9083 - val_loss: 0.3256
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9129 - loss: 0.3118 - val_accuracy: 0.9090 - val_loss: 0.3191
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9144 - loss: 0.3060 - val_accuracy: 0.9120 - val_loss: 0.3131
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.9143 - loss: 0.3035 - val_accuracy: 0.9130 - val_loss: 0.3076
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9162 - loss: 0.2954 - val_accuracy: 0.9138 - val_loss: 0.3028
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9182 - loss: 0.2925 - val_accuracy: 0.9148 - val_loss: 0.2985
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.9179 - loss: 0.2887 - val_accuracy: 0.9147 - val_loss: 0.2950
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9204 - loss: 0.2806 - val_accuracy: 0.9173 - val_loss: 0.2905
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9211 - loss: 0.2727 - val_accuracy: 0.9163 - val_loss: 0.2868
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9243 - loss: 0.2699 - val_accuracy: 0.9185 - val_loss: 0.2831
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9229 - loss: 0.2724 - val_accuracy: 0.9195 - val_loss: 0.2802
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9227 - loss: 0.2678 - val_accuracy: 0.9208 - val_loss: 0.2773
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9260 - loss: 0.2577 - val_accuracy: 0.9215 - val_loss: 0.2734
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9273 - loss: 0.2573 - val_accuracy: 0.9228 - val_loss: 0.2707
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9291 - loss: 0.2512 - val_accuracy: 0.9228 - val_loss: 0.2673
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9272 - loss: 0.2541 - val_accuracy: 0.9240 - val_loss: 0.2642
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9301 - loss: 0.2437 - val_accuracy: 0.9252 - val_loss: 0.2615
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9316 - loss: 0.2417 - val_accuracy: 0.9245 - val_loss: 0.2591
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9332 - loss: 0.2369 - val_accuracy: 0.9262 - val_loss: 0.2566
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.9319 - loss: 0.2391 - val_accuracy: 0.9253 - val_loss: 0.2537
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9334 - loss: 0.2336 - val_accuracy: 0.9263 - val_loss: 0.2509
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9361 - loss: 0.2245 - val_accuracy: 0.9285 - val_loss: 0.2485
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9340 - loss: 0.2249 - val_accuracy: 0.9285 - val_loss: 0.2459
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9366 - loss: 0.2205 - val_accuracy: 0.9307 - val_loss: 0.2437
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9363 - loss: 0.2240 - val_accuracy: 0.9310 - val_loss: 0.2407
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9390 - loss: 0.2165 - val_accuracy: 0.9310 - val_loss: 0.2390
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9382 - loss: 0.2140 - val_accuracy: 0.9325 - val_loss: 0.2361
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9390 - loss: 0.2148 - val_accuracy: 0.9313 - val_loss: 0.2342
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9386 - loss: 0.2150 - val_accuracy: 0.9340 - val_loss: 0.2315
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9409 - loss: 0.2095 - val_accuracy: 0.9338 - val_loss: 0.2298
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9385 - loss: 0.2122 - val_accuracy: 0.9358 - val_loss: 0.2270
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9425 - loss: 0.2031 - val_accuracy: 0.9355 - val_loss: 0.2256
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9420 - loss: 0.2030 - val_accuracy: 0.9360 - val_loss: 0.2229
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9418 - loss: 0.2059 - val_accuracy: 0.9368 - val_loss: 0.2212
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9447 - loss: 0.1938 - val_accuracy: 0.9375 - val_loss: 0.2192
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9425 - loss: 0.1997 - val_accuracy: 0.9377 - val_loss: 0.2173
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.9446 - loss: 0.1983 - val_accuracy: 0.9375 - val_loss: 0.2151
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9445 - loss: 0.1929 - val_accuracy: 0.9378 - val_loss: 0.2135
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.9455 - loss: 0.1902 - val_accuracy: 0.9395 - val_loss: 0.2115
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9470 - loss: 0.1885 - val_accuracy: 0.9400 - val_loss: 0.2100
# вывод графика ошибки по эпохам
plt.plot(H_1h100.history['loss'])
plt.plot(H_1h100.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs')
plt.show()

# Оценка качества работы модели на тестовых данных
scores = model_1h100.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9391 - loss: 0.2074
Loss on test data: 0.20816442370414734
Accuracy on test data: 0.9397000074386597

При 300 нейронах в скрытом слое:

# создаем модель
model_1h300 = Sequential()
model_1h300.add(Dense(units=300, input_dim=num_pixels, activation='sigmoid'))
model_1h300.add(Dense(units=num_classes, activation='softmax'))
# компилируем модель
model_1h300.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

# вывод информации об архитектуре модели
print(model_1h300.summary())
Model: "sequential_16"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                     Output Shape                  Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense_33 (Dense)                │ (None, 300)            │       235,500 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_34 (Dense)                │ (None, 10)             │         3,010 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 238,510 (931.68 KB)
 Trainable params: 238,510 (931.68 KB)
 Non-trainable params: 0 (0.00 B)
None
# Обучаем модель
H_1h300 = model_1h300.fit(X_train, y_train, validation_split=0.1, epochs=50)
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.5719 - loss: 1.7778 - val_accuracy: 0.8398 - val_loss: 0.8435
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 4ms/step - accuracy: 0.8458 - loss: 0.7413 - val_accuracy: 0.8675 - val_loss: 0.5641
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.8702 - loss: 0.5336 - val_accuracy: 0.8813 - val_loss: 0.4686
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.8821 - loss: 0.4528 - val_accuracy: 0.8865 - val_loss: 0.4223
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.8915 - loss: 0.4082 - val_accuracy: 0.8918 - val_loss: 0.3919
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8966 - loss: 0.3781 - val_accuracy: 0.8945 - val_loss: 0.3737
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 12s 5ms/step - accuracy: 0.8949 - loss: 0.3723 - val_accuracy: 0.8978 - val_loss: 0.3588
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.8985 - loss: 0.3565 - val_accuracy: 0.9010 - val_loss: 0.3486
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9032 - loss: 0.3413 - val_accuracy: 0.9018 - val_loss: 0.3410
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9065 - loss: 0.3307 - val_accuracy: 0.9057 - val_loss: 0.3336
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9072 - loss: 0.3254 - val_accuracy: 0.9055 - val_loss: 0.3274
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9092 - loss: 0.3190 - val_accuracy: 0.9082 - val_loss: 0.3231
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9111 - loss: 0.3128 - val_accuracy: 0.9050 - val_loss: 0.3197
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 5ms/step - accuracy: 0.9124 - loss: 0.3087 - val_accuracy: 0.9100 - val_loss: 0.3152
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 4ms/step - accuracy: 0.9143 - loss: 0.3009 - val_accuracy: 0.9098 - val_loss: 0.3117
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.9151 - loss: 0.3001 - val_accuracy: 0.9107 - val_loss: 0.3079
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9159 - loss: 0.2923 - val_accuracy: 0.9117 - val_loss: 0.3055
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9169 - loss: 0.2881 - val_accuracy: 0.9122 - val_loss: 0.3020
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9163 - loss: 0.2925 - val_accuracy: 0.9128 - val_loss: 0.3010
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 12s 5ms/step - accuracy: 0.9182 - loss: 0.2860 - val_accuracy: 0.9137 - val_loss: 0.2973
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9198 - loss: 0.2794 - val_accuracy: 0.9162 - val_loss: 0.2960
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 4ms/step - accuracy: 0.9229 - loss: 0.2742 - val_accuracy: 0.9157 - val_loss: 0.2927
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.9217 - loss: 0.2712 - val_accuracy: 0.9150 - val_loss: 0.2907
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9199 - loss: 0.2748 - val_accuracy: 0.9167 - val_loss: 0.2884
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9228 - loss: 0.2706 - val_accuracy: 0.9170 - val_loss: 0.2868
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.9226 - loss: 0.2707 - val_accuracy: 0.9163 - val_loss: 0.2863
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9235 - loss: 0.2654 - val_accuracy: 0.9182 - val_loss: 0.2822
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9230 - loss: 0.2654 - val_accuracy: 0.9187 - val_loss: 0.2803
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 12s 4ms/step - accuracy: 0.9245 - loss: 0.2610 - val_accuracy: 0.9197 - val_loss: 0.2787
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9271 - loss: 0.2519 - val_accuracy: 0.9205 - val_loss: 0.2762
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 4ms/step - accuracy: 0.9285 - loss: 0.2515 - val_accuracy: 0.9198 - val_loss: 0.2747
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 4ms/step - accuracy: 0.9264 - loss: 0.2544 - val_accuracy: 0.9208 - val_loss: 0.2714
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.9293 - loss: 0.2444 - val_accuracy: 0.9210 - val_loss: 0.2716
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 4ms/step - accuracy: 0.9268 - loss: 0.2527 - val_accuracy: 0.9218 - val_loss: 0.2687
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 4ms/step - accuracy: 0.9291 - loss: 0.2497 - val_accuracy: 0.9220 - val_loss: 0.2661
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9311 - loss: 0.2427 - val_accuracy: 0.9225 - val_loss: 0.2633
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 4ms/step - accuracy: 0.9301 - loss: 0.2442 - val_accuracy: 0.9235 - val_loss: 0.2615
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 4ms/step - accuracy: 0.9330 - loss: 0.2346 - val_accuracy: 0.9248 - val_loss: 0.2587
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9321 - loss: 0.2360 - val_accuracy: 0.9242 - val_loss: 0.2575
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 12s 5ms/step - accuracy: 0.9342 - loss: 0.2348 - val_accuracy: 0.9245 - val_loss: 0.2556
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9328 - loss: 0.2346 - val_accuracy: 0.9248 - val_loss: 0.2538
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9344 - loss: 0.2257 - val_accuracy: 0.9263 - val_loss: 0.2505
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.9376 - loss: 0.2213 - val_accuracy: 0.9277 - val_loss: 0.2489
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9346 - loss: 0.2255 - val_accuracy: 0.9258 - val_loss: 0.2484
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9391 - loss: 0.2163 - val_accuracy: 0.9278 - val_loss: 0.2456
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9364 - loss: 0.2200 - val_accuracy: 0.9278 - val_loss: 0.2437
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 4ms/step - accuracy: 0.9373 - loss: 0.2202 - val_accuracy: 0.9293 - val_loss: 0.2418
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 5ms/step - accuracy: 0.9382 - loss: 0.2151 - val_accuracy: 0.9302 - val_loss: 0.2405
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9397 - loss: 0.2152 - val_accuracy: 0.9307 - val_loss: 0.2368
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9396 - loss: 0.2121 - val_accuracy: 0.9317 - val_loss: 0.2359
# вывод графика ошибки по эпохам
plt.plot(H_1h300.history['loss'])
plt.plot(H_1h300.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs')
plt.show()

# Оценка качества работы модели на тестовых данных
scores = model_1h300.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9327 - loss: 0.2343
Loss on test data: 0.2359277904033661
Accuracy on test data: 0.9320999979972839

При 500 нейронах в скрытом слое:

# создаем модель
model_1h500 = Sequential()
model_1h500.add(Dense(units=500, input_dim=num_pixels, activation='sigmoid'))
model_1h500.add(Dense(units=num_classes, activation='softmax'))
# компилируем модель
model_1h500.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

# вывод информации об архитектуре модели
print(model_1h500.summary())
Model: "sequential_3"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                     Output Shape                  Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense_5 (Dense)                 │ (None, 500)            │       392,500 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_6 (Dense)                 │ (None, 10)             │         5,010 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 397,510 (1.52 MB)
 Trainable params: 397,510 (1.52 MB)
 Non-trainable params: 0 (0.00 B)
None
# Обучаем модель
H_1h500 = model_1h500.fit(X_train, y_train, validation_split=0.1, epochs=50)
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.5713 - loss: 1.7416 - val_accuracy: 0.8273 - val_loss: 0.8147
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.8444 - loss: 0.7193 - val_accuracy: 0.8675 - val_loss: 0.5526
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.8684 - loss: 0.5240 - val_accuracy: 0.8808 - val_loss: 0.4634
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 4ms/step - accuracy: 0.8806 - loss: 0.4544 - val_accuracy: 0.8858 - val_loss: 0.4189
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.8899 - loss: 0.4051 - val_accuracy: 0.8908 - val_loss: 0.3922
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.8969 - loss: 0.3771 - val_accuracy: 0.8917 - val_loss: 0.3733
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 4ms/step - accuracy: 0.8982 - loss: 0.3646 - val_accuracy: 0.8952 - val_loss: 0.3598
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.9015 - loss: 0.3508 - val_accuracy: 0.8988 - val_loss: 0.3501
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 4ms/step - accuracy: 0.9049 - loss: 0.3377 - val_accuracy: 0.9028 - val_loss: 0.3413
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9044 - loss: 0.3344 - val_accuracy: 0.9032 - val_loss: 0.3351
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 5ms/step - accuracy: 0.9073 - loss: 0.3260 - val_accuracy: 0.9065 - val_loss: 0.3300
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9093 - loss: 0.3189 - val_accuracy: 0.9045 - val_loss: 0.3250
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.9113 - loss: 0.3108 - val_accuracy: 0.9073 - val_loss: 0.3211
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9104 - loss: 0.3125 - val_accuracy: 0.9087 - val_loss: 0.3190
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 4ms/step - accuracy: 0.9135 - loss: 0.3031 - val_accuracy: 0.9088 - val_loss: 0.3160
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.9125 - loss: 0.3044 - val_accuracy: 0.9098 - val_loss: 0.3112
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9141 - loss: 0.2993 - val_accuracy: 0.9108 - val_loss: 0.3096
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9160 - loss: 0.2957 - val_accuracy: 0.9112 - val_loss: 0.3073
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 5ms/step - accuracy: 0.9180 - loss: 0.2901 - val_accuracy: 0.9125 - val_loss: 0.3045
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9161 - loss: 0.2902 - val_accuracy: 0.9108 - val_loss: 0.3038
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9176 - loss: 0.2924 - val_accuracy: 0.9123 - val_loss: 0.3008
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9196 - loss: 0.2820 - val_accuracy: 0.9142 - val_loss: 0.2984
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.9173 - loss: 0.2869 - val_accuracy: 0.9145 - val_loss: 0.2970
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9204 - loss: 0.2820 - val_accuracy: 0.9120 - val_loss: 0.2981
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9203 - loss: 0.2779 - val_accuracy: 0.9142 - val_loss: 0.2946
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.9228 - loss: 0.2743 - val_accuracy: 0.9148 - val_loss: 0.2926
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 4ms/step - accuracy: 0.9246 - loss: 0.2631 - val_accuracy: 0.9160 - val_loss: 0.2901
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 4ms/step - accuracy: 0.9214 - loss: 0.2717 - val_accuracy: 0.9133 - val_loss: 0.2894
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.9221 - loss: 0.2716 - val_accuracy: 0.9168 - val_loss: 0.2875
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 5ms/step - accuracy: 0.9228 - loss: 0.2683 - val_accuracy: 0.9157 - val_loss: 0.2860
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.9229 - loss: 0.2676 - val_accuracy: 0.9165 - val_loss: 0.2850
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 6ms/step - accuracy: 0.9258 - loss: 0.2633 - val_accuracy: 0.9177 - val_loss: 0.2834
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.9239 - loss: 0.2652 - val_accuracy: 0.9185 - val_loss: 0.2825
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 4ms/step - accuracy: 0.9248 - loss: 0.2581 - val_accuracy: 0.9180 - val_loss: 0.2797
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 5ms/step - accuracy: 0.9292 - loss: 0.2523 - val_accuracy: 0.9185 - val_loss: 0.2787
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 5ms/step - accuracy: 0.9265 - loss: 0.2603 - val_accuracy: 0.9188 - val_loss: 0.2780
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9265 - loss: 0.2540 - val_accuracy: 0.9190 - val_loss: 0.2764
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 4ms/step - accuracy: 0.9280 - loss: 0.2557 - val_accuracy: 0.9205 - val_loss: 0.2732
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.9270 - loss: 0.2514 - val_accuracy: 0.9215 - val_loss: 0.2716
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9296 - loss: 0.2468 - val_accuracy: 0.9205 - val_loss: 0.2724
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 4ms/step - accuracy: 0.9293 - loss: 0.2474 - val_accuracy: 0.9202 - val_loss: 0.2704
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 4ms/step - accuracy: 0.9294 - loss: 0.2472 - val_accuracy: 0.9207 - val_loss: 0.2673
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.9306 - loss: 0.2426 - val_accuracy: 0.9207 - val_loss: 0.2659
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9312 - loss: 0.2413 - val_accuracy: 0.9220 - val_loss: 0.2640
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 4ms/step - accuracy: 0.9329 - loss: 0.2375 - val_accuracy: 0.9242 - val_loss: 0.2636
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.9325 - loss: 0.2405 - val_accuracy: 0.9235 - val_loss: 0.2606
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 4ms/step - accuracy: 0.9321 - loss: 0.2361 - val_accuracy: 0.9232 - val_loss: 0.2592
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 4ms/step - accuracy: 0.9345 - loss: 0.2328 - val_accuracy: 0.9252 - val_loss: 0.2575
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 5ms/step - accuracy: 0.9346 - loss: 0.2296 - val_accuracy: 0.9250 - val_loss: 0.2561
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9347 - loss: 0.2323 - val_accuracy: 0.9258 - val_loss: 0.2541
# вывод графика ошибки по эпохам
plt.plot(H_1h500.history['loss'])
plt.plot(H_1h500.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs')
plt.show()

# Оценка качества работы модели на тестовых данных
scores = model_1h500.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 4ms/step - accuracy: 0.9282 - loss: 0.2529
Loss on test data: 0.25467056035995483
Accuracy on test data: 0.9280999898910522

Лучшая метрика получилась равной 0.943 при архитектуре со 100 нейронами в скрытом слое, поэтому в дальнейшем используем ее.

9) Добавить в наилучшую архитектуру, определенную в п. 8, второй скрытый слой и провести обучение и тестирование (повторить п. 6–7) при 50 и 100 нейронах во втором скрытом слое. В качестве функции активации нейронов в скрытом слое использовать функцию sigmoid.

При 50 нейронах во втором скрытом слое:

# создаем модель
model_1h100_2h50 = Sequential()
model_1h100_2h50.add(Dense(units=100, input_dim=num_pixels, activation='sigmoid'))
model_1h100_2h50.add(Dense(units=50, activation='sigmoid'))
model_1h100_2h50.add(Dense(units=num_classes, activation='softmax'))
# компилируем модель
model_1h100_2h50.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

# вывод информации об архитектуре модели
print(model_1h100_2h50.summary())
Model: "sequential_10"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                     Output Shape                  Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense_22 (Dense)                │ (None, 100)            │        78,500 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_23 (Dense)                │ (None, 50)             │         5,050 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_24 (Dense)                │ (None, 10)             │           510 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84,060 (328.36 KB)
 Trainable params: 84,060 (328.36 KB)
 Non-trainable params: 0 (0.00 B)
None
# Обучаем модель
H_1h100_2h50 = model_1h100_2h50.fit(X_train, y_train, validation_split=0.1, epochs=50)
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.2225 - loss: 2.2643 - val_accuracy: 0.4647 - val_loss: 2.0889
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.5393 - loss: 1.9751 - val_accuracy: 0.6795 - val_loss: 1.5483
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.6897 - loss: 1.4097 - val_accuracy: 0.7602 - val_loss: 1.0517
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.7794 - loss: 0.9745 - val_accuracy: 0.8165 - val_loss: 0.7786
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.8277 - loss: 0.7410 - val_accuracy: 0.8482 - val_loss: 0.6324
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.8513 - loss: 0.6139 - val_accuracy: 0.8635 - val_loss: 0.5454
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 4ms/step - accuracy: 0.8651 - loss: 0.5384 - val_accuracy: 0.8730 - val_loss: 0.4874
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.8759 - loss: 0.4813 - val_accuracy: 0.8813 - val_loss: 0.4470
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.8846 - loss: 0.4451 - val_accuracy: 0.8892 - val_loss: 0.4174
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8897 - loss: 0.4221 - val_accuracy: 0.8923 - val_loss: 0.3950
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8936 - loss: 0.3962 - val_accuracy: 0.8957 - val_loss: 0.3768
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.8976 - loss: 0.3815 - val_accuracy: 0.8987 - val_loss: 0.3619
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.8995 - loss: 0.3669 - val_accuracy: 0.9023 - val_loss: 0.3491
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9025 - loss: 0.3574 - val_accuracy: 0.9040 - val_loss: 0.3391
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9034 - loss: 0.3499 - val_accuracy: 0.9077 - val_loss: 0.3289
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9053 - loss: 0.3362 - val_accuracy: 0.9070 - val_loss: 0.3219
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.9068 - loss: 0.3315 - val_accuracy: 0.9110 - val_loss: 0.3133
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9095 - loss: 0.3248 - val_accuracy: 0.9133 - val_loss: 0.3063
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9112 - loss: 0.3163 - val_accuracy: 0.9160 - val_loss: 0.3006
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9139 - loss: 0.3059 - val_accuracy: 0.9150 - val_loss: 0.2947
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9105 - loss: 0.3078 - val_accuracy: 0.9160 - val_loss: 0.2893
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 4ms/step - accuracy: 0.9170 - loss: 0.2947 - val_accuracy: 0.9183 - val_loss: 0.2839
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9157 - loss: 0.2942 - val_accuracy: 0.9197 - val_loss: 0.2802
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9192 - loss: 0.2873 - val_accuracy: 0.9218 - val_loss: 0.2746
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9184 - loss: 0.2820 - val_accuracy: 0.9235 - val_loss: 0.2704
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.9222 - loss: 0.2752 - val_accuracy: 0.9237 - val_loss: 0.2666
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9213 - loss: 0.2731 - val_accuracy: 0.9243 - val_loss: 0.2621
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9224 - loss: 0.2703 - val_accuracy: 0.9253 - val_loss: 0.2583
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9260 - loss: 0.2582 - val_accuracy: 0.9263 - val_loss: 0.2541
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9252 - loss: 0.2594 - val_accuracy: 0.9293 - val_loss: 0.2508
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9297 - loss: 0.2487 - val_accuracy: 0.9303 - val_loss: 0.2468
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.9294 - loss: 0.2490 - val_accuracy: 0.9307 - val_loss: 0.2437
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9285 - loss: 0.2483 - val_accuracy: 0.9315 - val_loss: 0.2401
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9319 - loss: 0.2365 - val_accuracy: 0.9315 - val_loss: 0.2373
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9297 - loss: 0.2423 - val_accuracy: 0.9332 - val_loss: 0.2336
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.9329 - loss: 0.2365 - val_accuracy: 0.9345 - val_loss: 0.2312
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9347 - loss: 0.2337 - val_accuracy: 0.9355 - val_loss: 0.2279
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9353 - loss: 0.2315 - val_accuracy: 0.9363 - val_loss: 0.2253
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9356 - loss: 0.2258 - val_accuracy: 0.9372 - val_loss: 0.2220
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9361 - loss: 0.2248 - val_accuracy: 0.9383 - val_loss: 0.2194
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9371 - loss: 0.2205 - val_accuracy: 0.9393 - val_loss: 0.2162
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9399 - loss: 0.2107 - val_accuracy: 0.9402 - val_loss: 0.2137
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9393 - loss: 0.2109 - val_accuracy: 0.9392 - val_loss: 0.2114
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9404 - loss: 0.2104 - val_accuracy: 0.9400 - val_loss: 0.2088
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9411 - loss: 0.2028 - val_accuracy: 0.9418 - val_loss: 0.2064
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9429 - loss: 0.2024 - val_accuracy: 0.9422 - val_loss: 0.2041
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9435 - loss: 0.1978 - val_accuracy: 0.9428 - val_loss: 0.2022
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9446 - loss: 0.1957 - val_accuracy: 0.9435 - val_loss: 0.1994
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 12s 4ms/step - accuracy: 0.9434 - loss: 0.1983 - val_accuracy: 0.9427 - val_loss: 0.1973
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.9452 - loss: 0.1903 - val_accuracy: 0.9438 - val_loss: 0.1951
# вывод графика ошибки по эпохам
plt.plot(H_1h100_2h50.history['loss'])
plt.plot(H_1h100_2h50.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs')
plt.show()

# Оценка качества работы модели на тестовых данных
scores = model_1h100_2h50.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9454 - loss: 0.1818
Loss on test data: 0.19274231791496277
Accuracy on test data: 0.9430000185966492

При 100 нейронах во втором скрытом слое:

# создаем модель
model_1h100_2h100 = Sequential()
model_1h100_2h100.add(Dense(units=100, input_dim=num_pixels, activation='sigmoid'))
model_1h100_2h100.add(Dense(units=100, activation='sigmoid'))
model_1h100_2h100.add(Dense(units=num_classes, activation='softmax'))
# компилируем модель
model_1h100_2h100.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

# вывод информации об архитектуре модели
print(model_1h100_2h100.summary())
Model: "sequential_19"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                     Output Shape                  Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense_40 (Dense)                │ (None, 100)            │        78,500 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_41 (Dense)                │ (None, 100)            │        10,100 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_42 (Dense)                │ (None, 10)             │         1,010 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 89,610 (350.04 KB)
 Trainable params: 89,610 (350.04 KB)
 Non-trainable params: 0 (0.00 B)
None
# Обучаем модель
H_1h100_2h100 = model_1h100_2h100.fit(X_train, y_train, validation_split=0.1, epochs=50)
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 4ms/step - accuracy: 0.2265 - loss: 2.2685 - val_accuracy: 0.4253 - val_loss: 2.0877
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.5373 - loss: 1.9708 - val_accuracy: 0.6772 - val_loss: 1.5106
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.6911 - loss: 1.3719 - val_accuracy: 0.7632 - val_loss: 1.0021
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.7798 - loss: 0.9299 - val_accuracy: 0.8145 - val_loss: 0.7389
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 4ms/step - accuracy: 0.8257 - loss: 0.7067 - val_accuracy: 0.8452 - val_loss: 0.5985
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 12s 4ms/step - accuracy: 0.8513 - loss: 0.5799 - val_accuracy: 0.8655 - val_loss: 0.5154
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.8667 - loss: 0.5053 - val_accuracy: 0.8765 - val_loss: 0.4650
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.8731 - loss: 0.4697 - val_accuracy: 0.8843 - val_loss: 0.4270
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.8842 - loss: 0.4288 - val_accuracy: 0.8905 - val_loss: 0.3993
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.8897 - loss: 0.4079 - val_accuracy: 0.8942 - val_loss: 0.3795
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.8932 - loss: 0.3881 - val_accuracy: 0.8993 - val_loss: 0.3630
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.8998 - loss: 0.3655 - val_accuracy: 0.9017 - val_loss: 0.3495
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.8986 - loss: 0.3611 - val_accuracy: 0.9055 - val_loss: 0.3378
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9014 - loss: 0.3440 - val_accuracy: 0.9062 - val_loss: 0.3288
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9041 - loss: 0.3377 - val_accuracy: 0.9082 - val_loss: 0.3199
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 12s 4ms/step - accuracy: 0.9085 - loss: 0.3252 - val_accuracy: 0.9098 - val_loss: 0.3125
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 4ms/step - accuracy: 0.9113 - loss: 0.3125 - val_accuracy: 0.9115 - val_loss: 0.3062
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9128 - loss: 0.3104 - val_accuracy: 0.9147 - val_loss: 0.2996
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 12s 4ms/step - accuracy: 0.9133 - loss: 0.3032 - val_accuracy: 0.9158 - val_loss: 0.2934
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9171 - loss: 0.2943 - val_accuracy: 0.9187 - val_loss: 0.2881
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9159 - loss: 0.2911 - val_accuracy: 0.9192 - val_loss: 0.2836
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9189 - loss: 0.2826 - val_accuracy: 0.9212 - val_loss: 0.2790
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9198 - loss: 0.2813 - val_accuracy: 0.9222 - val_loss: 0.2739
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9206 - loss: 0.2783 - val_accuracy: 0.9237 - val_loss: 0.2693
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9212 - loss: 0.2763 - val_accuracy: 0.9245 - val_loss: 0.2656
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9248 - loss: 0.2634 - val_accuracy: 0.9257 - val_loss: 0.2613
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 4ms/step - accuracy: 0.9250 - loss: 0.2621 - val_accuracy: 0.9257 - val_loss: 0.2583
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9248 - loss: 0.2619 - val_accuracy: 0.9278 - val_loss: 0.2542
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9262 - loss: 0.2537 - val_accuracy: 0.9285 - val_loss: 0.2508
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9276 - loss: 0.2529 - val_accuracy: 0.9307 - val_loss: 0.2475
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9301 - loss: 0.2434 - val_accuracy: 0.9312 - val_loss: 0.2440
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 4ms/step - accuracy: 0.9280 - loss: 0.2439 - val_accuracy: 0.9315 - val_loss: 0.2409
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9282 - loss: 0.2465 - val_accuracy: 0.9333 - val_loss: 0.2361
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9327 - loss: 0.2365 - val_accuracy: 0.9338 - val_loss: 0.2338
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9348 - loss: 0.2273 - val_accuracy: 0.9355 - val_loss: 0.2303
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9346 - loss: 0.2254 - val_accuracy: 0.9358 - val_loss: 0.2274
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 11s 4ms/step - accuracy: 0.9341 - loss: 0.2268 - val_accuracy: 0.9380 - val_loss: 0.2237
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9356 - loss: 0.2239 - val_accuracy: 0.9393 - val_loss: 0.2209
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9366 - loss: 0.2188 - val_accuracy: 0.9388 - val_loss: 0.2183
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9384 - loss: 0.2141 - val_accuracy: 0.9390 - val_loss: 0.2156
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 3ms/step - accuracy: 0.9393 - loss: 0.2113 - val_accuracy: 0.9398 - val_loss: 0.2124
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9394 - loss: 0.2127 - val_accuracy: 0.9413 - val_loss: 0.2098
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9411 - loss: 0.2066 - val_accuracy: 0.9402 - val_loss: 0.2080
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9414 - loss: 0.2062 - val_accuracy: 0.9418 - val_loss: 0.2053
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 13s 5ms/step - accuracy: 0.9427 - loss: 0.2011 - val_accuracy: 0.9428 - val_loss: 0.2029
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 4ms/step - accuracy: 0.9433 - loss: 0.1983 - val_accuracy: 0.9428 - val_loss: 0.2004
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.9451 - loss: 0.1918 - val_accuracy: 0.9433 - val_loss: 0.1983
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9460 - loss: 0.1890 - val_accuracy: 0.9442 - val_loss: 0.1956
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9470 - loss: 0.1869 - val_accuracy: 0.9443 - val_loss: 0.1939
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.9484 - loss: 0.1843 - val_accuracy: 0.9455 - val_loss: 0.1912
# вывод графика ошибки по эпохам
plt.plot(H_1h100_2h100.history['loss'])
plt.plot(H_1h100_2h100.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs')
plt.show()

# Оценка качества работы модели на тестовых данных
scores = model_1h100_2h100.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9362 - loss: 0.2106
Loss on test data: 0.21183738112449646
Accuracy on test data: 0.9372000098228455

10) Результаты исследования архитектуры нейронной сети занести в таблицу: таблица2.png

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

Из таблицы следует, что лучшей архитектурой является НС с двумя скрытыми слоями по 100 и 50 нейронов соответственно, затем идет НС с одним скрытым слоем и 100 нейронами. При увеличении количества нейронов в скрытык слоях значение метрики качества падает. Такая тенденция возникает из-за простоты датасета MNIST, при усложнении архитектуры НС начинает переобучаться, а оценка качетсва на тестовых данных падать.

11) Сохранить наилучшую нейронную сеть на диск. Данную нейронную сеть потребуется загрузить с диска в одной из следующих лабораторных работ.

# сохранение модели на диск
model_1h100_2h50.save('/content/drive/MyDrive/Colab Notebooks/laba1/model_1h100_2h50.keras')

12) Для нейронной сети наилучшей архитектуры вывести два тестовых изображения, истинные метки и результат распознавания изображений.

#Результаты для двух тестовых изображений
for n in [3,26]:
  result = model_1h100_2h50.predict(X_test[n:n+1])
  print('NN output:', result)

  plt.imshow(X_test[n].reshape(28,28), cmap=plt.get_cmap('gray'))
  plt.show()
  print('Real mark: ', str(np.argmax(y_test[n])))
  print('NN answer: ', str(np.argmax(result)))
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
NN output: [[2.9130476e-02 5.3324870e-06 9.6752131e-01 2.5341648e-03 1.2145542e-06
  2.5728915e-04 1.0855521e-04 1.8212755e-04 2.3601220e-04 2.3541097e-05]]

Real mark:  2
NN answer:  2
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
NN output: [[5.2140213e-06 4.1654346e-07 3.1492444e-05 1.7709195e-05 2.7664129e-03
  2.7269698e-05 2.1200174e-06 8.0334948e-04 1.6337440e-03 9.9471223e-01]]

Real mark:  9
NN answer:  9

13) Каждому члену бригады создать собственное изображение рукописной цифры, подобное представленным в наборе MNIST. Цифру выбрать как остаток от деления на 10 числа своего дня рождения (26 ноября → 26 mod 10 = 6, 3 июля → 3 mod 10 = 3). Сохранить изображения. Загрузить, предобработать и подать на вход обученной нейронной сети собственные изображения. Вывести изображения и результаты распознавания.

# загрузка собственного изображения
from PIL import Image
file1_data = Image.open('/content/drive/MyDrive/Colab Notebooks/laba1/цифра 3.png')
file1_data = file1_data.convert('L') # перевод в градации серого
test1_img = np.array(file1_data)
plt.imshow(test1_img, cmap=plt.get_cmap('gray'))
plt.show()

from PIL import Image
file2_data = Image.open('/content/drive/MyDrive/Colab Notebooks/laba1/цифра 6.png')
file2_data = file2_data.convert('L') # перевод в градации серого
test2_img = np.array(file2_data)

# вывод собственного изображения
plt.imshow(test1_img, cmap=plt.get_cmap('gray'))
plt.imshow(test2_img, cmap=plt.get_cmap('gray'))
plt.show()

# предобработка
test1_img = test1_img / 255
test1_img = test1_img.reshape(1, num_pixels)
test2_img = test2_img / 255
test2_img = test2_img.reshape(1, num_pixels)

# распознавание
result1 = model_1h100_2h50.predict(test1_img)
print('Я думаю это ', np.argmax(result1))

result2 = model_1h100_2h50.predict(test2_img)
print('Я думаю это ', np.argmax(result2))
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
Я думаю это  3
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
Я думаю это  6

14) Каждому члену бригады создать копию собственного изображения, отличающуюся от оригинала поворотом на 90 градусов в любую сторону. Сохранить изображения. Загрузить, предобработать и подать на вход обученной нейронной сети измененные изображения. Вывести изображения и результаты распознавания. Сделать выводы по результатам эксперимента.

# загрузка собственного изображения
from PIL import Image
file3_data = Image.open('/content/drive/MyDrive/Colab Notebooks/laba1/цифра 3 перевернутая.png')
file3_data = file3_data.convert('L') # перевод в градации серого
test3_img = np.array(file3_data)
plt.imshow(test3_img, cmap=plt.get_cmap('gray'))
plt.show()

from PIL import Image
file4_data = Image.open('/content/drive/MyDrive/Colab Notebooks/laba1/цифра 6 перевернутая.png')
file4_data = file4_data.convert('L') # перевод в градации серого
test4_img = np.array(file4_data)

# вывод собственного изображения
plt.imshow(test3_img, cmap=plt.get_cmap('gray'))
plt.imshow(test4_img, cmap=plt.get_cmap('gray'))
plt.show()

# предобработка
test3_img = test3_img / 255
test3_img = test3_img.reshape(1, num_pixels)
test4_img = test4_img / 255
test4_img = test4_img.reshape(1, num_pixels)

# распознавание
result3 = model_1h100_2h50.predict(test3_img)
print('Я думаю это ', np.argmax(result3))

result4 = model_1h100_2h50.predict(test4_img)
print('Я думаю это ', np.argmax(result4))
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
Я думаю это  5
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
Я думаю это  4

При повороте рисунков цифр НС не смогла их правильно распознать. Так получилось получилось потому что НС не обучалась на перевернутых изображений.