форкнуто от main/is_dnn
Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
434 KiB
434 KiB
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')# импорт модулей
from tensorflow import keras
import matplotlib.pyplot as plt
import numpy as np
import sklearn# загрузка датасета
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11490434/11490434 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
# создание своего разбиения датасета
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 = 15)# вывод размерностей
print('Shape of X train:', X_train.shape)
print('Shape of y train:', y_train.shape)Shape of X train: (60000, 28, 28)
Shape of y train: (60000,)
# Вывод 4 изображений
plt.figure(figsize=(10, 3))
for i in range(4):
plt.subplot(1, 4, i + 1)
plt.imshow(X_train[i], cmap='gray')
plt.title(f'Label: {y_train[i]}')
plt.axis('off')
plt.tight_layout()
plt.show()
# развернем каждое изображение 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)
from keras.models import Sequential
from keras.layers import Dense# 1. создаем модель - объявляем ее объектом класса Sequential
model = Sequential()
# 2. добавляем выходной слой(скрытые слои отсутствуют)
model.add(Dense(units=num_classes, activation='softmax'))
# 3. компилируем модель
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])# вывод информации об архитектуре модели
print(model.summary())Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ │ dense (Dense) │ ? │ 0 (unbuilt) │ └─────────────────────────────────┴────────────────────────┴───────────────┘
Total params: 0 (0.00 B)
Trainable params: 0 (0.00 B)
Non-trainable params: 0 (0.00 B)
None
# обучение модели
H = model.fit(X_train, y_train, validation_split=0.1, epochs=50)Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 3ms/step - accuracy: 0.7052 - loss: 1.1704 - val_accuracy: 0.8648 - val_loss: 0.5294
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 2ms/step - accuracy: 0.8749 - loss: 0.4901 - val_accuracy: 0.8818 - val_loss: 0.4435
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.8904 - loss: 0.4153 - val_accuracy: 0.8877 - val_loss: 0.4085
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8953 - loss: 0.3858 - val_accuracy: 0.8927 - val_loss: 0.3866
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8984 - loss: 0.3630 - val_accuracy: 0.8950 - val_loss: 0.3737
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9014 - loss: 0.3549 - val_accuracy: 0.8977 - val_loss: 0.3633
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9036 - loss: 0.3455 - val_accuracy: 0.8998 - val_loss: 0.3553
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9061 - loss: 0.3383 - val_accuracy: 0.8998 - val_loss: 0.3495
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9086 - loss: 0.3254 - val_accuracy: 0.9020 - val_loss: 0.3454
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9077 - loss: 0.3282 - val_accuracy: 0.9027 - val_loss: 0.3392
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9085 - loss: 0.3243 - val_accuracy: 0.9033 - val_loss: 0.3359
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9088 - loss: 0.3229 - val_accuracy: 0.9050 - val_loss: 0.3331
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9114 - loss: 0.3137 - val_accuracy: 0.9067 - val_loss: 0.3293
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9139 - loss: 0.3097 - val_accuracy: 0.9073 - val_loss: 0.3271
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9127 - loss: 0.3052 - val_accuracy: 0.9067 - val_loss: 0.3254
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9148 - loss: 0.3067 - val_accuracy: 0.9088 - val_loss: 0.3222
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9136 - loss: 0.3047 - val_accuracy: 0.9095 - val_loss: 0.3213
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9157 - loss: 0.3049 - val_accuracy: 0.9087 - val_loss: 0.3198
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9178 - loss: 0.2938 - val_accuracy: 0.9097 - val_loss: 0.3177
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9141 - loss: 0.3037 - val_accuracy: 0.9105 - val_loss: 0.3158
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9168 - loss: 0.2952 - val_accuracy: 0.9107 - val_loss: 0.3149
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9179 - loss: 0.2888 - val_accuracy: 0.9125 - val_loss: 0.3139
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9177 - loss: 0.2941 - val_accuracy: 0.9120 - val_loss: 0.3125
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9165 - loss: 0.2934 - val_accuracy: 0.9125 - val_loss: 0.3116
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9200 - loss: 0.2852 - val_accuracy: 0.9127 - val_loss: 0.3105
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9203 - loss: 0.2877 - val_accuracy: 0.9127 - val_loss: 0.3093
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9185 - loss: 0.2870 - val_accuracy: 0.9137 - val_loss: 0.3085
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9200 - loss: 0.2881 - val_accuracy: 0.9137 - val_loss: 0.3074
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9200 - loss: 0.2854 - val_accuracy: 0.9127 - val_loss: 0.3078
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9200 - loss: 0.2857 - val_accuracy: 0.9138 - val_loss: 0.3063
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9216 - loss: 0.2837 - val_accuracy: 0.9140 - val_loss: 0.3061
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9207 - loss: 0.2842 - val_accuracy: 0.9145 - val_loss: 0.3049
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9205 - loss: 0.2792 - val_accuracy: 0.9138 - val_loss: 0.3048
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9220 - loss: 0.2804 - val_accuracy: 0.9148 - val_loss: 0.3034
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9208 - loss: 0.2800 - val_accuracy: 0.9143 - val_loss: 0.3033
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9236 - loss: 0.2748 - val_accuracy: 0.9150 - val_loss: 0.3031
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9230 - loss: 0.2763 - val_accuracy: 0.9148 - val_loss: 0.3018
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9225 - loss: 0.2761 - val_accuracy: 0.9158 - val_loss: 0.3014
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9234 - loss: 0.2792 - val_accuracy: 0.9153 - val_loss: 0.3017
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9224 - loss: 0.2742 - val_accuracy: 0.9157 - val_loss: 0.3012
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9215 - loss: 0.2789 - val_accuracy: 0.9160 - val_loss: 0.3010
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9233 - loss: 0.2786 - val_accuracy: 0.9150 - val_loss: 0.2998
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9228 - loss: 0.2766 - val_accuracy: 0.9165 - val_loss: 0.2997
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9238 - loss: 0.2741 - val_accuracy: 0.9163 - val_loss: 0.2988
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9218 - loss: 0.2820 - val_accuracy: 0.9157 - val_loss: 0.3000
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9230 - loss: 0.2773 - val_accuracy: 0.9158 - val_loss: 0.2996
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9245 - loss: 0.2670 - val_accuracy: 0.9155 - val_loss: 0.2980
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9255 - loss: 0.2701 - val_accuracy: 0.9172 - val_loss: 0.2982
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9260 - loss: 0.2650 - val_accuracy: 0.9152 - val_loss: 0.2985
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9238 - loss: 0.2699 - val_accuracy: 0.9158 - val_loss: 0.2973
# вывод графика ошибки по эпохам
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()
# Оценка качества работы модели на тестовых данных
scores = model.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.9313 - loss: 0.2648
Loss on test data: 0.2729383409023285
Accuracy on test data: 0.9290000200271606
# сохранение модели на диск
model.save('/content/drive/MyDrive/Colab Notebooks/models/model_zero_hide.keras')model100 = Sequential()
model100.add(Dense(units=100,input_dim=num_pixels, activation='sigmoid'))
model100.add(Dense(units=num_classes, activation='softmax'))
model100.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])/usr/local/lib/python3.12/dist-packages/keras/src/layers/core/dense.py:93: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
super().__init__(activity_regularizer=activity_regularizer, **kwargs)
# вывод информации об архитектуре модели
print(model100.summary())Model: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ │ dense_1 (Dense) │ (None, 100) │ 78,500 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dense_2 (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 = model100.fit(X_train, y_train, validation_split=0.1, epochs=50)Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.5502 - loss: 1.8732 - val_accuracy: 0.8025 - val_loss: 0.9640
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8292 - loss: 0.8451 - val_accuracy: 0.8508 - val_loss: 0.6354
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8635 - loss: 0.5842 - val_accuracy: 0.8683 - val_loss: 0.5187
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8762 - loss: 0.4870 - val_accuracy: 0.8822 - val_loss: 0.4603
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8868 - loss: 0.4312 - val_accuracy: 0.8875 - val_loss: 0.4235
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8923 - loss: 0.3969 - val_accuracy: 0.8895 - val_loss: 0.3990
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9005 - loss: 0.3701 - val_accuracy: 0.8928 - val_loss: 0.3803
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8989 - loss: 0.3632 - val_accuracy: 0.8953 - val_loss: 0.3663
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9030 - loss: 0.3459 - val_accuracy: 0.8978 - val_loss: 0.3544
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9062 - loss: 0.3328 - val_accuracy: 0.9023 - val_loss: 0.3453
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9074 - loss: 0.3243 - val_accuracy: 0.9022 - val_loss: 0.3375
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9113 - loss: 0.3149 - val_accuracy: 0.9035 - val_loss: 0.3297
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9120 - loss: 0.3104 - val_accuracy: 0.9052 - val_loss: 0.3228
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9144 - loss: 0.3048 - val_accuracy: 0.9068 - val_loss: 0.3173
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9159 - loss: 0.2928 - val_accuracy: 0.9102 - val_loss: 0.3116
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9166 - loss: 0.2904 - val_accuracy: 0.9090 - val_loss: 0.3064
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9177 - loss: 0.2865 - val_accuracy: 0.9115 - val_loss: 0.3017
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9199 - loss: 0.2805 - val_accuracy: 0.9120 - val_loss: 0.2973
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9195 - loss: 0.2783 - val_accuracy: 0.9135 - val_loss: 0.2932
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9211 - loss: 0.2715 - val_accuracy: 0.9147 - val_loss: 0.2893
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9229 - loss: 0.2675 - val_accuracy: 0.9153 - val_loss: 0.2852
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9244 - loss: 0.2652 - val_accuracy: 0.9180 - val_loss: 0.2811
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9255 - loss: 0.2609 - val_accuracy: 0.9187 - val_loss: 0.2773
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9251 - loss: 0.2604 - val_accuracy: 0.9187 - val_loss: 0.2742
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9299 - loss: 0.2488 - val_accuracy: 0.9195 - val_loss: 0.2709
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9280 - loss: 0.2515 - val_accuracy: 0.9220 - val_loss: 0.2682
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9307 - loss: 0.2441 - val_accuracy: 0.9222 - val_loss: 0.2644
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9316 - loss: 0.2375 - val_accuracy: 0.9238 - val_loss: 0.2610
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9312 - loss: 0.2440 - val_accuracy: 0.9255 - val_loss: 0.2580
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 2ms/step - accuracy: 0.9312 - loss: 0.2367 - val_accuracy: 0.9263 - val_loss: 0.2551
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9324 - loss: 0.2357 - val_accuracy: 0.9280 - val_loss: 0.2521
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9339 - loss: 0.2265 - val_accuracy: 0.9278 - val_loss: 0.2496
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9342 - loss: 0.2287 - val_accuracy: 0.9292 - val_loss: 0.2474
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9347 - loss: 0.2254 - val_accuracy: 0.9308 - val_loss: 0.2444
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9354 - loss: 0.2232 - val_accuracy: 0.9310 - val_loss: 0.2420
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9390 - loss: 0.2149 - val_accuracy: 0.9323 - val_loss: 0.2397
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9366 - loss: 0.2205 - val_accuracy: 0.9320 - val_loss: 0.2379
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9411 - loss: 0.2096 - val_accuracy: 0.9335 - val_loss: 0.2350
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9380 - loss: 0.2149 - val_accuracy: 0.9353 - val_loss: 0.2327
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9390 - loss: 0.2137 - val_accuracy: 0.9358 - val_loss: 0.2310
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9407 - loss: 0.2100 - val_accuracy: 0.9355 - val_loss: 0.2284
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9395 - loss: 0.2092 - val_accuracy: 0.9360 - val_loss: 0.2263
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9408 - loss: 0.2079 - val_accuracy: 0.9385 - val_loss: 0.2242
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9420 - loss: 0.2044 - val_accuracy: 0.9375 - val_loss: 0.2228
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9446 - loss: 0.1978 - val_accuracy: 0.9382 - val_loss: 0.2203
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9455 - loss: 0.1935 - val_accuracy: 0.9397 - val_loss: 0.2186
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9455 - loss: 0.1934 - val_accuracy: 0.9395 - val_loss: 0.2169
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9433 - loss: 0.1970 - val_accuracy: 0.9405 - val_loss: 0.2147
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9467 - loss: 0.1893 - val_accuracy: 0.9403 - val_loss: 0.2130
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9443 - loss: 0.1918 - val_accuracy: 0.9403 - val_loss: 0.2114
# вывод графика ошибки по эпохам
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()
# Оценка качества работы модели на тестовых данных
scores = model100.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9500 - loss: 0.1884
Loss on test data: 0.1930633932352066
Accuracy on test data: 0.9473999738693237
# сохранение модели на диск
model100.save('/content/drive/MyDrive/Colab Notebooks/models/model100in_1hide.keras')model300 = Sequential()
model300.add(Dense(units=300,input_dim=num_pixels, activation='sigmoid'))
model300.add(Dense(units=num_classes, activation='softmax'))
model300.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])# вывод информации об архитектуре модели
print(model300.summary())Model: "sequential_2"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ │ dense_3 (Dense) │ (None, 300) │ 235,500 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dense_4 (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 = model300.fit(X_train, y_train, validation_split=0.1, epochs=50)Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.5442 - loss: 1.8087 - val_accuracy: 0.8263 - val_loss: 0.8667
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8410 - loss: 0.7567 - val_accuracy: 0.8605 - val_loss: 0.5823
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8672 - loss: 0.5408 - val_accuracy: 0.8788 - val_loss: 0.4845
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.8809 - loss: 0.4565 - val_accuracy: 0.8853 - val_loss: 0.4378
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8884 - loss: 0.4120 - val_accuracy: 0.8902 - val_loss: 0.4057
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8944 - loss: 0.3836 - val_accuracy: 0.8932 - val_loss: 0.3863
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8988 - loss: 0.3663 - val_accuracy: 0.8943 - val_loss: 0.3728
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9008 - loss: 0.3515 - val_accuracy: 0.8965 - val_loss: 0.3612
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8987 - loss: 0.3487 - val_accuracy: 0.8998 - val_loss: 0.3534
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9036 - loss: 0.3349 - val_accuracy: 0.9012 - val_loss: 0.3445
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9058 - loss: 0.3285 - val_accuracy: 0.9020 - val_loss: 0.3373
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9090 - loss: 0.3196 - val_accuracy: 0.9027 - val_loss: 0.3317
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9099 - loss: 0.3148 - val_accuracy: 0.9047 - val_loss: 0.3273
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9103 - loss: 0.3114 - val_accuracy: 0.9057 - val_loss: 0.3228
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9112 - loss: 0.3046 - val_accuracy: 0.9062 - val_loss: 0.3188
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9114 - loss: 0.3055 - val_accuracy: 0.9063 - val_loss: 0.3172
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9142 - loss: 0.3020 - val_accuracy: 0.9080 - val_loss: 0.3124
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9158 - loss: 0.2907 - val_accuracy: 0.9100 - val_loss: 0.3096
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9149 - loss: 0.2954 - val_accuracy: 0.9097 - val_loss: 0.3062
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9164 - loss: 0.2920 - val_accuracy: 0.9093 - val_loss: 0.3038
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9194 - loss: 0.2833 - val_accuracy: 0.9095 - val_loss: 0.3036
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9203 - loss: 0.2754 - val_accuracy: 0.9132 - val_loss: 0.2985
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9178 - loss: 0.2827 - val_accuracy: 0.9130 - val_loss: 0.2952
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9191 - loss: 0.2785 - val_accuracy: 0.9145 - val_loss: 0.2926
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9210 - loss: 0.2731 - val_accuracy: 0.9153 - val_loss: 0.2902
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9212 - loss: 0.2696 - val_accuracy: 0.9160 - val_loss: 0.2883
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9231 - loss: 0.2671 - val_accuracy: 0.9150 - val_loss: 0.2859
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9225 - loss: 0.2670 - val_accuracy: 0.9170 - val_loss: 0.2843
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9257 - loss: 0.2608 - val_accuracy: 0.9177 - val_loss: 0.2822
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9243 - loss: 0.2626 - val_accuracy: 0.9173 - val_loss: 0.2823
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9273 - loss: 0.2526 - val_accuracy: 0.9193 - val_loss: 0.2783
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9263 - loss: 0.2588 - val_accuracy: 0.9192 - val_loss: 0.2758
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9269 - loss: 0.2553 - val_accuracy: 0.9193 - val_loss: 0.2740
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9264 - loss: 0.2576 - val_accuracy: 0.9198 - val_loss: 0.2711
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9274 - loss: 0.2499 - val_accuracy: 0.9208 - val_loss: 0.2690
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9305 - loss: 0.2441 - val_accuracy: 0.9220 - val_loss: 0.2671
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9299 - loss: 0.2412 - val_accuracy: 0.9223 - val_loss: 0.2650
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9290 - loss: 0.2495 - val_accuracy: 0.9237 - val_loss: 0.2614
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9311 - loss: 0.2420 - val_accuracy: 0.9235 - val_loss: 0.2601
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9337 - loss: 0.2365 - val_accuracy: 0.9272 - val_loss: 0.2579
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9326 - loss: 0.2376 - val_accuracy: 0.9258 - val_loss: 0.2568
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9314 - loss: 0.2355 - val_accuracy: 0.9258 - val_loss: 0.2546
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9342 - loss: 0.2315 - val_accuracy: 0.9270 - val_loss: 0.2523
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9331 - loss: 0.2326 - val_accuracy: 0.9285 - val_loss: 0.2498
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9357 - loss: 0.2261 - val_accuracy: 0.9278 - val_loss: 0.2489
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9356 - loss: 0.2213 - val_accuracy: 0.9298 - val_loss: 0.2464
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9373 - loss: 0.2186 - val_accuracy: 0.9295 - val_loss: 0.2450
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9366 - loss: 0.2220 - val_accuracy: 0.9312 - val_loss: 0.2420
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9370 - loss: 0.2196 - val_accuracy: 0.9318 - val_loss: 0.2396
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9348 - loss: 0.2232 - val_accuracy: 0.9327 - val_loss: 0.2386
# вывод графика ошибки по эпохам
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()
# Оценка качества работы модели на тестовых данных
scores = model300.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9444 - loss: 0.2126
Loss on test data: 0.2181043177843094
Accuracy on test data: 0.9419999718666077
# сохранение модели на диск
model300.save('/content/drive/MyDrive/Colab Notebooks/models/model300in_1hide.keras')model500 = Sequential()
model500.add(Dense(units=500,input_dim=num_pixels, activation='sigmoid'))
model500.add(Dense(units=num_classes, activation='softmax'))
model500.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])# вывод информации об архитектуре модели
print(model500.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 = model500.fit(X_train, y_train, validation_split=0.1, epochs=50)Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 4ms/step - accuracy: 0.5502 - loss: 1.7606 - val_accuracy: 0.8245 - val_loss: 0.8323
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 2ms/step - accuracy: 0.8380 - loss: 0.7271 - val_accuracy: 0.8622 - val_loss: 0.5687
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8677 - loss: 0.5258 - val_accuracy: 0.8782 - val_loss: 0.4738
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.8807 - loss: 0.4537 - val_accuracy: 0.8863 - val_loss: 0.4287
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.8888 - loss: 0.4060 - val_accuracy: 0.8903 - val_loss: 0.4030
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.8949 - loss: 0.3814 - val_accuracy: 0.8942 - val_loss: 0.3843
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8982 - loss: 0.3631 - val_accuracy: 0.8970 - val_loss: 0.3695
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8990 - loss: 0.3528 - val_accuracy: 0.8935 - val_loss: 0.3625
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9019 - loss: 0.3448 - val_accuracy: 0.8982 - val_loss: 0.3532
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9052 - loss: 0.3285 - val_accuracy: 0.8998 - val_loss: 0.3444
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9065 - loss: 0.3287 - val_accuracy: 0.9022 - val_loss: 0.3391
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9066 - loss: 0.3208 - val_accuracy: 0.9023 - val_loss: 0.3360
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9091 - loss: 0.3170 - val_accuracy: 0.9042 - val_loss: 0.3292
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9096 - loss: 0.3107 - val_accuracy: 0.9048 - val_loss: 0.3239
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9116 - loss: 0.3105 - val_accuracy: 0.9042 - val_loss: 0.3225
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9118 - loss: 0.3031 - val_accuracy: 0.9078 - val_loss: 0.3180
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9128 - loss: 0.3061 - val_accuracy: 0.9065 - val_loss: 0.3144
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9151 - loss: 0.2968 - val_accuracy: 0.9088 - val_loss: 0.3116
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9161 - loss: 0.2913 - val_accuracy: 0.9080 - val_loss: 0.3132
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9163 - loss: 0.2925 - val_accuracy: 0.9098 - val_loss: 0.3081
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9180 - loss: 0.2858 - val_accuracy: 0.9102 - val_loss: 0.3045
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9178 - loss: 0.2867 - val_accuracy: 0.9110 - val_loss: 0.3036
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9165 - loss: 0.2874 - val_accuracy: 0.9118 - val_loss: 0.3011
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9202 - loss: 0.2799 - val_accuracy: 0.9127 - val_loss: 0.3019
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9191 - loss: 0.2846 - val_accuracy: 0.9135 - val_loss: 0.2968
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9189 - loss: 0.2767 - val_accuracy: 0.9125 - val_loss: 0.2945
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9225 - loss: 0.2693 - val_accuracy: 0.9137 - val_loss: 0.2928
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9216 - loss: 0.2754 - val_accuracy: 0.9148 - val_loss: 0.2929
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9194 - loss: 0.2785 - val_accuracy: 0.9142 - val_loss: 0.2902
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9216 - loss: 0.2678 - val_accuracy: 0.9155 - val_loss: 0.2876
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9236 - loss: 0.2649 - val_accuracy: 0.9170 - val_loss: 0.2861
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9227 - loss: 0.2678 - val_accuracy: 0.9165 - val_loss: 0.2858
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9258 - loss: 0.2604 - val_accuracy: 0.9178 - val_loss: 0.2847
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9246 - loss: 0.2639 - val_accuracy: 0.9167 - val_loss: 0.2817
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9277 - loss: 0.2580 - val_accuracy: 0.9160 - val_loss: 0.2807
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9234 - loss: 0.2612 - val_accuracy: 0.9190 - val_loss: 0.2780
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9271 - loss: 0.2556 - val_accuracy: 0.9203 - val_loss: 0.2764
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9264 - loss: 0.2554 - val_accuracy: 0.9207 - val_loss: 0.2735
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9289 - loss: 0.2531 - val_accuracy: 0.9202 - val_loss: 0.2733
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9259 - loss: 0.2578 - val_accuracy: 0.9225 - val_loss: 0.2709
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9291 - loss: 0.2455 - val_accuracy: 0.9223 - val_loss: 0.2692
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 2ms/step - accuracy: 0.9291 - loss: 0.2465 - val_accuracy: 0.9230 - val_loss: 0.2671
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9297 - loss: 0.2432 - val_accuracy: 0.9223 - val_loss: 0.2655
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9308 - loss: 0.2454 - val_accuracy: 0.9238 - val_loss: 0.2642
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9318 - loss: 0.2391 - val_accuracy: 0.9257 - val_loss: 0.2611
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9320 - loss: 0.2421 - val_accuracy: 0.9243 - val_loss: 0.2619
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9342 - loss: 0.2357 - val_accuracy: 0.9253 - val_loss: 0.2592
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9342 - loss: 0.2313 - val_accuracy: 0.9255 - val_loss: 0.2562
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9325 - loss: 0.2370 - val_accuracy: 0.9275 - val_loss: 0.2550
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9341 - loss: 0.2305 - val_accuracy: 0.9290 - val_loss: 0.2525
# вывод графика ошибки по эпохам
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()
# Оценка качества работы модели на тестовых данных
scores = model500.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9401 - loss: 0.2261
Loss on test data: 0.2324201464653015
Accuracy on test data: 0.9376000165939331
# сохранение модели на диск
model500.save('/content/drive/MyDrive/Colab Notebooks/models/model500in_1hide.keras')model10050 = Sequential()
model10050.add(Dense(units=100,input_dim=num_pixels, activation='sigmoid'))
model10050.add(Dense(units=50,activation='sigmoid'))
model10050.add(Dense(units=num_classes, activation='softmax'))
model10050.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])# вывод информации об архитектуре модели
print(model10050.summary())Model: "sequential_4"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ │ dense_7 (Dense) │ (None, 100) │ 78,500 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dense_8 (Dense) │ (None, 50) │ 5,050 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dense_9 (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 = model10050.fit(X_train, y_train, validation_split=0.1, epochs=50)Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 4ms/step - accuracy: 0.2227 - loss: 2.2802 - val_accuracy: 0.4622 - val_loss: 2.0805
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.5419 - loss: 1.9606 - val_accuracy: 0.6317 - val_loss: 1.5174
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.6736 - loss: 1.3815 - val_accuracy: 0.7442 - val_loss: 1.0607
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.7579 - loss: 0.9849 - val_accuracy: 0.7940 - val_loss: 0.8175
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8073 - loss: 0.7717 - val_accuracy: 0.8348 - val_loss: 0.6708
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 3ms/step - accuracy: 0.8399 - loss: 0.6320 - val_accuracy: 0.8545 - val_loss: 0.5783
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8582 - loss: 0.5480 - val_accuracy: 0.8662 - val_loss: 0.5183
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8725 - loss: 0.4895 - val_accuracy: 0.8743 - val_loss: 0.4753
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.8778 - loss: 0.4514 - val_accuracy: 0.8790 - val_loss: 0.4448
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8848 - loss: 0.4211 - val_accuracy: 0.8845 - val_loss: 0.4208
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.8904 - loss: 0.3980 - val_accuracy: 0.8872 - val_loss: 0.4040
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.8963 - loss: 0.3766 - val_accuracy: 0.8903 - val_loss: 0.3874
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8963 - loss: 0.3704 - val_accuracy: 0.8932 - val_loss: 0.3759
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9000 - loss: 0.3562 - val_accuracy: 0.8953 - val_loss: 0.3654
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9022 - loss: 0.3458 - val_accuracy: 0.8972 - val_loss: 0.3559
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9033 - loss: 0.3372 - val_accuracy: 0.9003 - val_loss: 0.3458
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9073 - loss: 0.3226 - val_accuracy: 0.9025 - val_loss: 0.3394
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9084 - loss: 0.3189 - val_accuracy: 0.9032 - val_loss: 0.3316
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9121 - loss: 0.3062 - val_accuracy: 0.9063 - val_loss: 0.3253
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9116 - loss: 0.3051 - val_accuracy: 0.9073 - val_loss: 0.3189
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9117 - loss: 0.2999 - val_accuracy: 0.9090 - val_loss: 0.3139
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9157 - loss: 0.2935 - val_accuracy: 0.9098 - val_loss: 0.3081
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9183 - loss: 0.2849 - val_accuracy: 0.9115 - val_loss: 0.3033
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9186 - loss: 0.2827 - val_accuracy: 0.9135 - val_loss: 0.2988
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9186 - loss: 0.2792 - val_accuracy: 0.9140 - val_loss: 0.2947
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9209 - loss: 0.2732 - val_accuracy: 0.9148 - val_loss: 0.2894
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9216 - loss: 0.2741 - val_accuracy: 0.9165 - val_loss: 0.2861
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9196 - loss: 0.2729 - val_accuracy: 0.9183 - val_loss: 0.2810
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9239 - loss: 0.2641 - val_accuracy: 0.9190 - val_loss: 0.2772
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9256 - loss: 0.2613 - val_accuracy: 0.9213 - val_loss: 0.2737
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9260 - loss: 0.2544 - val_accuracy: 0.9210 - val_loss: 0.2696
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9294 - loss: 0.2466 - val_accuracy: 0.9232 - val_loss: 0.2658
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9275 - loss: 0.2482 - val_accuracy: 0.9233 - val_loss: 0.2626
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9288 - loss: 0.2404 - val_accuracy: 0.9250 - val_loss: 0.2584
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9310 - loss: 0.2387 - val_accuracy: 0.9265 - val_loss: 0.2551
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9301 - loss: 0.2390 - val_accuracy: 0.9272 - val_loss: 0.2522
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9314 - loss: 0.2333 - val_accuracy: 0.9277 - val_loss: 0.2482
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9345 - loss: 0.2272 - val_accuracy: 0.9292 - val_loss: 0.2450
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9349 - loss: 0.2244 - val_accuracy: 0.9292 - val_loss: 0.2427
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9345 - loss: 0.2283 - val_accuracy: 0.9310 - val_loss: 0.2396
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9354 - loss: 0.2187 - val_accuracy: 0.9318 - val_loss: 0.2364
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9368 - loss: 0.2170 - val_accuracy: 0.9323 - val_loss: 0.2334
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9370 - loss: 0.2121 - val_accuracy: 0.9338 - val_loss: 0.2301
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9382 - loss: 0.2116 - val_accuracy: 0.9337 - val_loss: 0.2280
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9387 - loss: 0.2097 - val_accuracy: 0.9357 - val_loss: 0.2244
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9402 - loss: 0.2091 - val_accuracy: 0.9373 - val_loss: 0.2222
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9410 - loss: 0.2006 - val_accuracy: 0.9373 - val_loss: 0.2200
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9406 - loss: 0.2033 - val_accuracy: 0.9390 - val_loss: 0.2178
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9425 - loss: 0.2008 - val_accuracy: 0.9398 - val_loss: 0.2144
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9433 - loss: 0.1953 - val_accuracy: 0.9400 - val_loss: 0.2120
# вывод графика ошибки по эпохам
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()
# Оценка качества работы модели на тестовых данных
scores = model10050.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.9476 - loss: 0.1931
Loss on test data: 0.1974852979183197
Accuracy on test data: 0.9449999928474426
# сохранение модели на диск
model10050.save('/content/drive/MyDrive/Colab Notebooks/models/model100in_1hide_50in_2hide.keras')model100100 = Sequential()
model100100.add(Dense(units=100,input_dim=num_pixels, activation='sigmoid'))
model100100.add(Dense(units=100,activation='sigmoid'))
model100100.add(Dense(units=num_classes, activation='softmax'))
model100100.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])# вывод информации об архитектуре модели
print(model100100.summary())Model: "sequential_5"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ │ dense_10 (Dense) │ (None, 100) │ 78,500 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dense_11 (Dense) │ (None, 100) │ 10,100 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dense_12 (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 = model100100.fit(X_train, y_train, validation_split=0.1, epochs=50)Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.2072 - loss: 2.2849 - val_accuracy: 0.5913 - val_loss: 2.1135
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.5483 - loss: 2.0036 - val_accuracy: 0.6333 - val_loss: 1.5555
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.6781 - loss: 1.4029 - val_accuracy: 0.7727 - val_loss: 1.0336
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.7912 - loss: 0.9437 - val_accuracy: 0.8180 - val_loss: 0.7608
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8356 - loss: 0.7032 - val_accuracy: 0.8483 - val_loss: 0.6186
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.8556 - loss: 0.5826 - val_accuracy: 0.8627 - val_loss: 0.5368
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8689 - loss: 0.5120 - val_accuracy: 0.8722 - val_loss: 0.4862
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8786 - loss: 0.4576 - val_accuracy: 0.8790 - val_loss: 0.4503
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 2ms/step - accuracy: 0.8854 - loss: 0.4263 - val_accuracy: 0.8833 - val_loss: 0.4242
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.8909 - loss: 0.3984 - val_accuracy: 0.8878 - val_loss: 0.4031
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.8927 - loss: 0.3848 - val_accuracy: 0.8900 - val_loss: 0.3876
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.8989 - loss: 0.3638 - val_accuracy: 0.8925 - val_loss: 0.3750
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9014 - loss: 0.3527 - val_accuracy: 0.8957 - val_loss: 0.3617
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9024 - loss: 0.3423 - val_accuracy: 0.8970 - val_loss: 0.3520
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9061 - loss: 0.3291 - val_accuracy: 0.8997 - val_loss: 0.3436
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9058 - loss: 0.3264 - val_accuracy: 0.9007 - val_loss: 0.3367
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9089 - loss: 0.3168 - val_accuracy: 0.9027 - val_loss: 0.3297
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9094 - loss: 0.3103 - val_accuracy: 0.9058 - val_loss: 0.3220
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9138 - loss: 0.2969 - val_accuracy: 0.9057 - val_loss: 0.3165
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9158 - loss: 0.2941 - val_accuracy: 0.9073 - val_loss: 0.3119
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9167 - loss: 0.2889 - val_accuracy: 0.9095 - val_loss: 0.3054
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9189 - loss: 0.2806 - val_accuracy: 0.9118 - val_loss: 0.2994
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9200 - loss: 0.2785 - val_accuracy: 0.9128 - val_loss: 0.2947
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9224 - loss: 0.2694 - val_accuracy: 0.9150 - val_loss: 0.2898
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9214 - loss: 0.2677 - val_accuracy: 0.9172 - val_loss: 0.2862
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9225 - loss: 0.2662 - val_accuracy: 0.9172 - val_loss: 0.2817
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9231 - loss: 0.2641 - val_accuracy: 0.9187 - val_loss: 0.2759
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9250 - loss: 0.2588 - val_accuracy: 0.9188 - val_loss: 0.2733
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9260 - loss: 0.2537 - val_accuracy: 0.9215 - val_loss: 0.2682
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9269 - loss: 0.2510 - val_accuracy: 0.9215 - val_loss: 0.2658
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9268 - loss: 0.2502 - val_accuracy: 0.9227 - val_loss: 0.2614
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9278 - loss: 0.2475 - val_accuracy: 0.9270 - val_loss: 0.2576
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9297 - loss: 0.2409 - val_accuracy: 0.9263 - val_loss: 0.2536
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9311 - loss: 0.2362 - val_accuracy: 0.9272 - val_loss: 0.2501
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9327 - loss: 0.2292 - val_accuracy: 0.9282 - val_loss: 0.2479
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9351 - loss: 0.2239 - val_accuracy: 0.9302 - val_loss: 0.2431
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9332 - loss: 0.2269 - val_accuracy: 0.9303 - val_loss: 0.2405
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9348 - loss: 0.2221 - val_accuracy: 0.9300 - val_loss: 0.2366
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9389 - loss: 0.2137 - val_accuracy: 0.9335 - val_loss: 0.2344
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9400 - loss: 0.2088 - val_accuracy: 0.9338 - val_loss: 0.2310
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9394 - loss: 0.2086 - val_accuracy: 0.9330 - val_loss: 0.2284
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9423 - loss: 0.1993 - val_accuracy: 0.9342 - val_loss: 0.2245
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9400 - loss: 0.2072 - val_accuracy: 0.9343 - val_loss: 0.2242
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9419 - loss: 0.1991 - val_accuracy: 0.9370 - val_loss: 0.2197
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9441 - loss: 0.1937 - val_accuracy: 0.9358 - val_loss: 0.2195
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9437 - loss: 0.1969 - val_accuracy: 0.9392 - val_loss: 0.2144
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9447 - loss: 0.1885 - val_accuracy: 0.9380 - val_loss: 0.2123
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9447 - loss: 0.1914 - val_accuracy: 0.9402 - val_loss: 0.2101
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9442 - loss: 0.1929 - val_accuracy: 0.9412 - val_loss: 0.2070
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9450 - loss: 0.1935 - val_accuracy: 0.9417 - val_loss: 0.2049
# вывод графика ошибки по эпохам
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()
# Оценка качества работы модели на тестовых данных
scores = model100100.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.9485 - loss: 0.1814
Loss on test data: 0.18734164535999298
Accuracy on test data: 0.9470000267028809
# сохранение модели на диск
model100100.save('/content/drive/MyDrive/Colab Notebooks/models/model100in_1hide_100in_2hide.keras')# сохранение лучшей модели в папку best_model
model100.save('/content/drive/MyDrive/Colab Notebooks/best_model/model100.keras')# Загрузка модели с диска
from keras.models import load_model
model = load_model('/content/drive/MyDrive/Colab Notebooks/best_model/model100.keras')# вывод тестового изображения и результата распознавания
n = 222
result = model.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 27ms/step
NN output: [[3.7926259e-03 9.0994104e-07 2.0981293e-04 2.9478846e-02 2.0727816e-06
9.6508384e-01 7.6052487e-07 5.7595258e-05 1.0619552e-03 3.1140275e-04]]

Real mark: 5
NN answer: 5
# вывод тестового изображения и результата распознавания
n = 123
result = model.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 37ms/step
NN output: [[7.6678516e-06 2.1507578e-06 2.5754166e-04 6.3994766e-04 2.8644723e-04
2.3038971e-04 1.0776109e-05 2.3045135e-05 9.9186021e-01 6.6818334e-03]]

Real mark: 8
NN answer: 8
# загрузка собственного изображения
from PIL import Image
file_data = Image.open('test.png')
file_data = file_data.convert('L') # перевод в градации серого
test_img = np.array(file_data)# вывод собственного изображения
plt.imshow(test_img, cmap=plt.get_cmap('gray'))
plt.show()
# предобработка
test_img = test_img / 255
test_img = test_img.reshape(1, num_pixels)
# распознавание
result = model.predict(test_img)
print('I think it\'s ', np.argmax(result))
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
I think it's 2
# загрузка собственного изображения
from PIL import Image
file2_data = Image.open('test2.png')
file2_data = file2_data.convert('L') # перевод в градации серого
test2_img = np.array(file2_data)# вывод собственного изображения
plt.imshow(test2_img, cmap=plt.get_cmap('gray'))
plt.show()
# предобработка
test2_img = test2_img / 255
test2_img = test2_img.reshape(1, num_pixels)
# распознавание
result_2 = model.predict(test2_img)
print('I think it\'s ', np.argmax(result_2))
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
I think it's 8
# загрузка собственного изображения, повернутого на 90 градусов
from PIL import Image
file90_data = Image.open('test90.png')
file90_data = file90_data.convert('L') # перевод в градации серого
test90_img = np.array(file90_data)# вывод собственного изображения
plt.imshow(test90_img, cmap=plt.get_cmap('gray'))
plt.show()
# предобработка
test90_img = test90_img / 255
test90_img = test90_img.reshape(1, num_pixels)
# распознавание
result_3 = model.predict(test90_img)
print('I think it\'s ', np.argmax(result_3))
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step
I think it's 8
# загрузка собственного изображения, повернутого на 90 градусов
from PIL import Image
file902_data = Image.open('test90_2.png')
file902_data = file902_data.convert('L') # перевод в градации серого
test902_img = np.array(file902_data)# вывод собственного изображения
plt.imshow(test902_img, cmap=plt.get_cmap('gray'))
plt.show()
# предобработка
test902_img = test902_img / 255
test902_img = test902_img.reshape(1, num_pixels)
# распознавание
result_4 = model.predict(test902_img)
print('I think it\'s ', np.argmax(result_4))
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
I think it's 4