diff --git a/labworks/LW1/report.md b/labworks/LW1/report.md index f2bdcc2..1e8896d 100644 --- a/labworks/LW1/report.md +++ b/labworks/LW1/report.md @@ -1,322 +1,325 @@ -# Отчет по лабораторной работе 1 -## Ледовской Михаил, Железнов Артем, Щипков Матвей -## Группа А-02-22 -### Пункт 1 - -В среде GoogleColab создали новый блокнот(notebook).Импортировали необходимые для работы библиотеки и модули. -from google.colab import drive -drive.mount('/content/drive') -import os -os.chdir('/content/drive/MyDrive/Colab Notebooks') -from tensorflow import keras -import matplotlib.pyplot as plt -import numpy as np -import sklearn -### Пункт 2 -Загрузили набор данных MNIST, содержащий размеченные изображения рукописных цифр. -from keras.datasets import mnist -### Пункт 3 -Разбили набор данных на обучающие и тестовые данные в соотношении 60000:10000 элементов. При разбиении параметр random_state выбрали 11. -Вывели размерности полученных обучающих и тестовых массивов данных. -(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=20) -#вывод размерностей -print('Shape of X train:',X_train.shape) -print('Shape of y train:',y_train.shape) -### Пункт 4 -Вывели первые 4 элемента обучающих данных -#вывод изображения -plt.imshow(X_train[1],cmap=plt.get_cmap('gray')) -plt.show() -print(y_train[1]) - -plt.imshow(X_train[2],cmap=plt.get_cmap('gray')) -plt.show() -print(y_train[2]) - -plt.imshow(X_train[3],cmap=plt.get_cmap('gray')) -plt.show() -print(y_train[3]) - -plt.imshow(X_train[4],cmap=plt.get_cmap('gray')) -plt.show() -print(y_train[4]) - -### Пункт 5 -Провели предобработку данных: привели обучающие и тестовые данные к формату, пригодному для обучения нейронной сети. -Входные данные должны принимать значения от 0 до 1, метки цифрдолжны быть закодированы по принципу «one-hotencoding».Вывели размерности предобработанных обучающих и тестовых массивов данных. -#развернем каждое изображение 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) - -#переведем метки в one-hot -import keras.utils -y_train=keras.utils.to_categorical(y_train) -y_test=keras.utils.to_categorical(y_test) -print('Shape of transformed y train:',y_train.shape) -num_classes=y_train.shape[1] - -### Пункт 6 -Реализовали модель однослойной нейронной сети и обучили ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывели информацию об архитектуре нейронной сети. Вывели график функции ошибки на обучающих и валидационных данных по эпохам. -from keras.models import Sequential -from keras.layers import Dense - -model_1 = Sequential() -model_1.add(Dense(units=num_classes, input_dim=num_pixels, activation='softmax')) -model_1.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) -print(model_1.summary()) -# Обучаем модель -H = model_1.fit(X_train, y_train, validation_split=0.1, epochs=50) -# вывод графика ошибки по эпохам -plt.plot(H.history['loss']) -plt.plot(H.history['val_loss']) -plt.grid() -plt.xlabel('Epochs') -plt.ylabel('loss') -plt.legend(['train_loss', 'val_loss']) -plt.title('Loss by epochs') -plt.show() -### Пункт 7 -Применили обученную модель к тестовым данным. Вывели значение функции ошибки и значение метрики качества классификации на тестовых данных. -# Оценка качества работы модели на тестовых данных -scores = model_1.evaluate(X_test, y_test) -print('Loss on test data:', scores[0]) -print('Accuracy on test data:', scores[1]) - -### Пункт 8 -Добавили в модель один скрытый и провели обучение и тестирование при 100, 300, 500 нейронах в скрытом слое. По метрике качества классификации на тестовых данных выбрали наилучшее количество нейронов в скрытом слое. -При 100 нейронах -# создаем модель -model_1h100 = Sequential() -model_1h100.add(Dense(units=100, input_dim=num_pixels, activation='sigmoid')) -model_1h100.add(Dense(units=num_classes, activation='softmax')) -# компилируем модель -model_1h100.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) - -# вывод информации об архитектуре модели -print(model_1h100.summary()) - -# Обучаем модель -H_1h100 = model_1h100.fit(X_train, y_train, validation_split=0.1, epochs=50) - -# вывод графика ошибки по эпохам -plt.plot(H_1h100.history['loss']) -plt.plot(H_1h100.history['val_loss']) -plt.grid() -plt.xlabel('Epochs') -plt.ylabel('loss') -plt.legend(['train_loss', 'val_loss']) -plt.title('Loss by epochs') -plt.show() - -# Оценка качества работы модели на тестовых данных -scores = model_1h100.evaluate(X_test, y_test) -print('Loss on test data:', scores[0]) -print('Accuracy on test data:', scores[1]) - -При 300 нейронах -# создаем модель -model_1h300 = Sequential() -model_1h300.add(Dense(units=300, input_dim=num_pixels, activation='sigmoid')) -model_1h300.add(Dense(units=num_classes, activation='softmax')) -# компилируем модель -model_1h300.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) - -# вывод информации об архитектуре модели -print(model_1h300.summary()) - -# Обучаем модель -H_1h300 = model_1h300.fit(X_train, y_train, validation_split=0.1, epochs=50) - -# вывод графика ошибки по эпохам -plt.plot(H_1h300.history['loss']) -plt.plot(H_1h300.history['val_loss']) -plt.grid() -plt.xlabel('Epochs') -plt.ylabel('loss') -plt.legend(['train_loss', 'val_loss']) -plt.title('Loss by epochs') -plt.show() - -# Оценка качества работы модели на тестовых данных -scores = model_1h300.evaluate(X_test, y_test) -print('Loss on test data:', scores[0]) -print('Accuracy on test data:', scores[1]) - -При 500 нейронах -# создаем модель -model_1h500 = Sequential() -model_1h500.add(Dense(units=500, input_dim=num_pixels, activation='sigmoid')) -model_1h500.add(Dense(units=num_classes, activation='softmax')) -# компилируем модель -model_1h500.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) - -# вывод информации об архитектуре модели -print(model_1h500.summary()) - -# Обучаем модель -H_1h500 = model_1h500.fit(X_train, y_train, validation_split=0.1, epochs=50) - -# вывод графика ошибки по эпохам -plt.plot(H_1h500.history['loss']) -plt.plot(H_1h500.history['val_loss']) -plt.grid() -plt.xlabel('Epochs') -plt.ylabel('loss') -plt.legend(['train_loss', 'val_loss']) -plt.title('Loss by epochs') -plt.show() - -# Оценка качества работы модели на тестовых данных -scores = model_1h500.evaluate(X_test, y_test) -print('Loss on test data:', scores[0]) -print('Accuracy on test data:', scores[1]) - -Наилучшую метрику наблюдаем при архитектуре со 100 нейронами в скрытом слое. -### Пункт 9 -Добавили в наилучшую архитектуру, определенную в п. 8, второй скрытый слой и провели обучение и тестирование при 50 и 100 нейронах во втором скрытом слое. -При 50 нейронах -# создаем модель -model_1h100_2h50 = Sequential() -model_1h100_2h50.add(Dense(units=100, input_dim=num_pixels, activation='sigmoid')) -model_1h100_2h50.add(Dense(units=50, activation='sigmoid')) -model_1h100_2h50.add(Dense(units=num_classes, activation='softmax')) -# компилируем модель -model_1h100_2h50.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) - -# вывод информации об архитектуре модели -print(model_1h100_2h50.summary()) - -# Обучаем модель -H_1h100_2h50 = model_1h100_2h50.fit(X_train, y_train, validation_split=0.1, epochs=50) - -# вывод графика ошибки по эпохам -plt.plot(H_1h100_2h50.history['loss']) -plt.plot(H_1h100_2h50.history['val_loss']) -plt.grid() -plt.xlabel('Epochs') -plt.ylabel('loss') -plt.legend(['train_loss', 'val_loss']) -plt.title('Loss by epochs') -plt.show() - -# Оценка качества работы модели на тестовых данных -scores = model_1h100_2h50.evaluate(X_test, y_test) -print('Loss on test data:', scores[0]) -print('Accuracy on test data:', scores[1]) - -При 100 нейронах -# создаем модель -model_1h100_2h100 = Sequential() -model_1h100_2h100.add(Dense(units=100, input_dim=num_pixels, activation='sigmoid')) -model_1h100_2h100.add(Dense(units=100, activation='sigmoid')) -model_1h100_2h100.add(Dense(units=num_classes, activation='softmax')) -# компилируем модель -model_1h100_2h100.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) - -# вывод информации об архитектуре модели -print(model_1h100_2h100.summary()) - -# Обучаем модель -H_1h100_2h100 = model_1h100_2h100.fit(X_train, y_train, validation_split=0.1, epochs=50) - -# вывод графика ошибки по эпохам -plt.plot(H_1h100_2h100.history['loss']) -plt.plot(H_1h100_2h100.history['val_loss']) -plt.grid() -plt.xlabel('Epochs') -plt.ylabel('loss') -plt.legend(['train_loss', 'val_loss']) -plt.title('Loss by epochs') -plt.show() - -# Оценка качества работы модели на тестовых данных -scores = model_1h100_2h100.evaluate(X_test, y_test) -print('Loss on test data:', scores[0]) -print('Accuracy on test data:', scores[1]) - -### Пункт 10 -Результаты исследования архитектуры нейронной сети занесли в таблицу -### Таблица с результатами тестирования нейросетевых моделей - -| Количество скрытых слоёв | Количество нейронов в первом скрытом слое | Количество нейронов во втором скрытом слое | Значение метрики качества классификации | -|---------------------------|-------------------------------------------|--------------------------------------------|-----------------------------------------| -| 0 | - | - | 0.9199000000953674 | -| 1 | 100 | - | 0.9398000240325928 | -| | 300 | - | 0.9320999979972839 | -| | 500 | - | 0.9291999936103821 | -| 2 | 100 | 50 | 0.9409000277519226 | -| | 100 | 100 | 0.9416999816894531 | -Исходя из нашего исследования, можно сделать вывод о том, что наилучшая архитектра - это архитектура с двумя скрытыми слоями (100 нейронов на первом скрытом слое и 100 на втором). -### Пункт 11 -Сохранили наилучшую нейронную сеть на диск - -model_1h100_2h100.save('best_model.keras') -### Пункт 12 -Вывели результаты тестирования модели -# вывод тестового изображения и результата распознавания 1 -n = 123 -result = model_1h100_2h100.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))) - -### Пункт 13 -Создали собственные изображения чисел -# загрузка собственного изображения -from PIL import Image -file_data = Image.open('five_v3.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_1h100_2h100.predict(test_img) -print('I think it\'s ', np.argmax(result)) - -### Пункт 14 -Создали копию нарисованных чисел и повернем их на 90 градусов. Протестируем работу нейронной сети. -file_data = Image.open('three_v3_rotated.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_1h100_2h100.predict(test_img) -print('I think it\'s ', np.argmax(result)) - -file_data = Image.open('five_v3_rotated.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_1h100_2h100.predict(test_img) -print('I think it\'s ', np.argmax(result)) - +# Отчет по лабораторной работе 1 +## Ледовской Михаил, Железнов Артем, Щипков Матвей +## Группа А-02-22 +### Пункт 1 + +В среде GoogleColab создали новый блокнот(notebook).Импортировали необходимые для работы библиотеки и модули. +from google.colab import drive +drive.mount('/content/drive') +import os +os.chdir('/content/drive/MyDrive/Colab Notebooks') +from tensorflow import keras +import matplotlib.pyplot as plt +import numpy as np +import sklearn +### Пункт 2 +Загрузили набор данных MNIST, содержащий размеченные изображения рукописных цифр. +from keras.datasets import mnist +### Пункт 3 +Разбили набор данных на обучающие и тестовые данные в соотношении 60000:10000 элементов. При разбиении параметр random_state выбрали 11. +Вывели размерности полученных обучающих и тестовых массивов данных. +(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=20) +#вывод размерностей +print('Shape of X train:',X_train.shape) +print('Shape of y train:',y_train.shape) +### Пункт 4 +Вывели первые 4 элемента обучающих данных +#вывод изображения +plt.imshow(X_train[1],cmap=plt.get_cmap('gray')) +plt.show() +print(y_train[1]) + +plt.imshow(X_train[2],cmap=plt.get_cmap('gray')) +plt.show() +print(y_train[2]) + +plt.imshow(X_train[3],cmap=plt.get_cmap('gray')) +plt.show() +print(y_train[3]) + +plt.imshow(X_train[4],cmap=plt.get_cmap('gray')) +plt.show() +print(y_train[4]) + +### Пункт 5 +Провели предобработку данных: привели обучающие и тестовые данные к формату, пригодному для обучения нейронной сети. +Входные данные должны принимать значения от 0 до 1, метки цифрдолжны быть закодированы по принципу «one-hotencoding».Вывели размерности предобработанных обучающих и тестовых массивов данных. +#развернем каждое изображение 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) + +#переведем метки в one-hot +import keras.utils +y_train=keras.utils.to_categorical(y_train) +y_test=keras.utils.to_categorical(y_test) +print('Shape of transformed y train:',y_train.shape) +num_classes=y_train.shape[1] + +### Пункт 6 +Реализовали модель однослойной нейронной сети и обучили ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывели информацию об архитектуре нейронной сети. Вывели график функции ошибки на обучающих и валидационных данных по эпохам. +from keras.models import Sequential +from keras.layers import Dense + +model_1 = Sequential() +model_1.add(Dense(units=num_classes, input_dim=num_pixels, activation='softmax')) +model_1.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) +print(model_1.summary()) +# Обучаем модель +H = model_1.fit(X_train, y_train, validation_split=0.1, epochs=50) +# вывод графика ошибки по эпохам +plt.plot(H.history['loss']) +plt.plot(H.history['val_loss']) +plt.grid() +plt.xlabel('Epochs') +plt.ylabel('loss') +plt.legend(['train_loss', 'val_loss']) +plt.title('Loss by epochs') +plt.show() +### Пункт 7 +Применили обученную модель к тестовым данным. Вывели значение функции ошибки и значение метрики качества классификации на тестовых данных. +# Оценка качества работы модели на тестовых данных +scores = model_1.evaluate(X_test, y_test) +print('Loss on test data:', scores[0]) +print('Accuracy on test data:', scores[1]) + +### Пункт 8 +Добавили в модель один скрытый и провели обучение и тестирование при 100, 300, 500 нейронах в скрытом слое. По метрике качества классификации на тестовых данных выбрали наилучшее количество нейронов в скрытом слое. +При 100 нейронах +# создаем модель +model_1h100 = Sequential() +model_1h100.add(Dense(units=100, input_dim=num_pixels, activation='sigmoid')) +model_1h100.add(Dense(units=num_classes, activation='softmax')) +# компилируем модель +model_1h100.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) + +# вывод информации об архитектуре модели +print(model_1h100.summary()) + +# Обучаем модель +H_1h100 = model_1h100.fit(X_train, y_train, validation_split=0.1, epochs=50) + +# вывод графика ошибки по эпохам +plt.plot(H_1h100.history['loss']) +plt.plot(H_1h100.history['val_loss']) +plt.grid() +plt.xlabel('Epochs') +plt.ylabel('loss') +plt.legend(['train_loss', 'val_loss']) +plt.title('Loss by epochs') +plt.show() + +# Оценка качества работы модели на тестовых данных +scores = model_1h100.evaluate(X_test, y_test) +print('Loss on test data:', scores[0]) +print('Accuracy on test data:', scores[1]) + +При 300 нейронах +# создаем модель +model_1h300 = Sequential() +model_1h300.add(Dense(units=300, input_dim=num_pixels, activation='sigmoid')) +model_1h300.add(Dense(units=num_classes, activation='softmax')) +# компилируем модель +model_1h300.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) + +# вывод информации об архитектуре модели +print(model_1h300.summary()) + +# Обучаем модель +H_1h300 = model_1h300.fit(X_train, y_train, validation_split=0.1, epochs=50) + +# вывод графика ошибки по эпохам +plt.plot(H_1h300.history['loss']) +plt.plot(H_1h300.history['val_loss']) +plt.grid() +plt.xlabel('Epochs') +plt.ylabel('loss') +plt.legend(['train_loss', 'val_loss']) +plt.title('Loss by epochs') +plt.show() + +# Оценка качества работы модели на тестовых данных +scores = model_1h300.evaluate(X_test, y_test) +print('Loss on test data:', scores[0]) +print('Accuracy on test data:', scores[1]) + +При 500 нейронах +# создаем модель +model_1h500 = Sequential() +model_1h500.add(Dense(units=500, input_dim=num_pixels, activation='sigmoid')) +model_1h500.add(Dense(units=num_classes, activation='softmax')) +# компилируем модель +model_1h500.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) + +# вывод информации об архитектуре модели +print(model_1h500.summary()) + +# Обучаем модель +H_1h500 = model_1h500.fit(X_train, y_train, validation_split=0.1, epochs=50) + +# вывод графика ошибки по эпохам +plt.plot(H_1h500.history['loss']) +plt.plot(H_1h500.history['val_loss']) +plt.grid() +plt.xlabel('Epochs') +plt.ylabel('loss') +plt.legend(['train_loss', 'val_loss']) +plt.title('Loss by epochs') +plt.show() + +# Оценка качества работы модели на тестовых данных +scores = model_1h500.evaluate(X_test, y_test) +print('Loss on test data:', scores[0]) +print('Accuracy on test data:', scores[1]) + +Наилучшую метрику наблюдаем при архитектуре со 100 нейронами в скрытом слое. +### Пункт 9 +Добавили в наилучшую архитектуру, определенную в п. 8, второй скрытый слой и провели обучение и тестирование при 50 и 100 нейронах во втором скрытом слое. +При 50 нейронах +# создаем модель +model_1h100_2h50 = Sequential() +model_1h100_2h50.add(Dense(units=100, input_dim=num_pixels, activation='sigmoid')) +model_1h100_2h50.add(Dense(units=50, activation='sigmoid')) +model_1h100_2h50.add(Dense(units=num_classes, activation='softmax')) +# компилируем модель +model_1h100_2h50.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) + +# вывод информации об архитектуре модели +print(model_1h100_2h50.summary()) + +# Обучаем модель +H_1h100_2h50 = model_1h100_2h50.fit(X_train, y_train, validation_split=0.1, epochs=50) + +# вывод графика ошибки по эпохам +plt.plot(H_1h100_2h50.history['loss']) +plt.plot(H_1h100_2h50.history['val_loss']) +plt.grid() +plt.xlabel('Epochs') +plt.ylabel('loss') +plt.legend(['train_loss', 'val_loss']) +plt.title('Loss by epochs') +plt.show() + +# Оценка качества работы модели на тестовых данных +scores = model_1h100_2h50.evaluate(X_test, y_test) +print('Loss on test data:', scores[0]) +print('Accuracy on test data:', scores[1]) + +При 100 нейронах +# создаем модель +model_1h100_2h100 = Sequential() +model_1h100_2h100.add(Dense(units=100, input_dim=num_pixels, activation='sigmoid')) +model_1h100_2h100.add(Dense(units=100, activation='sigmoid')) +model_1h100_2h100.add(Dense(units=num_classes, activation='softmax')) +# компилируем модель +model_1h100_2h100.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) + +# вывод информации об архитектуре модели +print(model_1h100_2h100.summary()) + +# Обучаем модель +H_1h100_2h100 = model_1h100_2h100.fit(X_train, y_train, validation_split=0.1, epochs=50) + +# вывод графика ошибки по эпохам +plt.plot(H_1h100_2h100.history['loss']) +plt.plot(H_1h100_2h100.history['val_loss']) +plt.grid() +plt.xlabel('Epochs') +plt.ylabel('loss') +plt.legend(['train_loss', 'val_loss']) +plt.title('Loss by epochs') +plt.show() + +# Оценка качества работы модели на тестовых данных +scores = model_1h100_2h100.evaluate(X_test, y_test) +print('Loss on test data:', scores[0]) +print('Accuracy on test data:', scores[1]) + +### Пункт 10 +Результаты исследования архитектуры нейронной сети занесли в таблицу +### Таблица с результатами тестирования нейросетевых моделей + +| Количество скрытых слоёв | Количество нейронов в первом скрытом слое | Количество нейронов во втором скрытом слое | Значение метрики качества классификации | +|---------------------------|-------------------------------------------|--------------------------------------------|-----------------------------------------| +| 0 | - | - | 0.9199000000953674 | +| 1 | 100 | - | 0.9398000240325928 | +| | 300 | - | 0.9320999979972839 | +| | 500 | - | 0.9291999936103821 | +| 2 | 100 | 50 | 0.9409000277519226 | +| | 100 | 100 | 0.9416999816894531 | + + + +Исходя из нашего исследования, можно сделать вывод о том, что наилучшая архитектра - это архитектура с двумя скрытыми слоями (100 нейронов на первом скрытом слое и 100 на втором). +### Пункт 11 +Сохранили наилучшую нейронную сеть на диск + +model_1h100_2h100.save('best_model.keras') +### Пункт 12 +Вывели результаты тестирования модели +# вывод тестового изображения и результата распознавания 1 +n = 123 +result = model_1h100_2h100.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))) + +### Пункт 13 +Создали собственные изображения чисел +# загрузка собственного изображения +from PIL import Image +file_data = Image.open('five_v3.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_1h100_2h100.predict(test_img) +print('I think it\'s ', np.argmax(result)) + +### Пункт 14 +Создали копию нарисованных чисел и повернем их на 90 градусов. Протестируем работу нейронной сети. +file_data = Image.open('three_v3_rotated.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_1h100_2h100.predict(test_img) +print('I think it\'s ', np.argmax(result)) + +file_data = Image.open('five_v3_rotated.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_1h100_2h100.predict(test_img) +print('I think it\'s ', np.argmax(result)) + Нейросеть некорректно определила повернутые изображения. \ No newline at end of file