From 59588dace0f455a1a863c4858617b77ea5ee4ffa Mon Sep 17 00:00:00 2001 From: Fonov_Alexandr Date: Mon, 15 Dec 2025 18:35:12 +0000 Subject: [PATCH] Add report --- labworks/LW1/image7.png | Bin 0 -> 30898 bytes labworks/LW1/image8.png | Bin 0 -> 35433 bytes labworks/LW1/report.md | 622 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 622 insertions(+) create mode 100644 labworks/LW1/image7.png create mode 100644 labworks/LW1/image8.png create mode 100644 labworks/LW1/report.md diff --git a/labworks/LW1/image7.png b/labworks/LW1/image7.png new file mode 100644 index 0000000000000000000000000000000000000000..8d8ec46dce7fea7c3b86c5c542ce50cca69b6968 GIT binary patch literal 30898 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 Z5e?dTX*yc;nc)3`Wh4||m53Sp{ePuQpBVrE literal 0 HcmV?d00001 diff --git a/labworks/LW1/image8.png b/labworks/LW1/image8.png new file mode 100644 index 0000000000000000000000000000000000000000..72963196b79d062abfda15abbb788c8ce85e8fb5 GIT binary patch literal 35433 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 K^s9)T-~R!Y(=E{e literal 0 HcmV?d00001 diff --git a/labworks/LW1/report.md b/labworks/LW1/report.md new file mode 100644 index 0000000..5fb92a9 --- /dev/null +++ b/labworks/LW1/report.md @@ -0,0 +1,622 @@ +# Отчёт по лабораторной работе №1 + +**Фонов А.Д., Хнытченков А.М. — А-01-22** + +## 1. В среде Google Colab создан новый блокнот. Импортированы необходимые библиотеки и модули. + +```python +from google.colab import drive +drive.mount('/content/drive') +``` + +```python +from tensorflow import keras +import matplotlib.pyplot as plt +import numpy as np +import sklearn +from keras.datasets import mnist +from sklearn.model_selection import train_test_split +from tensorflow.keras.utils import to_categorical +from keras.models import Sequential +from keras.layers import Dense +from PIL import Image +``` + + +--- + +## 2. Загрузили набора данных MNIST с изображениями рукописных цифр. + +```python +(X_train, y_train), (X_test, y_test) = mnist.load_data() +``` + +--- + +## 3. Разбили данные на обучающую и тестовую выборки 60 000:10 000. + +При объединении исходных выборок и последующем разбиении был использован параметр `random_state = 4*k - 1`, где *k* – номер бригады (k = 3). Такой фиксированный seed обеспечивает воспроизводимость разбиения. + +```python +# объединяем исходные обучающие и тестовые данные в один массив +X = np.concatenate((X_train, X_test)) +y = np.concatenate((y_train, y_test)) + +# выполняем разбиение на обучающую (60000) и тестовую (10000) выборки +X_train, X_test, y_train, y_test = train_test_split( + X, y, train_size=60000, test_size=10000, random_state=4*3 - 1 +) + +# вывод размерностей полученных массивов +print('Shape of X train:', X_train.shape) +print('Shape of y test:', y_test.shape) +``` + +``` +Shape of X train: (60000, 28, 28) +Shape of y train: (60000,) +``` + +--- + +## 4. Вывели первые 4 элемента обучающих данных (изображения и метки цифр). + +```python +# вывод изображения +fig, axes = plt.subplots(1, 4, figsize=(10, 3)) +for i in range(4): + axes[i].imshow(X_train[i], cmap=plt.get_cmap('gray')) + axes[i].set_title(y_train[i]) + axes[i].axis('off') +plt.show() +``` +![Примеры изображений](image.png) + +--- + +## 5. Провели предобработку данных: привели обучающие и тестовые данные к формату, пригодному для обучения нейронной сети. Входные данные должны принимать значения от 0 до 1, метки цифр должны быть закодированы по принципу «one-hot encoding». Вывели размерности предобработанных обучающих и тестовых массивов данных. + +```python +# развернем каждое изображение 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.0 +X_test = X_test.reshape(X_test.shape[0], num_pixels) / 255.0 +print('Shape of transformed X train:', X_train.shape) +``` + +``` +Shape of transformed X train: (60000, 784) +``` + +```python +# переведем метки в one-hot +from tensorflow.keras.utils import to_categorical +y_train = to_categorical(y_train) +y_test = to_categorical(y_test) +``` + +``` +Shapeoftransformedytrain: (60000, 10) +``` + +--- + +## 6. Реализовали и обученили однослойную нейронную сеть. + +**Архитектура и параметры:** +- количество скрытых слоёв: 0 +- функция активации выходного слоя: `softmax` +- функция ошибки: `categorical_crossentropy` +- алгоритм обучения: `sgd` +- метрика качества: `accuracy` +- количество эпох: 50 +- доля валидационных данных от обучающих: 0.1 + +```python +model = Sequential() +model.add(Dense(units=10, input_dim=num_pixels, activation='softmax')) +model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) +model.summary() +``` + +``` +Model: "sequential_4" +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ +┃ Layer (type) ┃ Output Shape ┃ Param # ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ +│ dense_5 (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) +``` + +```python +#обучение +H1 = model.fit(X_train, y_train, batch_size=256, validation_split=0.1, epochs=150) +``` + +```python +# вывод графика ошибки по эпохам +plt.plot(H1.history['loss']) +plt.plot(H1.history['val_loss']) +plt.grid() +plt.xlabel('Epochs') +plt.ylabel('loss') +plt.legend(['train_loss', 'val_loss']) +plt.title('Loss by epochs') +plt.show() +``` + +![граффик обучения](image2.png) +--- + +## 7. Применили обученную модель к тестовым данным. + +```python +# Оценка качества работы модели на тестовых данных +scores = model.evaluate(X_test, y_test) +print('Loss on test data:', scores[0]) +print('Accuracy on test data:', scores[1]) +``` + +``` +Loss on test data: 0.32417795062065125 +Accuracy on test data: 0.9110999703407288 +``` + +## 8. Добавили в модель один скрытый слой и провели обучение и тестирование (повторить п. 6–7) при 100, 300, 500 нейронах в скрытом слое. По метрике качества классификации на тестовых данных выбрали наилучшее количество нейронов в скрытом слое. В качестве функции активации нейронов в скрытом слое использовали функцию sigmoid. + +### При 100 нейронах: +```python +model_100 = Sequential () +model_100.add(Dense(units=100,input_dim=num_pixels, activation='sigmoid')) +model_100.add(Dense(units=num_classes, activation='softmax')) +model_100.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) +print(model_100.summary()) +``` + +``` +Model: "sequential_5" +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ +┃ Layer (type) ┃ Output Shape ┃ Param # ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ +│ dense_6 (Dense) │ (None, 100) │ 78,500 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ dense_7 (Dense) │ (None, 10) │ 1,010 │ +└─────────────────────────────────┴────────────────────────┴───────────────┘ + Total params: 79,510 (310.59 KB) + Trainable params: 79,510 (310.59 KB) + Non-trainable params: 0 (0.00 B) +None +``` + +```python +#обучение +H_100 = model_100.fit(X_train, y_train, batch_size=256, validation_split=0.1, epochs=150) +``` + +```python +# вывод графика ошибки по эпохам +plt.plot(H_100.history['loss']) +plt.plot(H_100.history['val_loss']) +plt.grid() +plt.xlabel('Epochs') +plt.ylabel('loss') +plt.legend(['train_loss', 'val_loss']) +plt.title('Loss by epochs') +plt.show() +``` + +![граффик обучения](image3.png) + +```python +# Оценка качества работы модели на тестовых данных +scores = model_100.evaluate(X_test, y_test) +print('Loss on test data:', scores[0]) +print('Accuracy on test data:', scores[1]) +``` + +``` +313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9184 - loss: 0.2786 +Loss on test data: 0.2789558172225952 +Accuracy on test data: 0.9182999730110168 +``` + +### При 300 нейронах: +```python +model_300 = Sequential () +model_300.add(Dense(units=300,input_dim=num_pixels, activation='sigmoid')) +model_300.add(Dense(units=num_classes, activation='softmax')) +model_300.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) +print(model_300.summary()) +``` + +``` +Model: "sequential_6" +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ +┃ Layer (type) ┃ Output Shape ┃ Param # ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ +│ dense_8 (Dense) │ (None, 300) │ 235,500 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ dense_9 (Dense) │ (None, 10) │ 3,010 │ +└─────────────────────────────────┴────────────────────────┴───────────────┘ + Total params: 238,510 (931.68 KB) + Trainable params: 238,510 (931.68 KB) + Non-trainable params: 0 (0.00 B) +None +``` + +```python +H_300 = model_300.fit(X_train, y_train, batch_size=256, validation_split=0.1, epochs=150) +``` + +```python +# вывод графика ошибки по эпохам +plt.plot(H_300.history['loss']) +plt.plot(H_300.history['val_loss']) +plt.grid() +plt.xlabel('Epochs') +plt.ylabel('loss') +plt.legend(['train_loss', 'val_loss']) +plt.title('Loss by epochs') +plt.show() +``` + +![граффик обучения](image5.png) + +```python +# Оценка качества работы модели на тестовых данных +scores = model_300.evaluate(X_test, y_test) +print('Loss on test data:', scores[0]) +print('Accuracy on test data:', scores[1]) +``` + +``` +313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 4ms/step - accuracy: 0.9126 - loss: 0.2880 +Loss on test data: 0.28887832164764404 +Accuracy on test data: 0.9136999845504761 +``` + +### При 500 нейронах: +```python +model_500 = Sequential() +model_500.add(Dense(units=500, input_dim=num_pixels, activation='sigmoid')) +model_500.add(Dense(units=num_classes, activation='softmax')) +model_500.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) +print(model_500.summary()) +``` + +``` +Model: "sequential_7" +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ +┃ Layer (type) ┃ Output Shape ┃ Param # ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ +│ dense_10 (Dense) │ (None, 500) │ 392,500 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ dense_11 (Dense) │ (None, 10) │ 5,010 │ +└─────────────────────────────────┴────────────────────────┴───────────────┘ + Total params: 397,510 (1.52 MB) + Trainable params: 397,510 (1.52 MB) + Non-trainable params: 0 (0.00 B) +None +``` + + +```python +H_500 = model_500.fit(X_train, y_train, batch_size=256, validation_split=0.1, epochs=150) +``` + +```python +# вывод графика ошибки по эпохам +plt.plot(H_500.history['loss']) +plt.plot(H_500.history['val_loss']) +plt.grid() +plt.xlabel('Epochs') +plt.ylabel('loss') +plt.legend(['train_loss', 'val_loss']) +plt.title('Loss by epochs') +plt.show() +``` + +![граффик обучения](image6.png) + +```python +# Оценка качества работы модели на тестовых данных +scores = model_500.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.9125 - loss: 0.2925 +Loss on test data: 0.29266518354415894 +Accuracy on test data: 0.9136999845504761 +``` + +Мы видим что лучший результат показала модель со 100 нейронами в скрытом слое(Accuracy = 0.9138). + +## 9. Добавили в наилучшую архитектуру, определенную в п. 8, второй скрытый слой и провели обучение и тестирование при 50 и 100 нейронах во втором скрытом слое. В качестве функции активации нейронов в скрытом слое использовали функцию sigmoid. + +### При 50 нейронах в 2-м слое: +```python +model_100_50 = Sequential() +model_100_50.add(Dense(units=100, input_dim=num_pixels, activation='sigmoid')) +model_100_50.add(Dense(units=50, activation='sigmoid')) +model_100_50.add(Dense(units=num_classes, activation='softmax')) +model_100_50.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) +print(model_100_50.summary()) +``` + +``` +Model: "sequential_9" +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ +┃ Layer (type) ┃ Output Shape ┃ Param # ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ +│ dense_14 (Dense) │ (None, 100) │ 78,500 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ dense_15 (Dense) │ (None, 50) │ 5,050 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ dense_16 (Dense) │ (None, 10) │ 510 │ +└─────────────────────────────────┴────────────────────────┴───────────────┘ + Total params: 84,060 (328.36 KB) + Trainable params: 84,060 (328.36 KB) + Non-trainable params: 0 (0.00 B) +None +``` + + +```python +H_100_50 = model_100_50.fit(X_train, y_train, batch_size=256, validation_split=0.1, epochs=150) +``` + +```python +# вывод графика ошибки по эпохам +plt.plot(H_100_50.history['loss']) +plt.plot(H_100_50.history['val_loss']) +plt.grid() +plt.xlabel('Epochs') +plt.ylabel('loss') +plt.legend(['train_loss', 'val_loss']) +plt.title('Loss by epochs') +plt.show() +``` + +![граффик обучения](image7.png) + +```python +# Оценка качества работы модели на тестовых данных +scores = model_100_50.evaluate(X_test, y_test) +print('Loss on test data:', scores[0]) +print('Accuracy on test data:', scores[1]) +``` + +``` +313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9110 - loss: 0.3112 +Loss on test data: 0.31079161167144775 +Accuracy on test data: 0.9092000126838684 +``` + +### При 100 нейронах во 2-м слое:\ + +```python +model_100_100 = Sequential() +model_100_100.add(Dense(units=100, input_dim=num_pixels, activation='sigmoid')) +model_100_100.add(Dense(units=100, activation='sigmoid')) +model_100_100.add(Dense(units=num_classes, activation='softmax')) +model_100_100.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) +print(model_100_100.summary()) +``` + +``` +Model: "sequential_10" +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ +┃ Layer (type) ┃ Output Shape ┃ Param # ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ +│ dense_17 (Dense) │ (None, 100) │ 78,500 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ dense_18 (Dense) │ (None, 100) │ 10,100 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ dense_19 (Dense) │ (None, 10) │ 1,010 │ +└─────────────────────────────────┴────────────────────────┴───────────────┘ + Total params: 89,610 (350.04 KB) + Trainable params: 89,610 (350.04 KB) + Non-trainable params: 0 (0.00 B) +None +``` + +```python +H_100_100 = model_100_100.fit(X_train, y_train, batch_size=256, validation_split=0.1, epochs=150) +``` + +```python +# вывод графика ошибки по эпохам +plt.plot(H_100_100.history['loss']) +plt.plot(H_100_100.history['val_loss']) +plt.grid() +plt.xlabel('Epochs') +plt.ylabel('loss') +plt.legend(['train_loss', 'val_loss']) +plt.title('Loss by epochs') +plt.show() +``` + +![граффик обучения](image8.png) + +```python +# Оценка качества работы модели на тестовых данных +scores = model.evaluate(X_test, y_test) +print('Loss on test data:', scores[0]) +print('Accuracy on test data:', scores[1]) +``` + +``` +313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9144 - loss: 0.2963 +Loss on test data: 0.29889559745788574 +Accuracy on test data: 0.9126999974250793 +``` + +## 10. Сравнили качество классификации на тестовых данных всех построенных моделей. Сделали выводы. + +| Кол-во слоёв | Нейронов в 1-м | Нейронов во 2-м | Accuracy | +|---------------|----------------|-----------------|-----------| +| 0 | – | – | 0.9111 | +| 1 | 100 | – | 0.9183 | +| 1 | 300 | – | 0.9136 | +| 1 | 500 | – | 0.9137 | +| 2 | 100 | 50 | 0.9092 | +| 2 | 100 | 100 | 0.9127 | + +**Вывод:** наилучшей оказалась архитектура с одним скрытым слоем и 100 нейронами в нём. Увеличение числа нейронов в скрытом слое или добавление второго слоя не улучшило качество классификации, а в некоторых случаях даже ухудшило его. Вероятно, это связано с переобучением модели из-за избыточного количества параметров при относительно небольшом объёме обучающих данных. + +--- + +## 11. Сохранили наилучшую модель на диск. + +```python +model_100.save("/content/drive/MyDrive/Colab Notebooks/best_model_100.keras") +``` + +--- + +## 12. Для нейронной сети с наилучшей архитектурой вывели 2 тестовых изображения и истинные метки, а также предсказанные моделью метки. + +```python +n = 333 +result = model_100.predict(X_test[n:n+1]) +print('NNoutput:',result) +plt.imshow(X_test[n].reshape(28,28),cmap=plt.get_cmap('gray')) +plt.show() +print('Realmark:',str(np.argmax(y_test[n]))) +print('NNanswer:',str(np.argmax(result))) +``` +![Пример 1](image9.png) + +``` +NNoutput: [[2.8792789e-05 1.1840343e-06 6.8865262e-04 2.9317471e-07 1.0873583e-04 + 3.8107886e-04 9.9874818e-01 3.4978150e-08 4.1428295e-05 1.6908634e-06]] +Realmark: 6 +NNanswer: 6 +``` + +```python +n = 234 +result = model_100.predict(X_test[n:n+1]) +print('NNoutput:',result) +plt.imshow(X_test[n].reshape(28,28),cmap=plt.get_cmap('gray')) +plt.show() +print('Realmark:',str(np.argmax(y_test[n]))) +print('NNanswer:',str(np.argmax(result))) +``` +![Пример 2](image10.png) + +``` +NNoutput: [[8.59206193e-05 3.77812080e-06 5.60759217e-04 8.30771052e-04 + 1.28042605e-02 7.39536830e-04 7.70781189e-05 3.77385356e-02 + 7.31113739e-03 9.39848125e-01]] +Realmark: 9 +NNanswer: 9 +``` + +--- + +## 13. Создали собственные изображения рукописных цифр, подобное представленным в наборе MNIST. Цифру выбрали как остаток от деления на 10 числа своего дня рождения (27 апреля → 27 mod 10 = 7, 4 июня → 4 mod 10 = 4). Сохранили изображения. Загрузили, предобработали и подали на вход обученной нейронной сети собственные изображения. Вывели изображения и результаты распознавания. + +### Для 7: + +![Изображение "4"](IS_lab_4.png) + +```python +#вывод собственного изображения +plt.imshow(test_img,cmap=plt.get_cmap('gray')) +plt.show() +#предобработка +test_img=test_img/255 +test_img=test_img.reshape(1,num_pixels) +#распознавание +result=model_100.predict(test_img) +print('I think it\'s',np.argmax(result)) +``` + +``` +1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 27ms/step +I think it's 4 +``` + +### Для 4: + +![Мое изображение "7"](IS_lab_7.png) + +```python +from PIL import Image +file_data_7=Image.open('/content/drive/MyDrive/Colab Notebooks/IS_lab_7.png') +file_data_7=file_data_7.convert('L') +test_img_7=np.array(file_data_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=model_100.predict(test_img_7) +print('I think it\'s',np.argmax(result)) +``` + + +``` +1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 41ms/step +I think it's 4 +``` + +--- + +## 14. Создать копию собственного изображения, отличающуюся от оригинала поворотом на 90 градусов в любую сторону. Сохранили изображения. Загрузили, предобработали и подали на вход обученной нейронной сети измененные изображения. Вывели изображения и результаты распознавания. Сделали выводы по результатам эксперимента. + +```python +from PIL import Image +file_data=Image.open('/content/drive/MyDrive/Colab Notebooks/IS_lab_7_90.png') +file_data=file_data.convert('L') +test_img=np.array(file_data) +#вывод собственного изображения +plt.imshow(test_img,cmap=plt.get_cmap('gray')) +plt.show() +#предобработка +test_img=test_img/255 +test_img=test_img.reshape(1,num_pixels) +#распознавание +result=model_100.predict(test_img) +print('Ithinkit\'s',np.argmax(result)) +``` + +![Отображение "7 повернутой"](IS_lab_7_90.png) + +```python +from PIL import Image +file_data_4=Image.open('/content/drive/MyDrive/Colab Notebooks/IS_lab_4_90.png') +file_data_4=file_data_4.convert('L') +test_img_4=np.array(file_data_4) +#выводсобственногоизображения +plt.imshow(test_img_4,cmap=plt.get_cmap('gray')) +plt.show() +#предобработка +test_img_4=test_img_4/255 +test_img_4=test_img_4.reshape(1,num_pixels) +#распознавание +result=model_100.predict(test_img_4) +print('Ithinkit\'s',np.argmax(result)) +``` + +![Отображение "4 повернутой"](IS_lab_4_90.png) + +``` +1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 39ms/step +I think it's 1 +``` + +**Вывод:** модель неустойчива к повороту изображений, так как не обучалась на повернутых данных. + +--- + +## Заключение +Изучены принципы построения и обучения нейронных сетей в Keras на примере распознавания цифр MNIST. Лучшая точность достигнута простой моделью с одним скрытым слоем из 100 нейронов. При усложнении архитектуры наблюдается переобучение. Сеть корректно классифицирует собственные изображения, но ошибается на повернутых. \ No newline at end of file