форкнуто от main/is_dnn
				
			
			Вы не можете выбрать более 25 тем
			Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
		
		
		
		
		
			
		
			
				
	
	
	
		
			313 KiB
		
	
	
	
			
		
		
	
	
			313 KiB
		
	
	
	
!git clone http://uit.mpei.ru/git/TroyanovDS/is_dnn.gitCloning into 'is_dnn'...
remote: Enumerating objects: 188, done.ote: Counting objects: 100% (188/188), done.ote: Compressing objects: 100% (186/186), done.ote: Total 188 (delta 47), reused 0 (delta 0), pack-reused 0import os
os.chdir('/content/drive/MyDrive/Colab Notebooks/is_dnn/labworks/LW1')from google.colab import drive
drive.mount('/content/drive')Mounted at /content/drive
# импорт модулей
import tensorflow as tf
from tensorflow import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import to_categorical
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import os---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[1], line 2
      1 # импорт модулей
----> 2 import tensorflow as tf
      3 from tensorflow import keras
      4 from keras.datasets import mnist
ModuleNotFoundError: No module named 'tensorflow'
# Загрузка датасета
(X_train_orig, y_train_orig), (X_test_orig, y_test_orig) = mnist.load_data()
# разбиваем выборку на обучающую и тестовую выборку
X = np.concatenate((X_train_orig, X_test_orig))
y = np.concatenate((y_train_orig, y_test_orig))
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=10000,
    train_size=60000,
    random_state=3,
)Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11490434/11490434 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
# Вывод первых 4 изображений
fig, axes = plt.subplots(1, 4, figsize=(12, 3))
for i in range(4):
    axes[i].imshow(X_train[i], cmap='gray')
    axes[i].set_title(f'Метка: {y_train[i]}')
    axes[i].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
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)
model_0 = Sequential()
model_0.add(Dense(units=num_classes, input_dim=num_pixels, activation='softmax'))
# Компиляция модели
model_0.compile(loss='categorical_crossentropy',
                optimizer='sgd',
                metrics=['accuracy'])
# Вывод информации об архитектуре
print("Архитектура однослойной сети:")
model_0.summary()
# Обучение модели
history_0 = model_0.fit(X_train, y_train,
                        validation_split=0.1,
                        epochs=50)/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)
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.7145 - loss: 1.1468 - val_accuracy: 0.8708 - val_loss: 0.5242
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8769 - loss: 0.4791 - val_accuracy: 0.8838 - val_loss: 0.4376
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8871 - loss: 0.4188 - val_accuracy: 0.8917 - val_loss: 0.4007
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8939 - loss: 0.3855 - val_accuracy: 0.8957 - val_loss: 0.3796
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8987 - loss: 0.3692 - val_accuracy: 0.8993 - val_loss: 0.3665
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9035 - loss: 0.3523 - val_accuracy: 0.9008 - val_loss: 0.3555
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9059 - loss: 0.3402 - val_accuracy: 0.9040 - val_loss: 0.3469
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9053 - loss: 0.3389 - val_accuracy: 0.9060 - val_loss: 0.3405
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9072 - loss: 0.3306 - val_accuracy: 0.9053 - val_loss: 0.3358
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9115 - loss: 0.3209 - val_accuracy: 0.9067 - val_loss: 0.3310
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9125 - loss: 0.3194 - val_accuracy: 0.9088 - val_loss: 0.3267
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9110 - loss: 0.3165 - val_accuracy: 0.9093 - val_loss: 0.3236
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9133 - loss: 0.3094 - val_accuracy: 0.9110 - val_loss: 0.3212
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9155 - loss: 0.3031 - val_accuracy: 0.9123 - val_loss: 0.3176
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9134 - loss: 0.3048 - val_accuracy: 0.9115 - val_loss: 0.3160
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9129 - loss: 0.3096 - val_accuracy: 0.9120 - val_loss: 0.3141
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9126 - loss: 0.3066 - val_accuracy: 0.9123 - val_loss: 0.3121
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9157 - loss: 0.2999 - val_accuracy: 0.9117 - val_loss: 0.3099
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9162 - loss: 0.2979 - val_accuracy: 0.9117 - val_loss: 0.3098
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9166 - loss: 0.2941 - val_accuracy: 0.9133 - val_loss: 0.3072
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9152 - loss: 0.2975 - val_accuracy: 0.9125 - val_loss: 0.3065
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9173 - loss: 0.2926 - val_accuracy: 0.9137 - val_loss: 0.3049
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9211 - loss: 0.2842 - val_accuracy: 0.9137 - val_loss: 0.3030
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9185 - loss: 0.2929 - val_accuracy: 0.9138 - val_loss: 0.3024
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9189 - loss: 0.2880 - val_accuracy: 0.9147 - val_loss: 0.3025
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9179 - loss: 0.2926 - val_accuracy: 0.9150 - val_loss: 0.3007
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9182 - loss: 0.2913 - val_accuracy: 0.9138 - val_loss: 0.3000
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9197 - loss: 0.2881 - val_accuracy: 0.9133 - val_loss: 0.2993
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9190 - loss: 0.2829 - val_accuracy: 0.9145 - val_loss: 0.2978
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9190 - loss: 0.2878 - val_accuracy: 0.9157 - val_loss: 0.2977
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9183 - loss: 0.2859 - val_accuracy: 0.9155 - val_loss: 0.2969
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9207 - loss: 0.2849 - val_accuracy: 0.9158 - val_loss: 0.2962
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9196 - loss: 0.2861 - val_accuracy: 0.9158 - val_loss: 0.2956
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9205 - loss: 0.2784 - val_accuracy: 0.9155 - val_loss: 0.2952
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9239 - loss: 0.2740 - val_accuracy: 0.9167 - val_loss: 0.2952
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9227 - loss: 0.2727 - val_accuracy: 0.9165 - val_loss: 0.2945
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9225 - loss: 0.2757 - val_accuracy: 0.9168 - val_loss: 0.2937
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9227 - loss: 0.2748 - val_accuracy: 0.9165 - val_loss: 0.2935
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9201 - loss: 0.2814 - val_accuracy: 0.9177 - val_loss: 0.2922
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9239 - loss: 0.2749 - val_accuracy: 0.9170 - val_loss: 0.2915
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9219 - loss: 0.2745 - val_accuracy: 0.9170 - val_loss: 0.2917
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9214 - loss: 0.2766 - val_accuracy: 0.9178 - val_loss: 0.2917
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9244 - loss: 0.2762 - val_accuracy: 0.9168 - val_loss: 0.2920
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9264 - loss: 0.2676 - val_accuracy: 0.9183 - val_loss: 0.2905
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9237 - loss: 0.2727 - val_accuracy: 0.9177 - val_loss: 0.2904
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9243 - loss: 0.2697 - val_accuracy: 0.9167 - val_loss: 0.2903
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9225 - loss: 0.2780 - val_accuracy: 0.9180 - val_loss: 0.2894
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9230 - loss: 0.2719 - val_accuracy: 0.9172 - val_loss: 0.2893
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9234 - loss: 0.2662 - val_accuracy: 0.9175 - val_loss: 0.2887
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9249 - loss: 0.2689 - val_accuracy: 0.9185 - val_loss: 0.2882
# График функции ошибки по эпохам
plt.figure(figsize=(10, 6))
plt.plot(history_0.history['loss'], label='Обучающая выборка')
plt.plot(history_0.history['val_loss'], label='Валидационная выборка')
plt.title('Функция ошибки по эпохам (Однослойная сеть)')
plt.xlabel('Эпохи')
plt.ylabel('Ошибка')
plt.legend()
plt.grid(True)
plt.show()
# Оценка на тестовых данных
scores_0 = model_0.evaluate(X_test, y_test, verbose=0)
print("Результаты однослойной сети:")
print(f"Ошибка на тестовых данных: {scores_0[0]}")
print(f"Точность на тестовых данных: {scores_0[1]}")Результаты однослойной сети:
Ошибка на тестовых данных: 0.28625616431236267
Точность на тестовых данных: 0.92330002784729
# Функция для создания и обучения модели
def create_and_train_model(hidden_units, model_name):
    model = Sequential()
    model.add(Dense(units=hidden_units, input_dim=num_pixels, activation='sigmoid'))
    model.add(Dense(units=num_classes, activation='softmax'))
    model.compile(loss='categorical_crossentropy',
                  optimizer='sgd',
                  metrics=['accuracy'])
    history = model.fit(X_train, y_train,
                        validation_split=0.1,
                        epochs=50)
    scores = model.evaluate(X_test, y_test, verbose=0)
    return model, history, scores# Эксперименты с разным количеством нейронов
hidden_units_list = [100, 300, 500]
models_1 = {}
histories_1 = {}
scores_1 = {}# Обучение сетей с одним скрытым слоем
for units in hidden_units_list:
    print(f"\nОбучение модели с {units} нейронами...")
    model, history, scores = create_and_train_model(units, f"model_{units}")
    models_1[units] = model
    histories_1[units] = history
    scores_1[units] = scores
    print(f"Точность: {scores[1]}")
Обучение модели с 100 нейронами...
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.5548 - loss: 1.8518 - val_accuracy: 0.8210 - val_loss: 0.9619
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8339 - loss: 0.8359 - val_accuracy: 0.8597 - val_loss: 0.6320
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8640 - loss: 0.5853 - val_accuracy: 0.8770 - val_loss: 0.5137
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8797 - loss: 0.4859 - val_accuracy: 0.8847 - val_loss: 0.4522
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8879 - loss: 0.4295 - val_accuracy: 0.8892 - val_loss: 0.4153
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8947 - loss: 0.3969 - val_accuracy: 0.8947 - val_loss: 0.3899
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8974 - loss: 0.3775 - val_accuracy: 0.8967 - val_loss: 0.3729
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9000 - loss: 0.3589 - val_accuracy: 0.8993 - val_loss: 0.3565
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9052 - loss: 0.3424 - val_accuracy: 0.9033 - val_loss: 0.3450
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9056 - loss: 0.3339 - val_accuracy: 0.9042 - val_loss: 0.3352
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9065 - loss: 0.3293 - val_accuracy: 0.9073 - val_loss: 0.3271
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9094 - loss: 0.3213 - val_accuracy: 0.9093 - val_loss: 0.3197
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9097 - loss: 0.3159 - val_accuracy: 0.9088 - val_loss: 0.3139
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9162 - loss: 0.2962 - val_accuracy: 0.9100 - val_loss: 0.3073
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9162 - loss: 0.3001 - val_accuracy: 0.9127 - val_loss: 0.3019
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9178 - loss: 0.2928 - val_accuracy: 0.9137 - val_loss: 0.2972
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9196 - loss: 0.2789 - val_accuracy: 0.9158 - val_loss: 0.2921
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9194 - loss: 0.2849 - val_accuracy: 0.9163 - val_loss: 0.2875
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9206 - loss: 0.2744 - val_accuracy: 0.9178 - val_loss: 0.2832
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9219 - loss: 0.2756 - val_accuracy: 0.9187 - val_loss: 0.2795
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9240 - loss: 0.2678 - val_accuracy: 0.9195 - val_loss: 0.2759
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9236 - loss: 0.2689 - val_accuracy: 0.9202 - val_loss: 0.2722
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9241 - loss: 0.2631 - val_accuracy: 0.9217 - val_loss: 0.2686
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9265 - loss: 0.2556 - val_accuracy: 0.9218 - val_loss: 0.2649
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9243 - loss: 0.2639 - val_accuracy: 0.9230 - val_loss: 0.2618
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9259 - loss: 0.2545 - val_accuracy: 0.9247 - val_loss: 0.2586
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9291 - loss: 0.2475 - val_accuracy: 0.9255 - val_loss: 0.2557
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9289 - loss: 0.2465 - val_accuracy: 0.9275 - val_loss: 0.2531
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9310 - loss: 0.2416 - val_accuracy: 0.9280 - val_loss: 0.2496
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9314 - loss: 0.2364 - val_accuracy: 0.9292 - val_loss: 0.2473
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9331 - loss: 0.2351 - val_accuracy: 0.9295 - val_loss: 0.2439
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9328 - loss: 0.2307 - val_accuracy: 0.9303 - val_loss: 0.2415
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9346 - loss: 0.2246 - val_accuracy: 0.9308 - val_loss: 0.2391
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9341 - loss: 0.2286 - val_accuracy: 0.9317 - val_loss: 0.2362
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9355 - loss: 0.2295 - val_accuracy: 0.9325 - val_loss: 0.2334
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9384 - loss: 0.2155 - val_accuracy: 0.9330 - val_loss: 0.2312
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9366 - loss: 0.2197 - val_accuracy: 0.9340 - val_loss: 0.2288
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9385 - loss: 0.2142 - val_accuracy: 0.9342 - val_loss: 0.2265
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9396 - loss: 0.2104 - val_accuracy: 0.9348 - val_loss: 0.2244
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9399 - loss: 0.2110 - val_accuracy: 0.9362 - val_loss: 0.2231
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9391 - loss: 0.2092 - val_accuracy: 0.9367 - val_loss: 0.2201
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9401 - loss: 0.2075 - val_accuracy: 0.9370 - val_loss: 0.2178
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9404 - loss: 0.2018 - val_accuracy: 0.9387 - val_loss: 0.2164
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9411 - loss: 0.2044 - val_accuracy: 0.9383 - val_loss: 0.2141
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9434 - loss: 0.1981 - val_accuracy: 0.9393 - val_loss: 0.2119
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9445 - loss: 0.1931 - val_accuracy: 0.9392 - val_loss: 0.2094
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9442 - loss: 0.1913 - val_accuracy: 0.9400 - val_loss: 0.2075
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9428 - loss: 0.1961 - val_accuracy: 0.9412 - val_loss: 0.2056
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9447 - loss: 0.1919 - val_accuracy: 0.9407 - val_loss: 0.2033
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9439 - loss: 0.1936 - val_accuracy: 0.9425 - val_loss: 0.2020
Точность: 0.9422000050544739
Обучение модели с 300 нейронами...
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.5667 - loss: 1.8010 - val_accuracy: 0.8303 - val_loss: 0.8696
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8399 - loss: 0.7595 - val_accuracy: 0.8657 - val_loss: 0.5806
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8705 - loss: 0.5350 - val_accuracy: 0.8803 - val_loss: 0.4834
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8785 - loss: 0.4604 - val_accuracy: 0.8867 - val_loss: 0.4317
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8887 - loss: 0.4130 - val_accuracy: 0.8895 - val_loss: 0.4013
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8937 - loss: 0.3841 - val_accuracy: 0.8950 - val_loss: 0.3820
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8983 - loss: 0.3652 - val_accuracy: 0.8960 - val_loss: 0.3662
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9026 - loss: 0.3493 - val_accuracy: 0.8990 - val_loss: 0.3557
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9035 - loss: 0.3417 - val_accuracy: 0.9008 - val_loss: 0.3452
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9043 - loss: 0.3351 - val_accuracy: 0.9023 - val_loss: 0.3373
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9060 - loss: 0.3240 - val_accuracy: 0.9030 - val_loss: 0.3303
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9070 - loss: 0.3170 - val_accuracy: 0.9052 - val_loss: 0.3255
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9087 - loss: 0.3202 - val_accuracy: 0.9062 - val_loss: 0.3209
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9129 - loss: 0.3063 - val_accuracy: 0.9067 - val_loss: 0.3161
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9135 - loss: 0.3046 - val_accuracy: 0.9092 - val_loss: 0.3119
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9130 - loss: 0.2993 - val_accuracy: 0.9108 - val_loss: 0.3064
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9149 - loss: 0.2964 - val_accuracy: 0.9113 - val_loss: 0.3043
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9152 - loss: 0.2935 - val_accuracy: 0.9128 - val_loss: 0.3011
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9170 - loss: 0.2863 - val_accuracy: 0.9123 - val_loss: 0.2989
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9190 - loss: 0.2821 - val_accuracy: 0.9138 - val_loss: 0.2945
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9203 - loss: 0.2799 - val_accuracy: 0.9140 - val_loss: 0.2926
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9187 - loss: 0.2851 - val_accuracy: 0.9145 - val_loss: 0.2894
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9181 - loss: 0.2789 - val_accuracy: 0.9155 - val_loss: 0.2871
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9215 - loss: 0.2705 - val_accuracy: 0.9158 - val_loss: 0.2848
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 8s 5ms/step - accuracy: 0.9217 - loss: 0.2715 - val_accuracy: 0.9172 - val_loss: 0.2829
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9225 - loss: 0.2666 - val_accuracy: 0.9177 - val_loss: 0.2804
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9248 - loss: 0.2643 - val_accuracy: 0.9187 - val_loss: 0.2783
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9235 - loss: 0.2603 - val_accuracy: 0.9197 - val_loss: 0.2768
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9240 - loss: 0.2628 - val_accuracy: 0.9210 - val_loss: 0.2741
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9246 - loss: 0.2618 - val_accuracy: 0.9207 - val_loss: 0.2720
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9270 - loss: 0.2541 - val_accuracy: 0.9202 - val_loss: 0.2686
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9261 - loss: 0.2552 - val_accuracy: 0.9227 - val_loss: 0.2675
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9270 - loss: 0.2577 - val_accuracy: 0.9243 - val_loss: 0.2639
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9277 - loss: 0.2478 - val_accuracy: 0.9252 - val_loss: 0.2622
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9288 - loss: 0.2471 - val_accuracy: 0.9263 - val_loss: 0.2611
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9299 - loss: 0.2398 - val_accuracy: 0.9248 - val_loss: 0.2588
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 2ms/step - accuracy: 0.9288 - loss: 0.2457 - val_accuracy: 0.9262 - val_loss: 0.2562
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9315 - loss: 0.2363 - val_accuracy: 0.9262 - val_loss: 0.2534
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9296 - loss: 0.2424 - val_accuracy: 0.9283 - val_loss: 0.2512
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9305 - loss: 0.2383 - val_accuracy: 0.9280 - val_loss: 0.2501
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9331 - loss: 0.2313 - val_accuracy: 0.9285 - val_loss: 0.2469
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9334 - loss: 0.2310 - val_accuracy: 0.9285 - val_loss: 0.2450
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9350 - loss: 0.2267 - val_accuracy: 0.9290 - val_loss: 0.2436
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9354 - loss: 0.2228 - val_accuracy: 0.9300 - val_loss: 0.2410
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9350 - loss: 0.2224 - val_accuracy: 0.9300 - val_loss: 0.2386
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9363 - loss: 0.2207 - val_accuracy: 0.9303 - val_loss: 0.2374
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9367 - loss: 0.2204 - val_accuracy: 0.9317 - val_loss: 0.2343
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9352 - loss: 0.2196 - val_accuracy: 0.9322 - val_loss: 0.2318
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9387 - loss: 0.2133 - val_accuracy: 0.9347 - val_loss: 0.2312
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9369 - loss: 0.2181 - val_accuracy: 0.9345 - val_loss: 0.2288
Точность: 0.9376999735832214
Обучение модели с 500 нейронами...
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 3ms/step - accuracy: 0.5450 - loss: 1.7741 - val_accuracy: 0.8278 - val_loss: 0.8334
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8439 - loss: 0.7246 - val_accuracy: 0.8673 - val_loss: 0.5635
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8689 - loss: 0.5286 - val_accuracy: 0.8787 - val_loss: 0.4724
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8843 - loss: 0.4409 - val_accuracy: 0.8863 - val_loss: 0.4282
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8919 - loss: 0.4027 - val_accuracy: 0.8898 - val_loss: 0.3971
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8951 - loss: 0.3794 - val_accuracy: 0.8938 - val_loss: 0.3770
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8977 - loss: 0.3647 - val_accuracy: 0.8973 - val_loss: 0.3638
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9008 - loss: 0.3517 - val_accuracy: 0.9008 - val_loss: 0.3532
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9045 - loss: 0.3383 - val_accuracy: 0.9023 - val_loss: 0.3457
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9078 - loss: 0.3278 - val_accuracy: 0.9032 - val_loss: 0.3371
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9070 - loss: 0.3236 - val_accuracy: 0.9047 - val_loss: 0.3317
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9074 - loss: 0.3238 - val_accuracy: 0.9050 - val_loss: 0.3270
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9109 - loss: 0.3110 - val_accuracy: 0.9065 - val_loss: 0.3210
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9109 - loss: 0.3092 - val_accuracy: 0.9068 - val_loss: 0.3176
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9116 - loss: 0.3076 - val_accuracy: 0.9082 - val_loss: 0.3153
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9118 - loss: 0.3079 - val_accuracy: 0.9095 - val_loss: 0.3138
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9165 - loss: 0.2949 - val_accuracy: 0.9107 - val_loss: 0.3078
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9141 - loss: 0.3022 - val_accuracy: 0.9103 - val_loss: 0.3072
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9148 - loss: 0.2973 - val_accuracy: 0.9118 - val_loss: 0.3024
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9168 - loss: 0.2933 - val_accuracy: 0.9123 - val_loss: 0.3004
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9176 - loss: 0.2889 - val_accuracy: 0.9128 - val_loss: 0.2994
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9177 - loss: 0.2870 - val_accuracy: 0.9122 - val_loss: 0.2968
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9193 - loss: 0.2818 - val_accuracy: 0.9140 - val_loss: 0.2949
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9178 - loss: 0.2903 - val_accuracy: 0.9147 - val_loss: 0.2939
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9178 - loss: 0.2875 - val_accuracy: 0.9137 - val_loss: 0.2914
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9208 - loss: 0.2832 - val_accuracy: 0.9150 - val_loss: 0.2889
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9221 - loss: 0.2765 - val_accuracy: 0.9142 - val_loss: 0.2883
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9220 - loss: 0.2752 - val_accuracy: 0.9167 - val_loss: 0.2868
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9220 - loss: 0.2754 - val_accuracy: 0.9183 - val_loss: 0.2854
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9239 - loss: 0.2700 - val_accuracy: 0.9173 - val_loss: 0.2820
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9234 - loss: 0.2669 - val_accuracy: 0.9190 - val_loss: 0.2804
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9228 - loss: 0.2678 - val_accuracy: 0.9193 - val_loss: 0.2797
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9239 - loss: 0.2677 - val_accuracy: 0.9192 - val_loss: 0.2794
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9240 - loss: 0.2631 - val_accuracy: 0.9208 - val_loss: 0.2765
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9253 - loss: 0.2605 - val_accuracy: 0.9202 - val_loss: 0.2750
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9254 - loss: 0.2570 - val_accuracy: 0.9205 - val_loss: 0.2734
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9267 - loss: 0.2601 - val_accuracy: 0.9215 - val_loss: 0.2711
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9279 - loss: 0.2569 - val_accuracy: 0.9212 - val_loss: 0.2715
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9260 - loss: 0.2589 - val_accuracy: 0.9223 - val_loss: 0.2680
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9284 - loss: 0.2550 - val_accuracy: 0.9218 - val_loss: 0.2671
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9286 - loss: 0.2491 - val_accuracy: 0.9227 - val_loss: 0.2660
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9316 - loss: 0.2432 - val_accuracy: 0.9237 - val_loss: 0.2625
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9274 - loss: 0.2508 - val_accuracy: 0.9252 - val_loss: 0.2635
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9290 - loss: 0.2472 - val_accuracy: 0.9255 - val_loss: 0.2595
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9302 - loss: 0.2449 - val_accuracy: 0.9252 - val_loss: 0.2601
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9322 - loss: 0.2399 - val_accuracy: 0.9270 - val_loss: 0.2568
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9323 - loss: 0.2422 - val_accuracy: 0.9278 - val_loss: 0.2550
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9321 - loss: 0.2399 - val_accuracy: 0.9282 - val_loss: 0.2527
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9330 - loss: 0.2372 - val_accuracy: 0.9282 - val_loss: 0.2514
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9347 - loss: 0.2327 - val_accuracy: 0.9277 - val_loss: 0.2495
Точность: 0.9312000274658203
# Выбор наилучшей модели
best_units_1 = max(scores_1.items(), key=lambda x: x[1][1])[0]
print(f"\nНаилучшее количество нейронов: {best_units_1}")
print(f"Точность: {scores_1[best_units_1][1]}")
Наилучшее количество нейронов: 100
Точность: 0.9422000050544739
# Графики ошибок для всех моделей
plt.figure(figsize=(15, 5))
for i, units in enumerate(hidden_units_list, 1):
    plt.subplot(1, 3, i)
    plt.plot(histories_1[units].history['loss'], label='Обучающая')
    plt.plot(histories_1[units].history['val_loss'], label='Валидационная')
    plt.title(f'{units} нейронов')
    plt.xlabel('Эпохи')
    plt.ylabel('Ошибка')
    plt.legend()
    plt.grid(True)
plt.tight_layout()
plt.show()
# Добавление второго скрытого слоя
second_layer_units = [50, 100]
models_2 = {}
histories_2 = {}
scores_2 = {}for units_2 in second_layer_units:
    print(f"\nОбучение модели со вторым слоем {units_2} нейронов")
    model = Sequential()
    model.add(Dense(units=best_units_1, input_dim=num_pixels, activation='sigmoid'))
    model.add(Dense(units=units_2, activation='sigmoid'))
    model.add(Dense(units=num_classes, activation='softmax'))
    model.compile(loss='categorical_crossentropy',
                  optimizer='sgd',
                  metrics=['accuracy'])
    history = model.fit(X_train, y_train,
                        validation_split=0.1,
                        epochs=50)
    scores = model.evaluate(X_test, y_test)
    models_2[units_2] = model
    histories_2[units_2] = history
    scores_2[units_2] = scores
    print(f"Точность: {scores[1]}")
Обучение модели со вторым слоем 50 нейронов
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.2096 - loss: 2.2675 - val_accuracy: 0.5588 - val_loss: 2.0950
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.5971 - loss: 1.9743 - val_accuracy: 0.6620 - val_loss: 1.5239
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.6823 - loss: 1.3658 - val_accuracy: 0.7380 - val_loss: 1.0431
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.7627 - loss: 0.9560 - val_accuracy: 0.7980 - val_loss: 0.8069
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8084 - loss: 0.7568 - val_accuracy: 0.8352 - val_loss: 0.6673
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8369 - loss: 0.6330 - val_accuracy: 0.8543 - val_loss: 0.5793
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8554 - loss: 0.5512 - val_accuracy: 0.8660 - val_loss: 0.5197
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8667 - loss: 0.5051 - val_accuracy: 0.8757 - val_loss: 0.4769
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8770 - loss: 0.4593 - val_accuracy: 0.8798 - val_loss: 0.4444
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8850 - loss: 0.4256 - val_accuracy: 0.8877 - val_loss: 0.4190
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8889 - loss: 0.4076 - val_accuracy: 0.8910 - val_loss: 0.3995
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8948 - loss: 0.3829 - val_accuracy: 0.8947 - val_loss: 0.3835
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8982 - loss: 0.3699 - val_accuracy: 0.8997 - val_loss: 0.3689
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9008 - loss: 0.3560 - val_accuracy: 0.9017 - val_loss: 0.3582
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9046 - loss: 0.3446 - val_accuracy: 0.9028 - val_loss: 0.3471
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9051 - loss: 0.3367 - val_accuracy: 0.9055 - val_loss: 0.3375
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9087 - loss: 0.3266 - val_accuracy: 0.9072 - val_loss: 0.3295
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9089 - loss: 0.3192 - val_accuracy: 0.9093 - val_loss: 0.3214
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9116 - loss: 0.3087 - val_accuracy: 0.9127 - val_loss: 0.3142
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9110 - loss: 0.3098 - val_accuracy: 0.9148 - val_loss: 0.3084
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9144 - loss: 0.2970 - val_accuracy: 0.9158 - val_loss: 0.3017
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9155 - loss: 0.2888 - val_accuracy: 0.9172 - val_loss: 0.2970
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9168 - loss: 0.2848 - val_accuracy: 0.9192 - val_loss: 0.2909
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9174 - loss: 0.2841 - val_accuracy: 0.9205 - val_loss: 0.2863
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9202 - loss: 0.2728 - val_accuracy: 0.9213 - val_loss: 0.2814
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9214 - loss: 0.2714 - val_accuracy: 0.9222 - val_loss: 0.2768
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9221 - loss: 0.2645 - val_accuracy: 0.9240 - val_loss: 0.2717
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9224 - loss: 0.2637 - val_accuracy: 0.9250 - val_loss: 0.2669
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9261 - loss: 0.2522 - val_accuracy: 0.9262 - val_loss: 0.2628
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9250 - loss: 0.2523 - val_accuracy: 0.9258 - val_loss: 0.2587
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9282 - loss: 0.2438 - val_accuracy: 0.9272 - val_loss: 0.2544
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9298 - loss: 0.2417 - val_accuracy: 0.9288 - val_loss: 0.2506
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9288 - loss: 0.2397 - val_accuracy: 0.9292 - val_loss: 0.2471
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9311 - loss: 0.2364 - val_accuracy: 0.9297 - val_loss: 0.2433
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9313 - loss: 0.2328 - val_accuracy: 0.9310 - val_loss: 0.2394
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9318 - loss: 0.2303 - val_accuracy: 0.9320 - val_loss: 0.2362
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9335 - loss: 0.2261 - val_accuracy: 0.9333 - val_loss: 0.2325
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9336 - loss: 0.2229 - val_accuracy: 0.9355 - val_loss: 0.2299
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9370 - loss: 0.2145 - val_accuracy: 0.9347 - val_loss: 0.2263
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9379 - loss: 0.2130 - val_accuracy: 0.9362 - val_loss: 0.2239
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9386 - loss: 0.2097 - val_accuracy: 0.9375 - val_loss: 0.2209
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9380 - loss: 0.2116 - val_accuracy: 0.9378 - val_loss: 0.2170
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9406 - loss: 0.2028 - val_accuracy: 0.9388 - val_loss: 0.2144
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9391 - loss: 0.2074 - val_accuracy: 0.9402 - val_loss: 0.2115
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9421 - loss: 0.1970 - val_accuracy: 0.9400 - val_loss: 0.2085
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9435 - loss: 0.1979 - val_accuracy: 0.9410 - val_loss: 0.2063
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9450 - loss: 0.1922 - val_accuracy: 0.9415 - val_loss: 0.2036
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9427 - loss: 0.1911 - val_accuracy: 0.9405 - val_loss: 0.2024
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9467 - loss: 0.1825 - val_accuracy: 0.9418 - val_loss: 0.1990
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9470 - loss: 0.1861 - val_accuracy: 0.9438 - val_loss: 0.1962
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9385 - loss: 0.2108
Точность: 0.9417999982833862
Обучение модели со вторым слоем 100 нейронов
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.1980 - loss: 2.2876 - val_accuracy: 0.4552 - val_loss: 2.0895
Epoch 2/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.5365 - loss: 1.9630 - val_accuracy: 0.6475 - val_loss: 1.4925
Epoch 3/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.6977 - loss: 1.3304 - val_accuracy: 0.7748 - val_loss: 1.0001
Epoch 4/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.7854 - loss: 0.9139 - val_accuracy: 0.8165 - val_loss: 0.7597
Epoch 5/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8193 - loss: 0.7167 - val_accuracy: 0.8407 - val_loss: 0.6288
Epoch 6/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8450 - loss: 0.5949 - val_accuracy: 0.8585 - val_loss: 0.5491
Epoch 7/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8610 - loss: 0.5259 - val_accuracy: 0.8677 - val_loss: 0.4961
Epoch 8/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8754 - loss: 0.4709 - val_accuracy: 0.8793 - val_loss: 0.4570
Epoch 9/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8834 - loss: 0.4375 - val_accuracy: 0.8878 - val_loss: 0.4271
Epoch 10/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8868 - loss: 0.4188 - val_accuracy: 0.8923 - val_loss: 0.4044
Epoch 11/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8942 - loss: 0.3833 - val_accuracy: 0.8953 - val_loss: 0.3853
Epoch 12/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8955 - loss: 0.3731 - val_accuracy: 0.8993 - val_loss: 0.3711
Epoch 13/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9010 - loss: 0.3543 - val_accuracy: 0.9022 - val_loss: 0.3570
Epoch 14/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9045 - loss: 0.3409 - val_accuracy: 0.9043 - val_loss: 0.3464
Epoch 15/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9065 - loss: 0.3318 - val_accuracy: 0.9063 - val_loss: 0.3364
Epoch 16/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9074 - loss: 0.3262 - val_accuracy: 0.9093 - val_loss: 0.3285
Epoch 17/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9096 - loss: 0.3151 - val_accuracy: 0.9103 - val_loss: 0.3205
Epoch 18/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9126 - loss: 0.3063 - val_accuracy: 0.9125 - val_loss: 0.3138
Epoch 19/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9145 - loss: 0.2975 - val_accuracy: 0.9118 - val_loss: 0.3085
Epoch 20/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9173 - loss: 0.2899 - val_accuracy: 0.9138 - val_loss: 0.3025
Epoch 21/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9158 - loss: 0.2888 - val_accuracy: 0.9172 - val_loss: 0.2962
Epoch 22/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9170 - loss: 0.2860 - val_accuracy: 0.9178 - val_loss: 0.2914
Epoch 23/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9205 - loss: 0.2788 - val_accuracy: 0.9188 - val_loss: 0.2854
Epoch 24/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9182 - loss: 0.2785 - val_accuracy: 0.9195 - val_loss: 0.2813
Epoch 25/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9230 - loss: 0.2696 - val_accuracy: 0.9207 - val_loss: 0.2772
Epoch 26/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9247 - loss: 0.2647 - val_accuracy: 0.9208 - val_loss: 0.2726
Epoch 27/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9218 - loss: 0.2645 - val_accuracy: 0.9218 - val_loss: 0.2679
Epoch 28/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9235 - loss: 0.2625 - val_accuracy: 0.9238 - val_loss: 0.2643
Epoch 29/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9279 - loss: 0.2493 - val_accuracy: 0.9250 - val_loss: 0.2606
Epoch 30/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9279 - loss: 0.2476 - val_accuracy: 0.9248 - val_loss: 0.2560
Epoch 31/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9286 - loss: 0.2439 - val_accuracy: 0.9277 - val_loss: 0.2529
Epoch 32/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9285 - loss: 0.2440 - val_accuracy: 0.9263 - val_loss: 0.2487
Epoch 33/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9295 - loss: 0.2395 - val_accuracy: 0.9288 - val_loss: 0.2456
Epoch 34/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9328 - loss: 0.2292 - val_accuracy: 0.9300 - val_loss: 0.2422
Epoch 35/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9316 - loss: 0.2318 - val_accuracy: 0.9322 - val_loss: 0.2389
Epoch 36/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9345 - loss: 0.2233 - val_accuracy: 0.9325 - val_loss: 0.2347
Epoch 37/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9354 - loss: 0.2206 - val_accuracy: 0.9330 - val_loss: 0.2321
Epoch 38/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9374 - loss: 0.2146 - val_accuracy: 0.9335 - val_loss: 0.2294
Epoch 39/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9370 - loss: 0.2149 - val_accuracy: 0.9330 - val_loss: 0.2264
Epoch 40/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9374 - loss: 0.2136 - val_accuracy: 0.9372 - val_loss: 0.2238
Epoch 41/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9387 - loss: 0.2118 - val_accuracy: 0.9360 - val_loss: 0.2209
Epoch 42/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9384 - loss: 0.2104 - val_accuracy: 0.9370 - val_loss: 0.2177
Epoch 43/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9410 - loss: 0.2020 - val_accuracy: 0.9382 - val_loss: 0.2147
Epoch 44/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9431 - loss: 0.1985 - val_accuracy: 0.9387 - val_loss: 0.2121
Epoch 45/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9440 - loss: 0.1946 - val_accuracy: 0.9398 - val_loss: 0.2096
Epoch 46/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9431 - loss: 0.1964 - val_accuracy: 0.9408 - val_loss: 0.2077
Epoch 47/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9458 - loss: 0.1880 - val_accuracy: 0.9402 - val_loss: 0.2057
Epoch 48/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9442 - loss: 0.1929 - val_accuracy: 0.9403 - val_loss: 0.2023
Epoch 49/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9451 - loss: 0.1885 - val_accuracy: 0.9415 - val_loss: 0.2002
Epoch 50/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9456 - loss: 0.1835 - val_accuracy: 0.9432 - val_loss: 0.1982
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9368 - loss: 0.2101
Точность: 0.942300021648407
# Выбор наилучшей двухслойной модели
best_units_2 = max(scores_2.items(), key=lambda x: x[1][1])[0]
print(f"\nНаилучшее количество нейронов во втором слое: {best_units_2}")
print(f"Точность: {scores_2[best_units_2][1]:.4f}")
Наилучшее количество нейронов во втором слое: 100
Точность: 0.9423
# Сбор результатов
results = {
    '0 слоев': {'нейроны_1': '-', 'нейроны_2': '-', 'точность': scores_0[1]},
    '1 слой_100': {'нейроны_1': 100, 'нейроны_2': '-', 'точность': scores_1[100][1]},
    '1 слой_300': {'нейроны_1': 300, 'нейроны_2': '-', 'точность': scores_1[300][1]},
    '1 слой_500': {'нейроны_1': 500, 'нейроны_2': '-', 'точность': scores_1[500][1]},
    '2 слоя_50': {'нейроны_1': best_units_1, 'нейроны_2': 50, 'точность': scores_2[50][1]},
    '2 слоя_100': {'нейроны_1': best_units_1, 'нейроны_2': 100, 'точность': scores_2[100][1]}
}# Создаем DataFrame из результатов
df_results = pd.DataFrame([
    {'Кол-во скрытых слоев': 0, 'Нейроны_1_слоя': '-', 'Нейроны_2_слоя': '-', 'Точность': results['0 слоев']['точность']},
    {'Кол-во скрытых слоев': 1, 'Нейроны_1_слоя': 100, 'Нейроны_2_слоя': '-', 'Точность': results['1 слой_100']['точность']},
    {'Кол-во скрытых слоев': 1, 'Нейроны_1_слоя': 300, 'Нейроны_2_слоя': '-', 'Точность': results['1 слой_300']['точность']},
    {'Кол-во скрытых слоев': 1, 'Нейроны_1_слоя': 500, 'Нейроны_2_слоя': '-', 'Точность': results['1 слой_500']['точность']},
    {'Кол-во скрытых слоев': 2, 'Нейроны_1_слоя': best_units_1, 'Нейроны_2_слоя': 50, 'Точность': results['2 слоя_50']['точность']},
    {'Кол-во скрытых слоев': 2, 'Нейроны_1_слоя': best_units_1, 'Нейроны_2_слоя': 100, 'Точность': results['2 слоя_100']['точность']}
])
print(" " * 20 + "ТАБЛИЦА РЕЗУЛЬТАТОВ")
print("=" * 70)
# print(df_results.to_string(index=False, formatters={
#     'Точность': '{:.4f}'.format
# }))
print(df_results.reset_index(drop=True))                    ТАБЛИЦА РЕЗУЛЬТАТОВ
======================================================================
   Кол-во скрытых слоев Нейроны_1_слоя Нейроны_2_слоя  Точность
0                     0              -              -    0.9233
1                     1            100              -    0.9422
2                     1            300              -    0.9377
3                     1            500              -    0.9312
4                     2            100             50    0.9418
5                     2            100            100    0.9423
# Выбор наилучшей модели
best_model_type = max(results.items(), key=lambda x: x[1]['точность'])[0]
best_accuracy = results[best_model_type]['точность']
print(f"\nНаилучшая архитектура: {best_model_type}")
print(f"Точность: {best_accuracy:.4f}")
Наилучшая архитектура: 2 слоя_100
Точность: 0.9423
# Определение наилучшей модели
if '0' in best_model_type:
    best_model = model_0
elif '1' in best_model_type:
    best_neurons = int(best_model_type.split('_')[1])
    best_model = models_1[best_neurons]
else:
    best_neurons_2 = int(best_model_type.split('_')[1])
    best_model = models_2[best_neurons_2]# Сохранение модели
best_model.save('best_mnist_model.keras')# вывод тестового изображения и результата распознавания (1)
n = 123
result = best_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 29ms/step
NN output: [[5.8587279e-06 9.7018647e-01 6.0002012e-03 5.5828933e-03 7.1756593e-05
  7.2469590e-03 3.2864737e-03 3.9730189e-04 6.0582636e-03 1.1638567e-03]]

Real mark:  1
NN answer:  1
# вывод тестового изображения и результата распознавания (3)
n = 353
result = best_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 45ms/step
NN output: [[5.6045882e-02 2.3120556e-06 3.2519495e-01 6.1816531e-01 2.2406326e-08
  2.7827255e-04 7.9103382e-05 1.1205349e-06 2.1714537e-04 1.5997215e-05]]

Real mark:  3
NN answer:  3
# загрузка собственного изображения (Цифры 2 и 7)
from PIL import Image
file_data_2 = Image.open('2.png')
file_data_7 = Image.open('7.png')
file_data_2 = file_data_2.convert('L') # перевод в градации серого
file_data_7 = file_data_7.convert('L') # перевод в градации серого
test_img_2 = np.array(file_data_2)
test_img_7 = np.array(file_data_7)# вывод собственного изображения (цифра 2)
plt.imshow(test_img_2, cmap=plt.get_cmap('gray'))
plt.show()
# предобработка
test_img_2 = test_img_2 / 255
test_img_2 = test_img_2.reshape(1, num_pixels)
# распознавание
result = best_model.predict(test_img_2)
print('I think it\'s ', np.argmax(result))
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
I think it's  3
# вывод собственного изображения (цифра 7)
plt.imshow(test_img_7, cmap=plt.get_cmap('gray'))
plt.show()
# предобработка
test_img_7 = test_img_7 / 255
test_img_7 = test_img_7.reshape(1, num_pixels)
# распознавание
result = best_model.predict(test_img_7)
print('I think it\'s ', np.argmax(result))
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
I think it's  7
# Тестирование на собственных повернутых изображениях
from PIL import Image
file_data_2_90 = Image.open('2_90.png')
file_data_7_90 = Image.open('7_90.png')
file_data_2_90 = file_data_2_90.convert('L') # перевод в градации серого
file_data_7_90 = file_data_7_90.convert('L') # перевод в градации серого
test_img_2_90 = np.array(file_data_2_90)
test_img_7_90= np.array(file_data_7_90)# вывод собственного изображения (цифра 2)
plt.imshow(test_img_2_90, cmap=plt.get_cmap('gray'))
plt.show()
# предобработка
test_img_2_90 = test_img_2_90 / 255
test_img_2_90 = test_img_2_90.reshape(1, num_pixels)
# распознавание
result = best_model.predict(test_img_2_90)
print('I think it\'s ', np.argmax(result))
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 91ms/step
I think it's  7
# вывод собственного изображения (цифра 7)
plt.imshow(test_img_7_90, cmap=plt.get_cmap('gray'))
plt.show()
# предобработка
test_img_7_90 = test_img_7_90 / 255
test_img_7_90 = test_img_7_90.reshape(1, num_pixels)
# распознавание
result = best_model.predict(test_img_7_90)
print('I think it\'s ', np.argmax(result))
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
I think it's  7