форкнуто от main/is_dnn
Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
257 KiB
257 KiB
import osos.chdir('/content/drive/MyDrive/Colab Notebooks')from tensorflow import kerasimport matplotlib.pyplot as plt
import numpy as np
import sklearnfrom keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()# создание своего разбиения датасета
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 = 19)# вывод размерностей
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 изображений и их меток
plt.figure(figsize=(8, 2))
for i in range(4):
plt.subplot(1, 4, i + 1)
plt.imshow(X_train[i].reshape(28, 28), cmap='gray')
plt.title(f'Label: {y_train[i]}', fontsize = 6)
plt.axis('off')
plt.show()
# развертывание изображений 28x28 в вектор длиной 784 и нормализация
num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32') / 255
# кодирование меток по принципу one-hot encoding
from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
num_classes = y_train.shape[1]
# вывод размерностей
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, 784)
Shape of y train: (60000, 10)
Shape of X test: (10000, 784)
Shape of y test: (10000, 10)
# создание модели однослойной нейронной сети
from keras.models import Sequential
from keras.layers import Dense
model0 = Sequential()
# добавляем выходной слой
model0.add(Dense(units=num_classes, input_dim=784, activation='softmax'))
# компиляция модели
model0.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
# вывод информации об архитектуре модели
print(model0.summary())/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)
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ │ dense (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
# обучение модели
H0 = model0.fit(X_train, y_train,
validation_split=0.1,
epochs=50,
verbose=1)
# вывод графика функции ошибки
plt.plot(H0.history['loss'])
plt.plot(H0.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs (Model 0)')
plt.show()Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.6993 - loss: 1.1736 - val_accuracy: 0.8783 - val_loss: 0.5063
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8743 - loss: 0.4869 - val_accuracy: 0.8923 - val_loss: 0.4182
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8883 - loss: 0.4198 - val_accuracy: 0.8995 - val_loss: 0.3825
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8945 - loss: 0.3879 - val_accuracy: 0.9023 - val_loss: 0.3621
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9000 - loss: 0.3696 - val_accuracy: 0.9038 - val_loss: 0.3490
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9042 - loss: 0.3514 - val_accuracy: 0.9062 - val_loss: 0.3391
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9059 - loss: 0.3436 - val_accuracy: 0.9077 - val_loss: 0.3313
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9064 - loss: 0.3362 - val_accuracy: 0.9088 - val_loss: 0.3258
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 6ms/step - accuracy: 0.9096 - loss: 0.3285 - val_accuracy: 0.9100 - val_loss: 0.3211
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9097 - loss: 0.3258 - val_accuracy: 0.9128 - val_loss: 0.3167
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9112 - loss: 0.3213 - val_accuracy: 0.9122 - val_loss: 0.3141
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9115 - loss: 0.3171 - val_accuracy: 0.9142 - val_loss: 0.3105
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9136 - loss: 0.3119 - val_accuracy: 0.9142 - val_loss: 0.3079
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9155 - loss: 0.3036 - val_accuracy: 0.9142 - val_loss: 0.3061
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9136 - loss: 0.3111 - val_accuracy: 0.9162 - val_loss: 0.3036
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9171 - loss: 0.2994 - val_accuracy: 0.9155 - val_loss: 0.3020
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9166 - loss: 0.3025 - val_accuracy: 0.9162 - val_loss: 0.3003
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9182 - loss: 0.2953 - val_accuracy: 0.9172 - val_loss: 0.2993
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9190 - loss: 0.2921 - val_accuracy: 0.9187 - val_loss: 0.2979
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9205 - loss: 0.2882 - val_accuracy: 0.9177 - val_loss: 0.2966
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9177 - loss: 0.2900 - val_accuracy: 0.9185 - val_loss: 0.2959
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9181 - loss: 0.2977 - val_accuracy: 0.9177 - val_loss: 0.2946
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9213 - loss: 0.2840 - val_accuracy: 0.9193 - val_loss: 0.2934
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9206 - loss: 0.2886 - val_accuracy: 0.9190 - val_loss: 0.2931
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9226 - loss: 0.2826 - val_accuracy: 0.9207 - val_loss: 0.2921
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9193 - loss: 0.2895 - val_accuracy: 0.9203 - val_loss: 0.2914
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9198 - loss: 0.2866 - val_accuracy: 0.9207 - val_loss: 0.2909
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9207 - loss: 0.2859 - val_accuracy: 0.9205 - val_loss: 0.2902
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9215 - loss: 0.2854 - val_accuracy: 0.9220 - val_loss: 0.2892
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9198 - loss: 0.2870 - val_accuracy: 0.9213 - val_loss: 0.2888
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9219 - loss: 0.2819 - val_accuracy: 0.9213 - val_loss: 0.2887
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9228 - loss: 0.2815 - val_accuracy: 0.9208 - val_loss: 0.2874
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9234 - loss: 0.2798 - val_accuracy: 0.9220 - val_loss: 0.2875
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9221 - loss: 0.2757 - val_accuracy: 0.9207 - val_loss: 0.2871
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9224 - loss: 0.2753 - val_accuracy: 0.9217 - val_loss: 0.2871
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9226 - loss: 0.2835 - val_accuracy: 0.9215 - val_loss: 0.2865
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9232 - loss: 0.2737 - val_accuracy: 0.9213 - val_loss: 0.2856
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9235 - loss: 0.2779 - val_accuracy: 0.9218 - val_loss: 0.2855
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9216 - loss: 0.2770 - val_accuracy: 0.9223 - val_loss: 0.2851
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9219 - loss: 0.2772 - val_accuracy: 0.9215 - val_loss: 0.2860
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9257 - loss: 0.2697 - val_accuracy: 0.9227 - val_loss: 0.2845
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9232 - loss: 0.2759 - val_accuracy: 0.9240 - val_loss: 0.2840
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9248 - loss: 0.2735 - val_accuracy: 0.9232 - val_loss: 0.2845
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9217 - loss: 0.2812 - val_accuracy: 0.9227 - val_loss: 0.2839
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9240 - loss: 0.2709 - val_accuracy: 0.9232 - val_loss: 0.2836
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9229 - loss: 0.2746 - val_accuracy: 0.9228 - val_loss: 0.2837
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9261 - loss: 0.2700 - val_accuracy: 0.9237 - val_loss: 0.2832
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9252 - loss: 0.2690 - val_accuracy: 0.9233 - val_loss: 0.2828
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9254 - loss: 0.2715 - val_accuracy: 0.9232 - val_loss: 0.2834
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9244 - loss: 0.2735 - val_accuracy: 0.9230 - val_loss: 0.2821

# оценка качества модели на тестовых данных
scores = model0.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.9194 - loss: 0.2818
Loss on test data: 0.28366461396217346
Accuracy on test data: 0.9205999970436096
from keras.models import Sequential
from keras.layers import Dense
neurons = [100, 300, 500]
results = {}
for n in neurons:
print(f'\n=== Модель со скрытым слоем {n} нейронов ===')
# создание модели
model = Sequential()
model.add(Dense(units=n, input_dim=784, activation='sigmoid'))
model.add(Dense(units=num_classes, activation='softmax'))
# компиляция модели
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
# обучение модели
H = model.fit(X_train, y_train,
validation_split=0.1,
epochs=50,
verbose=1) # чтобы не печатать все эпохи
# оценка на тестовых данных
scores = model.evaluate(X_test, y_test, verbose=1)
results[n] = scores[1]
print(f'Accuracy on test data: {scores[1]:.4f}')
=== Модель со скрытым слоем 100 нейронов ===
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.5470 - loss: 1.8791 - val_accuracy: 0.8307 - val_loss: 0.9579
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8333 - loss: 0.8491 - val_accuracy: 0.8707 - val_loss: 0.6103
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8645 - loss: 0.5867 - val_accuracy: 0.8848 - val_loss: 0.4890
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8786 - loss: 0.4860 - val_accuracy: 0.8932 - val_loss: 0.4297
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8874 - loss: 0.4331 - val_accuracy: 0.8978 - val_loss: 0.3938
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8945 - loss: 0.3998 - val_accuracy: 0.9015 - val_loss: 0.3690
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.8971 - loss: 0.3753 - val_accuracy: 0.9052 - val_loss: 0.3520
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9033 - loss: 0.3587 - val_accuracy: 0.9078 - val_loss: 0.3392
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9072 - loss: 0.3403 - val_accuracy: 0.9093 - val_loss: 0.3281
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9071 - loss: 0.3303 - val_accuracy: 0.9107 - val_loss: 0.3193
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9101 - loss: 0.3223 - val_accuracy: 0.9112 - val_loss: 0.3109
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9114 - loss: 0.3160 - val_accuracy: 0.9143 - val_loss: 0.3046
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9147 - loss: 0.3072 - val_accuracy: 0.9143 - val_loss: 0.2991
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9136 - loss: 0.3027 - val_accuracy: 0.9182 - val_loss: 0.2930
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9151 - loss: 0.2963 - val_accuracy: 0.9195 - val_loss: 0.2885
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9166 - loss: 0.2929 - val_accuracy: 0.9182 - val_loss: 0.2843
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9181 - loss: 0.2855 - val_accuracy: 0.9207 - val_loss: 0.2802
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9188 - loss: 0.2818 - val_accuracy: 0.9212 - val_loss: 0.2756
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9212 - loss: 0.2755 - val_accuracy: 0.9223 - val_loss: 0.2717
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9223 - loss: 0.2729 - val_accuracy: 0.9230 - val_loss: 0.2682
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9243 - loss: 0.2675 - val_accuracy: 0.9233 - val_loss: 0.2644
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9242 - loss: 0.2651 - val_accuracy: 0.9252 - val_loss: 0.2618
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9254 - loss: 0.2603 - val_accuracy: 0.9262 - val_loss: 0.2583
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9244 - loss: 0.2603 - val_accuracy: 0.9283 - val_loss: 0.2556
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9277 - loss: 0.2519 - val_accuracy: 0.9287 - val_loss: 0.2522
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9280 - loss: 0.2517 - val_accuracy: 0.9305 - val_loss: 0.2491
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9303 - loss: 0.2481 - val_accuracy: 0.9302 - val_loss: 0.2467
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9301 - loss: 0.2463 - val_accuracy: 0.9303 - val_loss: 0.2443
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9316 - loss: 0.2352 - val_accuracy: 0.9337 - val_loss: 0.2411
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9334 - loss: 0.2310 - val_accuracy: 0.9337 - val_loss: 0.2391
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9334 - loss: 0.2353 - val_accuracy: 0.9357 - val_loss: 0.2363
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9353 - loss: 0.2279 - val_accuracy: 0.9355 - val_loss: 0.2340
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9349 - loss: 0.2285 - val_accuracy: 0.9370 - val_loss: 0.2320
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9360 - loss: 0.2249 - val_accuracy: 0.9377 - val_loss: 0.2297
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9371 - loss: 0.2212 - val_accuracy: 0.9382 - val_loss: 0.2276
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9388 - loss: 0.2134 - val_accuracy: 0.9382 - val_loss: 0.2254
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9379 - loss: 0.2162 - val_accuracy: 0.9397 - val_loss: 0.2227
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9405 - loss: 0.2092 - val_accuracy: 0.9402 - val_loss: 0.2208
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9394 - loss: 0.2109 - val_accuracy: 0.9402 - val_loss: 0.2192
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9396 - loss: 0.2110 - val_accuracy: 0.9418 - val_loss: 0.2173
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9417 - loss: 0.2042 - val_accuracy: 0.9423 - val_loss: 0.2149
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9423 - loss: 0.2015 - val_accuracy: 0.9428 - val_loss: 0.2131
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9430 - loss: 0.2016 - val_accuracy: 0.9437 - val_loss: 0.2111
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9433 - loss: 0.1942 - val_accuracy: 0.9433 - val_loss: 0.2100
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9430 - loss: 0.1969 - val_accuracy: 0.9440 - val_loss: 0.2080
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9448 - loss: 0.1928 - val_accuracy: 0.9442 - val_loss: 0.2063
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9456 - loss: 0.1902 - val_accuracy: 0.9460 - val_loss: 0.2048
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9438 - loss: 0.1942 - val_accuracy: 0.9460 - val_loss: 0.2032
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9478 - loss: 0.1852 - val_accuracy: 0.9462 - val_loss: 0.2018
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9450 - loss: 0.1899 - val_accuracy: 0.9458 - val_loss: 0.1997
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9462 - loss: 0.1933
Accuracy on test data: 0.9445
=== Модель со скрытым слоем 300 нейронов ===
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.5723 - loss: 1.7832 - val_accuracy: 0.8400 - val_loss: 0.8404
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8392 - loss: 0.7529 - val_accuracy: 0.8725 - val_loss: 0.5591
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8650 - loss: 0.5454 - val_accuracy: 0.8820 - val_loss: 0.4640
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8821 - loss: 0.4555 - val_accuracy: 0.8958 - val_loss: 0.4116
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8897 - loss: 0.4126 - val_accuracy: 0.8972 - val_loss: 0.3825
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8949 - loss: 0.3824 - val_accuracy: 0.9010 - val_loss: 0.3619
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8965 - loss: 0.3723 - val_accuracy: 0.9068 - val_loss: 0.3476
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8977 - loss: 0.3586 - val_accuracy: 0.9062 - val_loss: 0.3384
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9029 - loss: 0.3395 - val_accuracy: 0.9072 - val_loss: 0.3280
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9009 - loss: 0.3401 - val_accuracy: 0.9088 - val_loss: 0.3216
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9060 - loss: 0.3291 - val_accuracy: 0.9103 - val_loss: 0.3154
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9098 - loss: 0.3185 - val_accuracy: 0.9132 - val_loss: 0.3120
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9089 - loss: 0.3181 - val_accuracy: 0.9138 - val_loss: 0.3068
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9106 - loss: 0.3130 - val_accuracy: 0.9140 - val_loss: 0.3017
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9111 - loss: 0.3068 - val_accuracy: 0.9140 - val_loss: 0.2994
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9108 - loss: 0.3096 - val_accuracy: 0.9170 - val_loss: 0.2947
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9146 - loss: 0.2983 - val_accuracy: 0.9170 - val_loss: 0.2916
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9148 - loss: 0.2953 - val_accuracy: 0.9185 - val_loss: 0.2898
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9151 - loss: 0.2930 - val_accuracy: 0.9197 - val_loss: 0.2865
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9178 - loss: 0.2881 - val_accuracy: 0.9177 - val_loss: 0.2838
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9176 - loss: 0.2851 - val_accuracy: 0.9198 - val_loss: 0.2817
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9186 - loss: 0.2808 - val_accuracy: 0.9200 - val_loss: 0.2807
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9185 - loss: 0.2849 - val_accuracy: 0.9205 - val_loss: 0.2777
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9206 - loss: 0.2741 - val_accuracy: 0.9218 - val_loss: 0.2756
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9206 - loss: 0.2744 - val_accuracy: 0.9237 - val_loss: 0.2743
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9196 - loss: 0.2758 - val_accuracy: 0.9222 - val_loss: 0.2722
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9228 - loss: 0.2654 - val_accuracy: 0.9237 - val_loss: 0.2693
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9262 - loss: 0.2593 - val_accuracy: 0.9253 - val_loss: 0.2682
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9242 - loss: 0.2645 - val_accuracy: 0.9270 - val_loss: 0.2655
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9251 - loss: 0.2593 - val_accuracy: 0.9257 - val_loss: 0.2642
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9261 - loss: 0.2564 - val_accuracy: 0.9258 - val_loss: 0.2638
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9254 - loss: 0.2579 - val_accuracy: 0.9275 - val_loss: 0.2612
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9275 - loss: 0.2507 - val_accuracy: 0.9277 - val_loss: 0.2576
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9268 - loss: 0.2525 - val_accuracy: 0.9290 - val_loss: 0.2563
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9282 - loss: 0.2506 - val_accuracy: 0.9283 - val_loss: 0.2560
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9313 - loss: 0.2405 - val_accuracy: 0.9292 - val_loss: 0.2536
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 2ms/step - accuracy: 0.9310 - loss: 0.2424 - val_accuracy: 0.9303 - val_loss: 0.2508
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9310 - loss: 0.2416 - val_accuracy: 0.9320 - val_loss: 0.2486
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9343 - loss: 0.2309 - val_accuracy: 0.9317 - val_loss: 0.2472
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9329 - loss: 0.2348 - val_accuracy: 0.9330 - val_loss: 0.2450
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9333 - loss: 0.2344 - val_accuracy: 0.9328 - val_loss: 0.2431
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9322 - loss: 0.2367 - val_accuracy: 0.9328 - val_loss: 0.2424
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9346 - loss: 0.2285 - val_accuracy: 0.9327 - val_loss: 0.2401
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9344 - loss: 0.2285 - val_accuracy: 0.9340 - val_loss: 0.2388
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9353 - loss: 0.2292 - val_accuracy: 0.9348 - val_loss: 0.2365
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9354 - loss: 0.2249 - val_accuracy: 0.9355 - val_loss: 0.2344
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9357 - loss: 0.2238 - val_accuracy: 0.9357 - val_loss: 0.2329
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9385 - loss: 0.2180 - val_accuracy: 0.9362 - val_loss: 0.2313
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9383 - loss: 0.2176 - val_accuracy: 0.9355 - val_loss: 0.2308
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9387 - loss: 0.2139 - val_accuracy: 0.9363 - val_loss: 0.2288
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9350 - loss: 0.2231
Accuracy on test data: 0.9347
=== Модель со скрытым слоем 500 нейронов ===
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.5484 - loss: 1.7610 - val_accuracy: 0.8363 - val_loss: 0.8149
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8469 - loss: 0.7192 - val_accuracy: 0.8732 - val_loss: 0.5455
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8680 - loss: 0.5286 - val_accuracy: 0.8863 - val_loss: 0.4521
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 2ms/step - accuracy: 0.8821 - loss: 0.4516 - val_accuracy: 0.8933 - val_loss: 0.4079
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8881 - loss: 0.4071 - val_accuracy: 0.8977 - val_loss: 0.3779
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8920 - loss: 0.3878 - val_accuracy: 0.9008 - val_loss: 0.3607
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8976 - loss: 0.3673 - val_accuracy: 0.8973 - val_loss: 0.3526
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9004 - loss: 0.3503 - val_accuracy: 0.9047 - val_loss: 0.3381
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8991 - loss: 0.3532 - val_accuracy: 0.9088 - val_loss: 0.3287
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9062 - loss: 0.3334 - val_accuracy: 0.9105 - val_loss: 0.3212
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9080 - loss: 0.3265 - val_accuracy: 0.9100 - val_loss: 0.3154
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9068 - loss: 0.3244 - val_accuracy: 0.9112 - val_loss: 0.3107
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9084 - loss: 0.3212 - val_accuracy: 0.9120 - val_loss: 0.3081
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9096 - loss: 0.3118 - val_accuracy: 0.9127 - val_loss: 0.3049
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9110 - loss: 0.3055 - val_accuracy: 0.9135 - val_loss: 0.3017
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9137 - loss: 0.3079 - val_accuracy: 0.9172 - val_loss: 0.2998
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9126 - loss: 0.3027 - val_accuracy: 0.9167 - val_loss: 0.2978
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9157 - loss: 0.2940 - val_accuracy: 0.9152 - val_loss: 0.2932
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9181 - loss: 0.2846 - val_accuracy: 0.9173 - val_loss: 0.2923
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9152 - loss: 0.2946 - val_accuracy: 0.9185 - val_loss: 0.2883
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9171 - loss: 0.2880 - val_accuracy: 0.9182 - val_loss: 0.2884
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9166 - loss: 0.2844 - val_accuracy: 0.9193 - val_loss: 0.2857
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9199 - loss: 0.2844 - val_accuracy: 0.9202 - val_loss: 0.2845
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9181 - loss: 0.2865 - val_accuracy: 0.9215 - val_loss: 0.2814
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9190 - loss: 0.2780 - val_accuracy: 0.9212 - val_loss: 0.2815
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9189 - loss: 0.2830 - val_accuracy: 0.9218 - val_loss: 0.2795
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9201 - loss: 0.2841 - val_accuracy: 0.9233 - val_loss: 0.2774
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9219 - loss: 0.2743 - val_accuracy: 0.9220 - val_loss: 0.2769
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9226 - loss: 0.2725 - val_accuracy: 0.9235 - val_loss: 0.2754
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9227 - loss: 0.2681 - val_accuracy: 0.9243 - val_loss: 0.2738
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9209 - loss: 0.2715 - val_accuracy: 0.9240 - val_loss: 0.2722
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9238 - loss: 0.2653 - val_accuracy: 0.9245 - val_loss: 0.2734
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9244 - loss: 0.2691 - val_accuracy: 0.9252 - val_loss: 0.2703
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9274 - loss: 0.2556 - val_accuracy: 0.9252 - val_loss: 0.2682
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9262 - loss: 0.2590 - val_accuracy: 0.9258 - val_loss: 0.2671
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9261 - loss: 0.2644 - val_accuracy: 0.9263 - val_loss: 0.2655
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9253 - loss: 0.2594 - val_accuracy: 0.9253 - val_loss: 0.2638
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9268 - loss: 0.2562 - val_accuracy: 0.9280 - val_loss: 0.2636
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9269 - loss: 0.2536 - val_accuracy: 0.9283 - val_loss: 0.2634
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9285 - loss: 0.2508 - val_accuracy: 0.9273 - val_loss: 0.2591
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9264 - loss: 0.2551 - val_accuracy: 0.9280 - val_loss: 0.2589
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9289 - loss: 0.2512 - val_accuracy: 0.9292 - val_loss: 0.2565
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9306 - loss: 0.2440 - val_accuracy: 0.9288 - val_loss: 0.2559
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9296 - loss: 0.2472 - val_accuracy: 0.9300 - val_loss: 0.2532
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9294 - loss: 0.2429 - val_accuracy: 0.9300 - val_loss: 0.2522
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9319 - loss: 0.2396 - val_accuracy: 0.9303 - val_loss: 0.2505
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9321 - loss: 0.2385 - val_accuracy: 0.9318 - val_loss: 0.2493
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9334 - loss: 0.2356 - val_accuracy: 0.9323 - val_loss: 0.2488
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9341 - loss: 0.2325 - val_accuracy: 0.9317 - val_loss: 0.2459
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9330 - loss: 0.2335 - val_accuracy: 0.9330 - val_loss: 0.2460
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9308 - loss: 0.2410
Accuracy on test data: 0.9310
plt.figure()
plt.plot(list(results.keys()), list(results.values()), marker='o')
plt.grid()
plt.title('Accuracy on test data depending on hidden layer size')
plt.xlabel('Number of neurons in hidden layer')
plt.ylabel('Accuracy')
plt.show()
from keras.models import Sequential
from keras.layers import Dense
hidden2 = [50, 100]
results_2 = {}
for n2 in hidden2:
print(f'\n=== Модель со вторым скрытым слоем {n2} нейронов ===')
# создание модели
model2 = Sequential()
model2.add(Dense(units=100, input_dim=784, activation='sigmoid')) # первый скрытый слой
model2.add(Dense(units=n2, activation='sigmoid')) # второй скрытый слой
model2.add(Dense(units=num_classes, activation='softmax')) # выходной слой
# компиляция модели
model2.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
# обучение модели
H2 = model2.fit(X_train, y_train,
validation_split=0.1,
epochs=50,
verbose=1)
# оценка на тестовых данных
scores = model2.evaluate(X_test, y_test, verbose=1)
results_2[n2] = scores[1]
print(f'Accuracy on test data: {scores[1]:.4f}')
=== Модель со вторым скрытым слоем 50 нейронов ===
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 3ms/step - accuracy: 0.2022 - loss: 2.2940 - val_accuracy: 0.5467 - val_loss: 2.1147
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.5758 - loss: 2.0123 - val_accuracy: 0.7037 - val_loss: 1.5870
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.7169 - loss: 1.4299 - val_accuracy: 0.7762 - val_loss: 1.0373
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.7884 - loss: 0.9641 - val_accuracy: 0.8323 - val_loss: 0.7605
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8249 - loss: 0.7300 - val_accuracy: 0.8547 - val_loss: 0.6177
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8471 - loss: 0.6081 - val_accuracy: 0.8653 - val_loss: 0.5332
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.8624 - loss: 0.5334 - val_accuracy: 0.8787 - val_loss: 0.4779
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.8734 - loss: 0.4789 - val_accuracy: 0.8842 - val_loss: 0.4389
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8813 - loss: 0.4459 - val_accuracy: 0.8905 - val_loss: 0.4088
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8864 - loss: 0.4200 - val_accuracy: 0.8963 - val_loss: 0.3865
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8919 - loss: 0.3902 - val_accuracy: 0.9000 - val_loss: 0.3675
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8963 - loss: 0.3764 - val_accuracy: 0.9032 - val_loss: 0.3534
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8983 - loss: 0.3645 - val_accuracy: 0.9057 - val_loss: 0.3410
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9038 - loss: 0.3467 - val_accuracy: 0.9072 - val_loss: 0.3308
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9045 - loss: 0.3438 - val_accuracy: 0.9090 - val_loss: 0.3216
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9085 - loss: 0.3273 - val_accuracy: 0.9128 - val_loss: 0.3130
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9080 - loss: 0.3217 - val_accuracy: 0.9143 - val_loss: 0.3057
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9120 - loss: 0.3118 - val_accuracy: 0.9143 - val_loss: 0.2998
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.9133 - loss: 0.3036 - val_accuracy: 0.9155 - val_loss: 0.2938
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9158 - loss: 0.2938 - val_accuracy: 0.9178 - val_loss: 0.2894
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9155 - loss: 0.2937 - val_accuracy: 0.9182 - val_loss: 0.2829
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9175 - loss: 0.2871 - val_accuracy: 0.9210 - val_loss: 0.2776
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9199 - loss: 0.2786 - val_accuracy: 0.9220 - val_loss: 0.2730
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9206 - loss: 0.2792 - val_accuracy: 0.9243 - val_loss: 0.2692
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9223 - loss: 0.2674 - val_accuracy: 0.9252 - val_loss: 0.2648
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9220 - loss: 0.2649 - val_accuracy: 0.9265 - val_loss: 0.2612
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9236 - loss: 0.2635 - val_accuracy: 0.9277 - val_loss: 0.2584
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9243 - loss: 0.2622 - val_accuracy: 0.9273 - val_loss: 0.2539
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9252 - loss: 0.2580 - val_accuracy: 0.9295 - val_loss: 0.2504
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9296 - loss: 0.2464 - val_accuracy: 0.9308 - val_loss: 0.2473
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9274 - loss: 0.2507 - val_accuracy: 0.9318 - val_loss: 0.2437
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9319 - loss: 0.2378 - val_accuracy: 0.9330 - val_loss: 0.2404
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9318 - loss: 0.2354 - val_accuracy: 0.9347 - val_loss: 0.2375
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9332 - loss: 0.2331 - val_accuracy: 0.9348 - val_loss: 0.2348
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9316 - loss: 0.2361 - val_accuracy: 0.9350 - val_loss: 0.2317
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9347 - loss: 0.2266 - val_accuracy: 0.9370 - val_loss: 0.2286
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9354 - loss: 0.2221 - val_accuracy: 0.9380 - val_loss: 0.2263
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9377 - loss: 0.2158 - val_accuracy: 0.9370 - val_loss: 0.2240
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9378 - loss: 0.2164 - val_accuracy: 0.9397 - val_loss: 0.2208
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9388 - loss: 0.2116 - val_accuracy: 0.9397 - val_loss: 0.2190
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9385 - loss: 0.2116 - val_accuracy: 0.9400 - val_loss: 0.2162
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9406 - loss: 0.2051 - val_accuracy: 0.9410 - val_loss: 0.2132
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9406 - loss: 0.2056 - val_accuracy: 0.9423 - val_loss: 0.2107
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9409 - loss: 0.2038 - val_accuracy: 0.9430 - val_loss: 0.2095
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9412 - loss: 0.2007 - val_accuracy: 0.9427 - val_loss: 0.2077
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9432 - loss: 0.1956 - val_accuracy: 0.9435 - val_loss: 0.2046
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9419 - loss: 0.1992 - val_accuracy: 0.9440 - val_loss: 0.2026
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9452 - loss: 0.1876 - val_accuracy: 0.9445 - val_loss: 0.2006
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9458 - loss: 0.1856 - val_accuracy: 0.9452 - val_loss: 0.1984
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9475 - loss: 0.1837 - val_accuracy: 0.9465 - val_loss: 0.1959
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9455 - loss: 0.1915
Accuracy on test data: 0.9443
=== Модель со вторым скрытым слоем 100 нейронов ===
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 3ms/step - accuracy: 0.2068 - loss: 2.2684 - val_accuracy: 0.4813 - val_loss: 2.1012
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 2ms/step - accuracy: 0.5575 - loss: 1.9829 - val_accuracy: 0.6698 - val_loss: 1.5285
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.6990 - loss: 1.3824 - val_accuracy: 0.7685 - val_loss: 1.0101
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.7781 - loss: 0.9420 - val_accuracy: 0.8232 - val_loss: 0.7523
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8213 - loss: 0.7217 - val_accuracy: 0.8468 - val_loss: 0.6142
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8485 - loss: 0.6027 - val_accuracy: 0.8658 - val_loss: 0.5266
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8624 - loss: 0.5256 - val_accuracy: 0.8790 - val_loss: 0.4697
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8740 - loss: 0.4725 - val_accuracy: 0.8868 - val_loss: 0.4302
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8833 - loss: 0.4295 - val_accuracy: 0.8943 - val_loss: 0.4012
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8887 - loss: 0.4084 - val_accuracy: 0.8972 - val_loss: 0.3804
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8952 - loss: 0.3844 - val_accuracy: 0.9015 - val_loss: 0.3634
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8984 - loss: 0.3638 - val_accuracy: 0.9040 - val_loss: 0.3506
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9008 - loss: 0.3556 - val_accuracy: 0.9067 - val_loss: 0.3396
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9056 - loss: 0.3413 - val_accuracy: 0.9088 - val_loss: 0.3294
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9035 - loss: 0.3393 - val_accuracy: 0.9103 - val_loss: 0.3212
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9074 - loss: 0.3235 - val_accuracy: 0.9130 - val_loss: 0.3139
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9081 - loss: 0.3212 - val_accuracy: 0.9142 - val_loss: 0.3075
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9105 - loss: 0.3134 - val_accuracy: 0.9163 - val_loss: 0.3034
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9118 - loss: 0.3105 - val_accuracy: 0.9178 - val_loss: 0.2956
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9152 - loss: 0.2931 - val_accuracy: 0.9180 - val_loss: 0.2911
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9177 - loss: 0.2900 - val_accuracy: 0.9207 - val_loss: 0.2858
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9180 - loss: 0.2861 - val_accuracy: 0.9217 - val_loss: 0.2810
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9211 - loss: 0.2709 - val_accuracy: 0.9243 - val_loss: 0.2765
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9215 - loss: 0.2735 - val_accuracy: 0.9238 - val_loss: 0.2727
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9215 - loss: 0.2737 - val_accuracy: 0.9252 - val_loss: 0.2689
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9226 - loss: 0.2697 - val_accuracy: 0.9265 - val_loss: 0.2648
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9260 - loss: 0.2615 - val_accuracy: 0.9267 - val_loss: 0.2616
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9258 - loss: 0.2572 - val_accuracy: 0.9280 - val_loss: 0.2578
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9269 - loss: 0.2524 - val_accuracy: 0.9285 - val_loss: 0.2546
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9271 - loss: 0.2460 - val_accuracy: 0.9292 - val_loss: 0.2522
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9291 - loss: 0.2513 - val_accuracy: 0.9305 - val_loss: 0.2482
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9313 - loss: 0.2402 - val_accuracy: 0.9312 - val_loss: 0.2451
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9312 - loss: 0.2371 - val_accuracy: 0.9315 - val_loss: 0.2417
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9309 - loss: 0.2393 - val_accuracy: 0.9337 - val_loss: 0.2399
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9329 - loss: 0.2306 - val_accuracy: 0.9337 - val_loss: 0.2361
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9337 - loss: 0.2273 - val_accuracy: 0.9350 - val_loss: 0.2332
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9356 - loss: 0.2217 - val_accuracy: 0.9363 - val_loss: 0.2301
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9353 - loss: 0.2209 - val_accuracy: 0.9368 - val_loss: 0.2278
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9354 - loss: 0.2212 - val_accuracy: 0.9382 - val_loss: 0.2251
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9365 - loss: 0.2165 - val_accuracy: 0.9367 - val_loss: 0.2242
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9395 - loss: 0.2096 - val_accuracy: 0.9392 - val_loss: 0.2207
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9409 - loss: 0.2031 - val_accuracy: 0.9420 - val_loss: 0.2182
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9397 - loss: 0.2045 - val_accuracy: 0.9400 - val_loss: 0.2158
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9407 - loss: 0.2056 - val_accuracy: 0.9405 - val_loss: 0.2139
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9430 - loss: 0.2003 - val_accuracy: 0.9425 - val_loss: 0.2111
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9430 - loss: 0.1957 - val_accuracy: 0.9437 - val_loss: 0.2094
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9435 - loss: 0.1938 - val_accuracy: 0.9440 - val_loss: 0.2074
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9453 - loss: 0.1909 - val_accuracy: 0.9445 - val_loss: 0.2044
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9454 - loss: 0.1840 - val_accuracy: 0.9442 - val_loss: 0.2030
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9469 - loss: 0.1833 - val_accuracy: 0.9452 - val_loss: 0.2004
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9464 - loss: 0.1934
Accuracy on test data: 0.9445
model2.save('/content/drive/MyDrive/Colab Notebooks/best_model_2x100.h5')WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`.
import numpy as np
import matplotlib.pyplot as plt
# выбираем индексы двух случайных изображений
indices = np.random.choice(range(X_test.shape[0]), 2, replace=False)
# получаем предсказания
predictions = model2.predict(X_test[indices])
predicted_labels = np.argmax(predictions, axis=1)
true_labels = np.argmax(y_test[indices], axis=1)
# вывод изображений и меток
plt.figure(figsize=(6, 3))
for i, idx in enumerate(indices):
plt.subplot(1, 2, i + 1)
plt.imshow(X_test[idx].reshape(28, 28), cmap='gray')
plt.title(f'True: {true_labels[i]}, Pred: {predicted_labels[i]}')
plt.axis('off')
plt.show()1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 595ms/step

from google.colab import files
uploaded = files.upload()
Upload widget is only available when the cell has been executed in the
current browser session. Please rerun this cell to enable.
Saving 5.png to 5.png
Saving 6.png to 6 (1).png
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt
file_names = list(uploaded.keys())
X_custom = []
for fname in file_names:
# загружаем изображение в оттенках серого и приводим к 28×28
img = image.load_img(fname, color_mode='grayscale', target_size=(28, 28))
img_array = image.img_to_array(img)
# инвертируем цвета, если фон белый (MNIST — белая цифра на чёрном фоне)
img_array = 255 - img_array
# нормализация
img_array = img_array / 255.0
# разворачиваем в вектор длиной 784
img_flat = img_array.reshape(1, 784)
X_custom.append(img_flat)
X_custom = np.vstack(X_custom)predictions = model2.predict(X_custom)
predicted_labels = np.argmax(predictions, axis=1)1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
plt.figure(figsize=(6, 3))
for i, fname in enumerate(file_names):
img = image.load_img(fname, color_mode='grayscale', target_size=(28, 28))
plt.subplot(1, len(file_names), i + 1)
plt.imshow(img, cmap='gray')
plt.title(f'Pred: {predicted_labels[i]}')
plt.axis('off')
plt.show()
probs = model2.predict(X_custom) # X_custom — (N,784) или (N,28,28,1)
print(probs) # вероятности по 10 классам
print(np.argmax(probs, axis=1)) # предсказанные классы1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
[[1.7843387e-04 2.5620324e-05 9.6879220e-03 9.8594320e-01 2.5915762e-08
2.2038540e-03 8.8322827e-07 6.2859053e-06 1.9501867e-03 3.5526070e-06]
[3.8881015e-04 1.2971306e-05 2.7805394e-03 9.9061769e-01 1.2557522e-08
5.8032214e-03 7.3892338e-08 2.2987399e-05 3.7107972e-04 2.6070065e-06]]
[3 3]
plt.imshow(X_custom[0].reshape(28, 28), cmap='gray')
plt.show()
X_custom = 1 - X_custom
predictions = model2.predict(X_custom)
print(np.argmax(predictions, axis=1))1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
[5 6]
from google.colab import files
uploaded = files.upload()
Upload widget is only available when the cell has been executed in the
current browser session. Please rerun this cell to enable.
Saving 6 (1).png to 6 (1) (1).png
Saving 5 (1).png to 5 (1).png
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt
file_names = list(uploaded.keys())
X_rotated = []
for fname in file_names:
# загружаем повернутое изображение и приводим к формату 28×28
img = image.load_img(fname, color_mode='grayscale', target_size=(28, 28))
img_array = image.img_to_array(img) / 255.0 # нормализация
# разворачиваем в вектор длиной 784
img_flat = img_array.reshape(1, 784)
X_rotated.append(img_flat)
X_rotated = np.vstack(X_rotated)
# инвертируем цвета (цифры — светлые, фон — тёмный)
X_rotated = 1 - X_rotated
# предсказания модели
predictions = model2.predict(X_rotated)
predicted_labels = np.argmax(predictions, axis=1)
# вывод изображений и предсказаний
plt.figure(figsize=(6, 3))
for i, fname in enumerate(file_names):
img = image.load_img(fname, color_mode='grayscale', target_size=(28, 28))
plt.subplot(1, len(file_names), i + 1)
plt.imshow(img, cmap='gray')
plt.title(f'Pred: {predicted_labels[i]}')
plt.axis('off')
plt.show()
print('Распознанные цифры:', predicted_labels)1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step

Распознанные цифры: [3 3]
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt
file_names = list(uploaded.keys())
X_rotated = []
for fname in file_names:
# загружаем повернутое изображение и приводим к 28×28
img = image.load_img(fname, color_mode='grayscale', target_size=(28, 28))
img_array = image.img_to_array(img) / 255.0 # нормализация
# разворачиваем в вектор длиной 784
img_flat = img_array.reshape(1, 784)
X_rotated.append(img_flat)
X_rotated = np.vstack(X_rotated)
# визуально проверим, как выглядят изображения после предобработки
plt.figure(figsize=(6, 3))
for i in range(len(file_names)):
plt.subplot(1, len(file_names), i + 1)
plt.imshow(X_rotated[i].reshape(28, 28), cmap='gray')
plt.title(f'Raw {i+1}')
plt.axis('off')
plt.show()
# вариант 1: без инверсии
predictions_noinv = model2.predict(X_rotated)
labels_noinv = np.argmax(predictions_noinv, axis=1)
# вариант 2: с инверсией (как в оригинальных данных)
X_rotated_inv = 1 - X_rotated
predictions_inv = model2.predict(X_rotated_inv)
labels_inv = np.argmax(predictions_inv, axis=1)
print('Без инверсии:', labels_noinv)
print('С инверсией:', labels_inv)1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
Без инверсии: [9 9]
С инверсией: [3 3]
np.set_printoptions(precision=4, suppress=True)
print("\nВероятности без инверсии:")
print(predictions_noinv)
print("\nВероятности с инверсией:")
print(predictions_inv)
Вероятности без инверсии:
[[0.0053 0. 0. 0. 0.3803 0.049 0.0059 0.1609 0.001 0.3975]
[0.105 0. 0.0139 0.0372 0.0011 0.0113 0.0001 0.1999 0.0071 0.6244]]
Вероятности с инверсией:
[[0.0003 0. 0.1308 0.8647 0. 0.0037 0. 0. 0.0006 0. ]
[0.0012 0.0001 0.0845 0.8197 0. 0.0825 0. 0. 0.012 0. ]]