Сравнить коммиты
	
		
			5 Коммитов 
		
	
	
	| Автор | SHA1 | Дата | 
|---|---|---|
|  DanRie | a8217ec15e | 2 недель назад | 
|  DanRie | 2b771f3f16 | 2 недель назад | 
|  DanRie | 0cefa2a80b | 1 месяц назад | 
|  DanRie | 8ad9cbda10 | 1 месяц назад | 
|  DanRie | 96e8cf5799 | 1 месяц назад | 
| После Ширина: | Высота: | Размер: 13 KiB | 
| После Ширина: | Высота: | Размер: 25 KiB | 
| После Ширина: | Высота: | Размер: 19 KiB | 
| После Ширина: | Высота: | Размер: 24 KiB | 
| После Ширина: | Высота: | Размер: 22 KiB | 
| После Ширина: | Высота: | Размер: 29 KiB | 
| После Ширина: | Высота: | Размер: 22 KiB | 
| После Ширина: | Высота: | Размер: 28 KiB | 
| После Ширина: | Высота: | Размер: 26 KiB | 
| После Ширина: | Высота: | Размер: 25 KiB | 
| После Ширина: | Высота: | Размер: 19 KiB | 
| После Ширина: | Высота: | Размер: 13 KiB | 
| После Ширина: | Высота: | Размер: 19 KiB | 
| После Ширина: | Высота: | Размер: 12 KiB | 
| После Ширина: | Высота: | Размер: 13 KiB | 
| После Ширина: | Высота: | Размер: 17 KiB | 
| После Ширина: | Высота: | Размер: 28 KiB | 
| После Ширина: | Высота: | Размер: 19 KiB | 
| После Ширина: | Высота: | Размер: 25 KiB | 
| После Ширина: | Высота: | Размер: 20 KiB | 
| После Ширина: | Высота: | Размер: 20 KiB | 
| После Ширина: | Высота: | Размер: 26 KiB | 
| @ -0,0 +1,586 @@ | ||||
| # Отчёт по лабораторной работе №1 | ||||
| 
 | ||||
| **Кнзев Станислав, Жихарев Данила — А-02-22** | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 1) В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули. | ||||
| 
 | ||||
| ```python | ||||
| import os | ||||
| os.chdir('/content/drive/MyDrive/Colab Notebooks') | ||||
| current_directory = os.getcwd() | ||||
| print("Текущая директория:", current_directory) | ||||
| ``` | ||||
| 
 | ||||
| **Текущая директория:** `/content/drive/MyDrive/Colab Notebooks` | ||||
| 
 | ||||
| ```python | ||||
| # импорт модулей | ||||
| from tensorflow import keras | ||||
| import matplotlib.pyplot as plt | ||||
| import numpy as np | ||||
| import sklearn | ||||
| ``` | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 2) Загрузили набор данных MNIST, содержащий размеченные изображения рукописных цифр. | ||||
| 
 | ||||
| ```python | ||||
| # загрузка датасета | ||||
| from keras.datasets import mnist | ||||
| (X_train, y_train), (X_test, y_test) = mnist.load_data() | ||||
| ``` | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 3) Разбили набор данных на обучающие и тестовые данные в соотношении 60 000:10 000 элементов. | ||||
| При разбиении параметр `random_state` выбрали равным (4k – 1), где k - номер бригады, k = 6 ⇒ `random_state = 23`. | ||||
| 
 | ||||
| ```python | ||||
| # создание своего разбиения датасета | ||||
| 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 = 23) | ||||
| # вывод размерностей | ||||
| print('Shape of X train:', X_train.shape) | ||||
| print('Shape of y train:', y_train.shape) | ||||
| print('Shape of X test:', X_test.shape) | ||||
| print('Shape of y test:', y_test.shape) | ||||
| ``` | ||||
| 
 | ||||
| ``` | ||||
| Shape of X train: (60000, 28, 28) | ||||
| Shape of y train: (60000,) | ||||
| Shape of X test: (10000, 28, 28) | ||||
| Shape of y test: (10000,) | ||||
| ``` | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 4) Вывели первые 4 элемента обучающих данных (изображения и метки цифр). | ||||
| 
 | ||||
| ```python | ||||
| # вывод изображения | ||||
| for i in range(4): | ||||
|   plt.imshow(X_train[i], cmap=plt.get_cmap('gray')) | ||||
|   plt.show() | ||||
|   # вывод метки для этого изображения | ||||
|   print(y_train[i]) | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ``` | ||||
| 6 | ||||
| ``` | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ``` | ||||
| 4 | ||||
| ``` | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ``` | ||||
| 4 | ||||
| ``` | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ``` | ||||
| 3 | ||||
| ``` | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 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 | ||||
| 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) | ||||
| ``` | ||||
| 
 | ||||
| ```python | ||||
| # переведем метки в one-hot | ||||
| from keras.utils import to_categorical | ||||
| y_train = to_categorical(y_train) | ||||
| y_test = to_categorical(y_test) | ||||
| print('Shape of transformed y train:', y_train.shape) | ||||
| num_classes = y_train.shape[1] | ||||
| ``` | ||||
| 
 | ||||
| ``` | ||||
| Shape of transformed y train: (60000, 10) | ||||
| ``` | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 6) Реализовали модель однослойной нейронной сети и обучили ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывели информацию об архитектуре нейронной сети. Вывели график функции ошибки на обучающих и валидационных данных по эпохам. | ||||
| 
 | ||||
| **Параметры:** | ||||
| - количество скрытых слоёв: 0 | ||||
| - функция активации выходного слоя: `softmax` | ||||
| - функция ошибки: `categorical_crossentropy` | ||||
| - алгоритм обучения: `sgd` | ||||
| - метрика качества: `accuracy` | ||||
| - количество эпох: 50 | ||||
| - доля валидационных данных от обучающих: 0.1 | ||||
| 
 | ||||
| ```python | ||||
| from keras.models import Sequential | ||||
| from keras.layers import Dense | ||||
| 
 | ||||
| # создаем модель | ||||
| model_1output = Sequential() | ||||
| model_1output.add(Dense(units=num_classes, input_dim=num_pixels, activation='softmax')) | ||||
| # компилируем модель | ||||
| model_1output.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) | ||||
| 
 | ||||
| # вывод информации об архитектуре модели | ||||
| print(model_1output.summary()) | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # Обучаем модель | ||||
| H_1output = model_1output.fit(X_train, y_train, validation_split=0.1, epochs=50) | ||||
| ``` | ||||
| 
 | ||||
| ```python | ||||
| # вывод графика ошибки по эпохам | ||||
| 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) Применили обученную модель к тестовым данным. Вывели значение функции ошибки и значение метрики качества классификации на тестовых данных. | ||||
| 
 | ||||
| ```python | ||||
| # Оценка качества работы модели на тестовых данных | ||||
| scores = model_1output.evaluate(X_test, y_test) | ||||
| print('Loss on test data:', scores[0]) | ||||
| print('Accuracy on test data:', scores[1]) | ||||
| ``` | ||||
| 
 | ||||
| ``` | ||||
| Loss on test data: 0.28093650937080383 | ||||
| Accuracy on test data: 0.921500027179718 | ||||
| ``` | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 8) Добавили в модель один скрытый и провели обучение и тестирование (повторить п. 6–7) при 100, 300, 500 нейронах в скрытом слое. По метрике качества классификации на тестовых данных выбрали наилучшее количество нейронов в скрытом слое. В качестве функции активации нейронов в скрытом слое использовали функцию `sigmoid`. | ||||
| 
 | ||||
| ### При 100 нейронах в скрытом слое: | ||||
| 
 | ||||
| ```python | ||||
| # создаем модель | ||||
| 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()) | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # Обучаем модель | ||||
| H_1h100 = model_1h100.fit(X_train, y_train, validation_split=0.1, epochs=50) | ||||
| ``` | ||||
| 
 | ||||
| ```python | ||||
| # вывод графика ошибки по эпохам | ||||
| 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() | ||||
| ``` | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # Оценка качества работы модели на тестовых данных | ||||
| scores = model_1h100.evaluate(X_test, y_test) | ||||
| print('Loss on test data:', scores[0]) | ||||
| print('Accuracy on test data:', scores[1]) | ||||
| ``` | ||||
| 
 | ||||
| ``` | ||||
| Loss on test data: 0.20816442370414734 | ||||
| Accuracy on test data: 0.9397000074386597 | ||||
| ``` | ||||
| 
 | ||||
| ### При 300 нейронах в скрытом слое: | ||||
| 
 | ||||
| ```python | ||||
| # создаем модель | ||||
| 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()) | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # Обучаем модель | ||||
| H_1h300 = model_1h300.fit(X_train, y_train, validation_split=0.1, epochs=50) | ||||
| ``` | ||||
| 
 | ||||
| ```python | ||||
| # вывод графика ошибки по эпохам | ||||
| 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() | ||||
| ``` | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # Оценка качества работы модели на тестовых данных | ||||
| scores = model_1h300.evaluate(X_test, y_test) | ||||
| print('Loss on test data:', scores[0]) | ||||
| print('Accuracy on test data:', scores[1]) | ||||
| ``` | ||||
| 
 | ||||
| ``` | ||||
| Loss on test data: 0.2359277904033661 | ||||
| Accuracy on test data: 0.9320999979972839 | ||||
| ``` | ||||
| 
 | ||||
| ### При 500 нейронах в скрытом слое: | ||||
| 
 | ||||
| ```python | ||||
| # создаем модель | ||||
| 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()) | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # Обучаем модель | ||||
| H_1h500 = model_1h500.fit(X_train, y_train, validation_split=0.1, epochs=50) | ||||
| ``` | ||||
| 
 | ||||
| ```python | ||||
| # вывод графика ошибки по эпохам | ||||
| 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() | ||||
| ``` | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # Оценка качества работы модели на тестовых данных | ||||
| scores = model_1h500.evaluate(X_test, y_test) | ||||
| print('Loss on test data:', scores[0]) | ||||
| print('Accuracy on test data:', scores[1]) | ||||
| ``` | ||||
| 
 | ||||
| ``` | ||||
| Loss on test data: 0.25467056035995483 | ||||
| Accuracy on test data: 0.9280999898910522 | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| **Лучшая метрика получилась равной 0.9437 при архитектуре со 100 нейронами в скрытом слое, поэтому в дальнейшем используем ее.** | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 9) Добавили в наилучшую архитектуру, определенную в п. 8, второй скрытый слой и провели обучение и тестирование при 50 и 100 нейронах во втором скрытом слое. В качестве функции активации нейронов в скрытом слое использовали функцию `sigmoid`. | ||||
| 
 | ||||
| ### При 50 нейронах во втором скрытом слое: | ||||
| 
 | ||||
| ```python | ||||
| # создаем модель | ||||
| 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()) | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # Обучаем модель | ||||
| H_1h100_2h50 = model_1h100_2h50.fit(X_train, y_train, validation_split=0.1, epochs=50) | ||||
| ``` | ||||
| 
 | ||||
| ```python | ||||
| # вывод графика ошибки по эпохам | ||||
| 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() | ||||
| ``` | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # Оценка качества работы модели на тестовых данных | ||||
| scores = model_1h100_2h50.evaluate(X_test, y_test) | ||||
| print('Loss on test data:', scores[0]) | ||||
| print('Accuracy on test data:', scores[1]) | ||||
| ``` | ||||
| 
 | ||||
| ``` | ||||
| Loss on test data: 0.19274231791496277 | ||||
| Accuracy on test data: 0.9430000185966492 | ||||
| ``` | ||||
| 
 | ||||
| ### При 100 нейронах во втором скрытом слое: | ||||
| 
 | ||||
| ```python | ||||
| # создаем модель | ||||
| 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()) | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # Обучаем модель | ||||
| H_1h100_2h100 = model_1h100_2h100.fit(X_train, y_train, validation_split=0.1, epochs=50) | ||||
| ``` | ||||
| 
 | ||||
| ```python | ||||
| # вывод графика ошибки по эпохам | ||||
| 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() | ||||
| ``` | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # Оценка качества работы модели на тестовых данных | ||||
| scores = model_1h100_2h100.evaluate(X_test, y_test) | ||||
| print('Loss on test data:', scores[0]) | ||||
| print('Accuracy on test data:', scores[1]) | ||||
| ``` | ||||
| 
 | ||||
| ``` | ||||
| Loss on test data: 0.21183738112449646 | ||||
| Accuracy on test data: 0.9372000098228455 | ||||
| ``` | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 10) Результаты исследования архитектуры нейронной сети занесли в таблицу: | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| 
 | ||||
| ### По результатам исследования сделали выводы и выбрали наилучшую архитектуру нейронной сети с точки зрения качества классификации. | ||||
| 
 | ||||
| **Из таблицы следует, что лучшей архитектурой является НС с двумя скрытыми слоями по 100 и 50 нейронов соответственно, затем идет НС с одним скрытым слоем и 100 нейронами. При увеличении количества нейронов в скрытых слоях значение метрики качества падает. Такая тенденция возникает из-за простоты датасета MNIST, при усложнении архитектуры НС начинает переобучаться, а оценка качества на тестовых данных падает.** | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 11) Сохранили наилучшую нейронную сеть на диск. | ||||
| 
 | ||||
| ```python | ||||
| # сохранение модели на диск | ||||
| model_1h100_2h50.save('/content/drive/MyDrive/Colab Notebooks/laba1/model_1h100_2h50.keras') | ||||
| ``` | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 12) Для нейронной сети наилучшей архитектуры вывели два тестовых изображения, истинные метки и результат распознавания изображений. | ||||
| 
 | ||||
| ```python | ||||
| #Результаты для двух тестовых изображений | ||||
| for n in [3,26]: | ||||
|   result = model_1h100_2h50.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) Создали собственные изображения рукописных цифр, подобное представленным в наборе MNIST. Цифру выбрали как остаток от деления на 10 числа своего дня рождения (26 ноября → 26 mod 10 = 6, 3 июля → 3 mod 10 = 3). Сохранили изображения. Загрузили, предобработали и подали на вход обученной нейронной сети собственные изображения. Вывели изображения и результаты распознавания. | ||||
| 
 | ||||
| ```python | ||||
| # загрузка собственного изображения | ||||
| from PIL import Image | ||||
| file1_data = Image.open('/content/drive/MyDrive/Colab Notebooks/laba1/цифра 3.png') | ||||
| file1_data = file1_data.convert('L') # перевод в градации серого | ||||
| test1_img = np.array(file1_data) | ||||
| plt.imshow(test1_img, cmap=plt.get_cmap('gray')) | ||||
| plt.show() | ||||
| 
 | ||||
| from PIL import Image | ||||
| file2_data = Image.open('/content/drive/MyDrive/Colab Notebooks/laba1/цифра 6.png') | ||||
| file2_data = file2_data.convert('L') # перевод в градации серого | ||||
| test2_img = np.array(file2_data) | ||||
| 
 | ||||
| # вывод собственного изображения | ||||
| plt.imshow(test1_img, cmap=plt.get_cmap('gray')) | ||||
| plt.imshow(test2_img, cmap=plt.get_cmap('gray')) | ||||
| plt.show() | ||||
| ``` | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| 
 | ||||
| ```python | ||||
| # предобработка | ||||
| test1_img = test1_img / 255 | ||||
| test1_img = test1_img.reshape(1, num_pixels) | ||||
| test2_img = test2_img / 255 | ||||
| test2_img = test2_img.reshape(1, num_pixels) | ||||
| 
 | ||||
| # распознавание | ||||
| result1 = model_1h100_2h50.predict(test1_img) | ||||
| print('Я думаю это ', np.argmax(result1)) | ||||
| 
 | ||||
| result2 = model_1h100_2h50.predict(test2_img) | ||||
| print('Я думаю это ', np.argmax(result2)) | ||||
| ``` | ||||
| 
 | ||||
| ``` | ||||
| 1/1  ━━━━━━━━━━━━━━━━━━━━  0s 36ms/step | ||||
| Я думаю это  3 | ||||
| 
 | ||||
| 1/1  ━━━━━━━━━━━━━━━━━━━━  0s 37ms/step | ||||
| Я думаю это  6 | ||||
| ``` | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 14) Создать копию собственного изображения, отличающуюся от оригинала поворотом на 90 градусов в любую сторону. Сохранили изображения. Загрузили, предобработали и подали на вход обученной нейронной сети измененные изображения. Вывели изображения и результаты распознавания. Сделали выводы по результатам эксперимента. | ||||
| 
 | ||||
| ```python | ||||
| # загрузка собственного изображения | ||||
| from PIL import Image | ||||
| file3_data = Image.open('/content/drive/MyDrive/Colab Notebooks/laba1/цифра 3 перевернутая.png') | ||||
| file3_data = file3_data.convert('L') # перевод в градации серого | ||||
| test3_img = np.array(file3_data) | ||||
| plt.imshow(test3_img, cmap=plt.get_cmap('gray')) | ||||
| plt.show() | ||||
| 
 | ||||
| from PIL import Image | ||||
| file4_data = Image.open('/content/drive/MyDrive/Colab Notebooks/laba1/цифра 6 перевернутая.png') | ||||
| file4_data = file4_data.convert('L') # перевод в градации серого | ||||
| test4_img = np.array(file4_data) | ||||
| 
 | ||||
| # вывод собственного изображения | ||||
| plt.imshow(test3_img, cmap=plt.get_cmap('gray')) | ||||
| plt.imshow(test4_img, cmap=plt.get_cmap('gray')) | ||||
| plt.show() | ||||
| ``` | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # предобработка | ||||
| test3_img = test3_img / 255 | ||||
| test3_img = test3_img.reshape(1, num_pixels) | ||||
| test4_img = test4_img / 255 | ||||
| test4_img = test4_img.reshape(1, num_pixels) | ||||
| 
 | ||||
| # распознавание | ||||
| result3 = model_1h100_2h50.predict(test3_img) | ||||
| print('Я думаю это ', np.argmax(result3)) | ||||
| 
 | ||||
| result4 = model_1h100_2h50.predict(test4_img) | ||||
| print('Я думаю это ', np.argmax(result4)) | ||||
| ``` | ||||
| 
 | ||||
| ``` | ||||
| 1/1  ━━━━━━━━━━━━━━━━━━━━  0s 35ms/step | ||||
| Я думаю это  5 | ||||
| 
 | ||||
| 1/1  ━━━━━━━━━━━━━━━━━━━━  0s 35ms/step | ||||
| Я думаю это  4 | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| **При повороте рисунков цифр НС не смогла их правильно распознать. Так получилось потому что НС не обучалась на перевернутых изображениях** | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| 
 | ||||
| После Ширина: | Высота: | Размер: 1.3 KiB | 
| После Ширина: | Высота: | Размер: 1.2 KiB | 
| После Ширина: | Высота: | Размер: 1.2 KiB | 
| После Ширина: | Высота: | Размер: 1.1 KiB | 
| @ -0,0 +1,6 @@ | ||||
| 5.528552372507079760e+00 5.559228990189748920e+00 | ||||
| 5.648388730839360328e+00 5.694735265167601135e+00 | ||||
| 6.034000861003956828e+00 6.014071576183726897e+00 | ||||
| 6.514146742942168800e+00 6.578190189984116643e+00 | ||||
| 6.639221608726088597e+00 6.634545308633034288e+00 | ||||
| 
 | ||||
| После Ширина: | Высота: | Размер: 42 KiB | 
| После Ширина: | Высота: | Размер: 22 KiB | 
| После Ширина: | Высота: | Размер: 24 KiB | 
| После Ширина: | Высота: | Размер: 29 KiB | 
| После Ширина: | Высота: | Размер: 22 KiB | 
| После Ширина: | Высота: | Размер: 48 KiB | 
| После Ширина: | Высота: | Размер: 107 KiB | 
| После Ширина: | Высота: | Размер: 32 KiB | 
| После Ширина: | Высота: | Размер: 84 KiB | 
| После Ширина: | Высота: | Размер: 96 KiB | 
| После Ширина: | Высота: | Размер: 30 KiB | 
| После Ширина: | Высота: | Размер: 61 KiB | 
| После Ширина: | Высота: | Размер: 73 KiB | 
| После Ширина: | Высота: | Размер: 94 KiB | 
| После Ширина: | Высота: | Размер: 87 KiB | 
| После Ширина: | Высота: | Размер: 52 KiB | 
| После Ширина: | Высота: | Размер: 55 KiB | 
| @ -0,0 +1,871 @@ | ||||
| { | ||||
|   "cells": [ | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "id": "1c1905f6-acba-4dba-aba9-4d2fe59298df", | ||||
|       "metadata": { | ||||
|         "id": "1c1905f6-acba-4dba-aba9-4d2fe59298df" | ||||
|       }, | ||||
|       "source": [ | ||||
|         "## Задание 1" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "id": "61f467d3-d1c1-481a-8560-f259a22e0824", | ||||
|       "metadata": { | ||||
|         "id": "61f467d3-d1c1-481a-8560-f259a22e0824" | ||||
|       }, | ||||
|       "source": [ | ||||
|         "### 1) В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули." | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "execution_count": null, | ||||
|       "id": "58e787ca-562f-458d-8c62-e86b6fb1580a", | ||||
|       "metadata": { | ||||
|         "id": "58e787ca-562f-458d-8c62-e86b6fb1580a" | ||||
|       }, | ||||
|       "outputs": [], | ||||
|       "source": [ | ||||
|         "# импорт модулей\n", | ||||
|         "import os\n", | ||||
|         "os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab2')\n", | ||||
|         "\n", | ||||
|         "import numpy as np\n", | ||||
|         "import lab02_lib as lib" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "id": "5bbb8290-8806-4184-b33b-f1b0680bf563", | ||||
|       "metadata": { | ||||
|         "id": "5bbb8290-8806-4184-b33b-f1b0680bf563" | ||||
|       }, | ||||
|       "source": [ | ||||
|         "### 2) Сгенерировали индивидуальный набор двумерных данных в пространстве признаков с координатами центра (6, 6), где 6 – номер бригады. Вывели полученные данные на рисунок и в консоль." | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "execution_count": null, | ||||
|       "id": "29603d03-8478-4341-b7ad-bb608ad88890", | ||||
|       "metadata": { | ||||
|         "id": "29603d03-8478-4341-b7ad-bb608ad88890" | ||||
|       }, | ||||
|       "outputs": [], | ||||
|       "source": [ | ||||
|         "# генерация датасета\n", | ||||
|         "data = lib.datagen(6, 6, 1000, 2)\n", | ||||
|         "\n", | ||||
|         "# вывод данных и размерности\n", | ||||
|         "print('Исходные данные:')\n", | ||||
|         "print(data)\n", | ||||
|         "print('Размерность данных:')\n", | ||||
|         "print(data.shape)" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "id": "00ba79e5-d8f9-4c40-a065-e8fd21a68e21", | ||||
|       "metadata": { | ||||
|         "id": "00ba79e5-d8f9-4c40-a065-e8fd21a68e21" | ||||
|       }, | ||||
|       "source": [ | ||||
|         "### 3) Создали и обучили автокодировщик AE1 простой архитектуры, выбрав небольшое количество эпох обучения. Зафиксировали в таблице вида табл.1 количество скрытых слоёв и нейронов в них" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "execution_count": null, | ||||
|       "id": "bc736f50-204b-4b1d-8c1c-0dd34fb1f02b", | ||||
|       "metadata": { | ||||
|         "id": "bc736f50-204b-4b1d-8c1c-0dd34fb1f02b" | ||||
|       }, | ||||
|       "outputs": [], | ||||
|       "source": [ | ||||
|         "# обучение AE1\n", | ||||
|         "patience = 300\n", | ||||
|         "ae1_trained, IRE1, IREth1 = lib.create_fit_save_ae(data,'out/AE1.h5','out/AE1_ire_th.txt',\n", | ||||
|         "1000, True, patience)" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "id": "ae9e6816-d300-455a-a4ee-77e4911e02f5", | ||||
|       "metadata": { | ||||
|         "id": "ae9e6816-d300-455a-a4ee-77e4911e02f5" | ||||
|       }, | ||||
|       "source": [ | ||||
|         "### 4) Зафиксировали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксировали порог ошибки реконструкции – порог обнаружения аномалий." | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "Ошибка MSE_AE1 = 19.5568" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "Np8zquNSgtO9" | ||||
|       }, | ||||
|       "id": "Np8zquNSgtO9" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "execution_count": null, | ||||
|       "id": "fb7eeae8-f478-4295-b6de-b5790b7861f2", | ||||
|       "metadata": { | ||||
|         "id": "fb7eeae8-f478-4295-b6de-b5790b7861f2" | ||||
|       }, | ||||
|       "outputs": [], | ||||
|       "source": [ | ||||
|         "# Построение графика ошибки реконструкции\n", | ||||
|         "lib.ire_plot('training', IRE1, IREth1, 'AE1')" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "id": "92fb420f-907e-4417-ab34-6d12308bed0b", | ||||
|       "metadata": { | ||||
|         "id": "92fb420f-907e-4417-ab34-6d12308bed0b" | ||||
|       }, | ||||
|       "source": [ | ||||
|         "### 5) Создали и обучили второй автокодировщик AE2 с усложненной архитектурой, задав большее количество эпох обучения" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "execution_count": null, | ||||
|       "id": "bb9f83e2-fecf-4118-8376-a712726d12d5", | ||||
|       "metadata": { | ||||
|         "id": "bb9f83e2-fecf-4118-8376-a712726d12d5" | ||||
|       }, | ||||
|       "outputs": [], | ||||
|       "source": [ | ||||
|         "# обучение AE2\n", | ||||
|         "ae2_trained, IRE2, IREth2 = lib.create_fit_save_ae(data,'out/AE2.h5','out/AE2_ire_th.txt',\n", | ||||
|         "3000, True, patience)" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "id": "03194c1b-c03e-42a5-93e5-f4d007ddb7c7", | ||||
|       "metadata": { | ||||
|         "id": "03194c1b-c03e-42a5-93e5-f4d007ddb7c7" | ||||
|       }, | ||||
|       "source": [ | ||||
|         "### 6) Зафиксировали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксировали второй порог ошибки реконструкции – порог обнаружения аномалий." | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "Ошибка MSE_AE2 = 0.0108" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "6TBPoMskhCQp" | ||||
|       }, | ||||
|       "id": "6TBPoMskhCQp" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "execution_count": null, | ||||
|       "id": "47cf147a-f97b-41d3-9d7c-b799da0115fe", | ||||
|       "metadata": { | ||||
|         "id": "47cf147a-f97b-41d3-9d7c-b799da0115fe" | ||||
|       }, | ||||
|       "outputs": [], | ||||
|       "source": [ | ||||
|         "# Построение графика ошибки реконструкции\n", | ||||
|         "lib.ire_plot('training', IRE2, IREth2, 'AE2')" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "id": "fd14d331-aad6-4b98-9926-5ab6a055beb0", | ||||
|       "metadata": { | ||||
|         "id": "fd14d331-aad6-4b98-9926-5ab6a055beb0" | ||||
|       }, | ||||
|       "source": [ | ||||
|         "### 7) Рассчитали характеристики качества обучения EDCA для AE1 и AE2. Визуализировали и сравнили области пространства признаков, распознаваемые автокодировщиками AE1 и AE2. Сделали вывод о пригодности AE1 и AE2 для качественного обнаружения аномалий.\n" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "execution_count": null, | ||||
|       "id": "58fd0b46-1064-4f2f-b04f-88307bf938d2", | ||||
|       "metadata": { | ||||
|         "id": "58fd0b46-1064-4f2f-b04f-88307bf938d2" | ||||
|       }, | ||||
|       "outputs": [], | ||||
|       "source": [ | ||||
|         "# построение областей покрытия и границ классов\n", | ||||
|         "# расчет характеристик качества обучения\n", | ||||
|         "numb_square = 20\n", | ||||
|         "xx, yy, Z1 = lib.square_calc(numb_square, data, ae1_trained, IREth1, '1', True)" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# построение областей покрытия и границ классов\n", | ||||
|         "# расчет характеристик качества обучения\n", | ||||
|         "numb_square = 20\n", | ||||
|         "xx, yy, Z2 = lib.square_calc(numb_square, data, ae2_trained, IREth2, '2', True)" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "ZG72thVfYMOy" | ||||
|       }, | ||||
|       "id": "ZG72thVfYMOy", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# сравнение характеристик качества обучения и областей аппроксимации\n", | ||||
|         "lib.plot2in1(data, xx, yy, Z1, Z2)" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "RJWYYYHQbUIN" | ||||
|       }, | ||||
|       "id": "RJWYYYHQbUIN", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "id": "d766b8f0-3ba7-4a73-94a0-7858eb2f5515", | ||||
|       "metadata": { | ||||
|         "id": "d766b8f0-3ba7-4a73-94a0-7858eb2f5515" | ||||
|       }, | ||||
|       "source": [ | ||||
|         "### 8) Если автокодировщик AE2 недостаточно точно аппроксимирует область обучающих данных, то подобрать подходящие параметры автокодировщика и повторить шаги (6) – (8)." | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "Полученные показатели EDCA для автокодировщика AE2 нас устраивают." | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "XbnbvTima5dv" | ||||
|       }, | ||||
|       "id": "XbnbvTima5dv" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "id": "cfa38b82-4c8e-4437-9c25-581d7fea0f2c", | ||||
|       "metadata": { | ||||
|         "id": "cfa38b82-4c8e-4437-9c25-581d7fea0f2c" | ||||
|       }, | ||||
|       "source": [ | ||||
|         "### 9) Изучили сохраненный набор данных и пространство признаков. Создали тестовую выборку, состоящую, как минимум, из 4ёх элементов, не входящих в обучающую выборку. Элементы должны быть такими, чтобы AE1 распознавал их как норму, а AE2 детектировал как аномалии." | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "execution_count": null, | ||||
|       "id": "d618382f-f65a-4c17-b0d0-3d2d0c4bc50e", | ||||
|       "metadata": { | ||||
|         "id": "d618382f-f65a-4c17-b0d0-3d2d0c4bc50e" | ||||
|       }, | ||||
|       "outputs": [], | ||||
|       "source": [ | ||||
|         "# загрузка тестового набора\n", | ||||
|         "data_test = np.loadtxt('data_test.txt', dtype=float)\n", | ||||
|         "print(data_test)" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "### 10) Применили обученные автокодировщики AE1 и AE2 к тестовым данным и вывели значения ошибки реконструкции для каждого элемента тестовой выборки относительно порога на график и в консоль." | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "3Ce8wSVMdjBj" | ||||
|       }, | ||||
|       "id": "3Ce8wSVMdjBj" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# тестирование АE1\n", | ||||
|         "predicted_labels1, ire1 = lib.predict_ae(ae1_trained, data_test, IREth1)" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "Hq8A0LyMcKXk" | ||||
|       }, | ||||
|       "id": "Hq8A0LyMcKXk", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# тестирование АE1\n", | ||||
|         "lib.anomaly_detection_ae(predicted_labels1, ire1, IREth1)\n", | ||||
|         "lib.ire_plot('test', ire1, IREth1, 'AE1')" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "Z_v2X4HvcQD5" | ||||
|       }, | ||||
|       "id": "Z_v2X4HvcQD5", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# тестирование АE2\n", | ||||
|         "predicted_labels2, ire2 = lib.predict_ae(ae2_trained, data_test, IREth2)" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "fT75bpEnc7a2" | ||||
|       }, | ||||
|       "id": "fT75bpEnc7a2", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# тестирование АE2\n", | ||||
|         "lib.anomaly_detection_ae(predicted_labels2, ire2, IREth2)\n", | ||||
|         "lib.ire_plot('test', ire2, IREth2, 'AE2')" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "EpGtgYZVdAen" | ||||
|       }, | ||||
|       "id": "EpGtgYZVdAen", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "id": "7acf3a7f-4dd8-44df-b201-509aa4caa7f0", | ||||
|       "metadata": { | ||||
|         "id": "7acf3a7f-4dd8-44df-b201-509aa4caa7f0" | ||||
|       }, | ||||
|       "source": [ | ||||
|         "### 11) Визуализировали элементы обучающей и тестовой выборки в областях пространства признаков, распознаваемых автокодировщиками AE1 и AE2." | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "execution_count": null, | ||||
|       "id": "a2fbf3a9-5e11-49d0-a0db-f77f3edeb7b7", | ||||
|       "metadata": { | ||||
|         "id": "a2fbf3a9-5e11-49d0-a0db-f77f3edeb7b7" | ||||
|       }, | ||||
|       "outputs": [], | ||||
|       "source": [ | ||||
|         "# построение областей аппроксимации и точек тестового набора\n", | ||||
|         "lib.plot2in1_anomaly(data, xx, yy, Z1, Z2, data_test)" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "id": "bd63edf4-3452-41db-8080-d8a2ff4f09a4", | ||||
|       "metadata": { | ||||
|         "id": "bd63edf4-3452-41db-8080-d8a2ff4f09a4" | ||||
|       }, | ||||
|       "source": [ | ||||
|         "### 12) Результаты исследования занесли в таблицу:\n", | ||||
|         "Табл. 1 Результаты задания №1" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "|      | Количество<br>скрытых слоев | Количество<br>нейронов в скрытых слоях | Количество<br>эпох обучения | Ошибка<br>MSE_stop | Порог ошибки<br>реконструкции | Значение показателя<br>Excess | Значение показателя<br>Approx | Количество обнаруженных<br>аномалий |\n", | ||||
|         "|-----:|------------------------------|----------------------------------------|-----------------------------|--------------------|-------------------------------|-------------------------------|--------------------------------|-------------------------------------|\n", | ||||
|         "| AE1  | 1                            | 1                            | 1000                        | 19.5568             | 6.53                         | 12.67                          | 0.073                           | 0                                   |\n", | ||||
|         "| AE2  | 5                            | 3,2,1,2,3                                | 3000                          | 0.0108             | 0.4                         | 0.33                          | 0.750                           | 4                                   |\n" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "df2BIryKfkpk" | ||||
|       }, | ||||
|       "id": "df2BIryKfkpk" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "id": "b8e54861-e2c2-4755-a2d8-5d4b6cace481", | ||||
|       "metadata": { | ||||
|         "id": "b8e54861-e2c2-4755-a2d8-5d4b6cace481" | ||||
|       }, | ||||
|       "source": [ | ||||
|         "### 13) Сделали выводы о требованиях к:\n", | ||||
|         "- данным для обучения,\n", | ||||
|         "- архитектуре автокодировщика,\n", | ||||
|         "- количеству эпох обучения,\n", | ||||
|         "- ошибке MSE_stop, приемлемой для останова обучения,\n", | ||||
|         "- ошибке реконструкции обучающей выборки (порогу обнаружения\n", | ||||
|         "аномалий),\n", | ||||
|         "- характеристикам качества обучения EDCA одноклассового\n", | ||||
|         "классификатора\n", | ||||
|         "\n", | ||||
|         "для качественного обнаружения аномалий в данных." | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "1) Данные для обучения должны быть без аномалий, чтобы автокодировщик смог рассчитать верное пороговое значение\n", | ||||
|         "2) Архитектура автокодировщика должна постепенно сужатся к бутылочному горлышку,а затем постепенно возвращатся к исходным выходным размерам, кол-во скрытых слоев 3-5\n", | ||||
|         "3) В рамках данного набора данных оптимальное кол-во эпох 3000 с patience 300 эпох\n", | ||||
|         "4) Оптимальная ошибка MSE-stop в районе 0.01, желательно не меньше для предотвращения переобучения\n", | ||||
|         "5) Значение порога в районе 0.4\n", | ||||
|         "6) Значение Excess не больше 0.5, значение Deficit равное 0, значение Coating равное 1, значение Approx не меньше 0.7" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "1s5_ye8vkleI" | ||||
|       }, | ||||
|       "id": "1s5_ye8vkleI" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "## Задание 2" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "rqdVflKXo6Bo" | ||||
|       }, | ||||
|       "id": "rqdVflKXo6Bo" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "### 1) Изучить описание своего набора реальных данных, что он из себя представляет" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "rSvJtTReo928" | ||||
|       }, | ||||
|       "id": "rSvJtTReo928" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "Бригада 6 => набор данных Cardio. Это реальный набор данных, который состоит из измерений частоты сердечных сокращений плода и\n", | ||||
|         "сокращений матки на кардиотокограммах, классифицированных экспертами\n", | ||||
|         "акушерами. Исходный набор данных предназначен для классификации. В нем\n", | ||||
|         "представлено 3 класса: «норма», «подозрение» и «патология». Для обнаружения\n", | ||||
|         "аномалий класс «норма» принимается за норму, класс «патология» принимается за\n", | ||||
|         "аномалии, а класс «подозрение» был отброшен.\n", | ||||
|         "\n", | ||||
|         "| Количество<br>признаков | Количество<br>примеров | Количество<br>нормальных примеров | Количество<br>аномальных примеров |\n", | ||||
|         "|-------------------------:|-----------------------:|----------------------------------:|-----------------------------------:|\n", | ||||
|         "| 21                       | 1764                   | 1655                               | 109                                |\n" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "gf-0gJ7jqTdk" | ||||
|       }, | ||||
|       "id": "gf-0gJ7jqTdk" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "### 2) Загрузить многомерную обучающую выборку реальных данных Cardio.txt." | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "N2Egw1pho-F_" | ||||
|       }, | ||||
|       "id": "N2Egw1pho-F_" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# загрузка обчуающей выборки\n", | ||||
|         "train = np.loadtxt('data/cardio_train.txt', dtype=float)" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "G8QTxAFapASY" | ||||
|       }, | ||||
|       "id": "G8QTxAFapASY", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "### 3) Вывести полученные данные и их размерность в консоли." | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "zj2WXPNco-Tz" | ||||
|       }, | ||||
|       "id": "zj2WXPNco-Tz" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "print('train:\\n', train)\n", | ||||
|         "print('train.shape:', np.shape(train))" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "W6hTlfk6pAo9" | ||||
|       }, | ||||
|       "id": "W6hTlfk6pAo9", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "### 4) Создать и обучить автокодировщик с подходящей для данных архитектурой. Выбрать необходимое количество эпох обучения." | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "0T11A0x4o-gr" | ||||
|       }, | ||||
|       "id": "0T11A0x4o-gr" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# **kwargs\n", | ||||
|         "# verbose_every_n_epochs - отображать прогресс каждые N эпох (по умолчанию - 1000)\n", | ||||
|         "# early_stopping_delta - дельта для ранней остановки (по умолчанию - 0.01)\n", | ||||
|         "# early_stopping_value = значение для ранней остановки (по умолчанию -  0.0001)\n", | ||||
|         "\n", | ||||
|         "from time import time\n", | ||||
|         "\n", | ||||
|         "patience = 4000\n", | ||||
|         "start = time()\n", | ||||
|         "ae3_v1_trained, IRE3_v1, IREth3_v1 = lib.create_fit_save_ae(train,'out/AE3_V1.h5','out/AE3_v1_ire_th.txt',\n", | ||||
|         "100000, False, patience, early_stopping_delta = 0.001)\n", | ||||
|         "print(\"Время на обучение: \", time() - start)" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "rPwtBtdRPztp" | ||||
|       }, | ||||
|       "id": "rPwtBtdRPztp", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "### 5) Зафиксировать ошибку MSE, на которой обучение завершилось. Построить график ошибки реконструкции обучающей выборки. Зафиксировать порог ошибки реконструкции – порог обнаружения аномалий." | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "8ALjaY8lo-sa" | ||||
|       }, | ||||
|       "id": "8ALjaY8lo-sa" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "Скрытых слоев 7, нейроны: 46->26->14->10->14->26->48\n", | ||||
|         "\n", | ||||
|         "Ошибка MSE_AE3_v1 = 0.0126" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "b4sk_fhYY6Qb" | ||||
|       }, | ||||
|       "id": "b4sk_fhYY6Qb" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# Построение графика ошибки реконструкции\n", | ||||
|         "lib.ire_plot('training', IRE3_v1, IREth3_v1, 'AE3_v1')" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "a4sR3SSDpBPU" | ||||
|       }, | ||||
|       "id": "a4sR3SSDpBPU", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "### 6) Сделать вывод о пригодности обученного автокодировщика для качественного обнаружения аномалий. Если порог ошибки реконструкции слишком велик, то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (6)." | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "DGBM9xNFo-4k" | ||||
|       }, | ||||
|       "id": "DGBM9xNFo-4k" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# **kwargs\n", | ||||
|         "# verbose_every_n_epochs - отображать прогресс каждые N эпох (по умолчанию - 1000)\n", | ||||
|         "# early_stopping_delta - дельта для ранней остановки (по умолчанию - 0.01)\n", | ||||
|         "# early_stopping_value = значение для ранней остановки (по умолчанию -  0.0001)\n", | ||||
|         "\n", | ||||
|         "from time import time\n", | ||||
|         "\n", | ||||
|         "patience = 4000\n", | ||||
|         "start = time()\n", | ||||
|         "ae3_v2_trained, IRE3_v2, IREth3_v2 = lib.create_fit_save_ae(train,'out/AE3_V2.h5','out/AE3_v2_ire_th.txt',\n", | ||||
|         "100000, False, patience, early_stopping_delta = 0.001)\n", | ||||
|         "print(\"Время на обучение: \", time() - start)" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "ZvM1VbKEgalO" | ||||
|       }, | ||||
|       "id": "ZvM1VbKEgalO", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "Скрытых слоев 7, нейроны: 48->36->28->22->16->12->16->22->28->36->48\n", | ||||
|         "\n", | ||||
|         "Ошибка MSE_AE3_v1 = 0.0098" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "9BrPUb_8fX5R" | ||||
|       }, | ||||
|       "id": "9BrPUb_8fX5R" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# Построение графика ошибки реконструкции\n", | ||||
|         "lib.ire_plot('training', IRE3_v2, IREth3_v2, 'AE3_v2')" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "kh1eMtvpf6F-" | ||||
|       }, | ||||
|       "id": "kh1eMtvpf6F-", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "### 7) Изучить и загрузить тестовую выборку Cardio.txt." | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "vJvW1mOtpgFO" | ||||
|       }, | ||||
|       "id": "vJvW1mOtpgFO" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "#загрузка тестовой выборки\n", | ||||
|         "test = np.loadtxt('data/cardio_test.txt', dtype=float)\n", | ||||
|         "print('\\n test:\\n', test)\n", | ||||
|         "print('test.shape:', np.shape(test))" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "GrXQ5YymtD2u" | ||||
|       }, | ||||
|       "id": "GrXQ5YymtD2u", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "### 8) Подать тестовую выборку на вход обученного автокодировщика для обнаружения аномалий. Вывести график ошибки реконструкции элементов тестовой выборки относительно порога." | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "6iqO4Yxbpgob" | ||||
|       }, | ||||
|       "id": "6iqO4Yxbpgob" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# тестирование АE3\n", | ||||
|         "predicted_labels3_v1, ire3_v1 = lib.predict_ae(ae3_v1_trained, test, IREth3_v1)" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "Vxj1fTAikDuU" | ||||
|       }, | ||||
|       "id": "Vxj1fTAikDuU", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# Построение графика ошибки реконструкции\n", | ||||
|         "lib.ire_plot('test', ire3_v1, IREth3_v1, 'AE3_v1')" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "21DdnIKYtmtM" | ||||
|       }, | ||||
|       "id": "21DdnIKYtmtM", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# тестирование АE3\n", | ||||
|         "predicted_labels3_v2, ire3_v2 = lib.predict_ae(ae3_v2_trained, test, IREth3_v2)" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "Ql1JMAM6sf7Z" | ||||
|       }, | ||||
|       "id": "Ql1JMAM6sf7Z", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# Построение графика ошибки реконструкции\n", | ||||
|         "lib.ire_plot('test', ire3_v2, IREth3_v2, 'AE3_v2')" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "jczBRWjTt35R" | ||||
|       }, | ||||
|       "id": "jczBRWjTt35R", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# тестирование АE2\n", | ||||
|         "lib.anomaly_detection_ae(predicted_labels3_v1, IRE3_v1, IREth3_v1)" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "2kF1XknIpg48" | ||||
|       }, | ||||
|       "id": "2kF1XknIpg48", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "Для AE3_v1 точность составляет 88%" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "LXHt7-gxuJIy" | ||||
|       }, | ||||
|       "id": "LXHt7-gxuJIy" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "code", | ||||
|       "source": [ | ||||
|         "# тестирование АE2\n", | ||||
|         "lib.anomaly_detection_ae(predicted_labels3_v2, IRE3_v2, IREth3_v2)" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "5ow1D88nsrir" | ||||
|       }, | ||||
|       "id": "5ow1D88nsrir", | ||||
|       "execution_count": null, | ||||
|       "outputs": [] | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "Для AE3_v2 точность составляет 92%" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "LDsC5WyeuRHS" | ||||
|       }, | ||||
|       "id": "LDsC5WyeuRHS" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "### 9) Если результаты обнаружения аномалий не удовлетворительные (обнаружено менее 70% аномалий), то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (9)." | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "fPPbYwnQpqS3" | ||||
|       }, | ||||
|       "id": "fPPbYwnQpqS3" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "Результаты обнаружения аномалий удовлетворены." | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "IVmw2aeduXml" | ||||
|       }, | ||||
|       "id": "IVmw2aeduXml" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "### 10) Параметры наилучшего автокодировщика и результаты обнаружения аномалий занести в таблицу:\n", | ||||
|         "Табл. 2 Результаты задания №2" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "u3cAX_IgpvWU" | ||||
|       }, | ||||
|       "id": "u3cAX_IgpvWU" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "| Dataset name | Количество<br>скрытых слоев | Количество<br>нейронов в скрытых слоях | Количество<br>эпох обучения | Ошибка<br>MSE_stop | Порог ошибки<br>реконструкции | % обнаруженных<br>аномалий |\n", | ||||
|         "|:-------------|:-----------------------------|:----------------------------------------|:-----------------------------|:-------------------|:-------------------------------|:---------------------------|\n", | ||||
|         "| Cardio       | 11                             | 48, 36, 28, 22, 16, 10, 16, 22, 28, 36, 48              | 100000                      | 0.0098              | 1.6                           | 92%                      |\n" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "tryfJdjTvgU8" | ||||
|       }, | ||||
|       "id": "tryfJdjTvgU8" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "### 11) Сделать выводы о требованиях к:\n", | ||||
|         "- данным для обучения,\n", | ||||
|         "- архитектуре автокодировщика,  \n", | ||||
|         "- количеству эпох обучения,\n", | ||||
|         "- ошибке MSE_stop, приемлемой для останова обучения,\n", | ||||
|         "- ошибке реконструкции обучающей выборки (порогу обнаружения\n", | ||||
|         "аномалий)\n", | ||||
|         "\n", | ||||
|         "для качественного обнаружения аномалий в случае, когда размерность\n", | ||||
|         "пространства признаков высока." | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "eE7IYyGJp0Vv" | ||||
|       }, | ||||
|       "id": "eE7IYyGJp0Vv" | ||||
|     }, | ||||
|     { | ||||
|       "cell_type": "markdown", | ||||
|       "source": [ | ||||
|         "1) Данные для обучения должны быть без аномалий, чтобы автокодировщик смог рассчитать верное пороговое значение\n", | ||||
|         "2) Архитектура автокодировщика должна постепенно сужатся к бутылочному горлышку,а затем постепенно возвращатся к исходным выходным размерам, кол-во скрытых слоев 7-11.\n", | ||||
|         "3) В рамках данного набора данных оптимальное кол-во эпох 100000 с patience 4000 эпох\n", | ||||
|         "4) Оптимальная ошибка MSE-stop в районе 0.001, желательно не меньше для предотвращения переобучения\n", | ||||
|         "5) Значение порога не больше 1.6" | ||||
|       ], | ||||
|       "metadata": { | ||||
|         "id": "67p7AeSWwVXE" | ||||
|       }, | ||||
|       "id": "67p7AeSWwVXE" | ||||
|     } | ||||
|   ], | ||||
|   "metadata": { | ||||
|     "colab": { | ||||
|       "provenance": [] | ||||
|     }, | ||||
|     "kernelspec": { | ||||
|       "display_name": "Python 3", | ||||
|       "name": "python3" | ||||
|     }, | ||||
|     "language_info": { | ||||
|       "codemirror_mode": { | ||||
|         "name": "ipython", | ||||
|         "version": 3 | ||||
|       }, | ||||
|       "file_extension": ".py", | ||||
|       "mimetype": "text/x-python", | ||||
|       "name": "python", | ||||
|       "nbconvert_exporter": "python", | ||||
|       "pygments_lexer": "ipython3", | ||||
|       "version": "3.12.3" | ||||
|     } | ||||
|   }, | ||||
|   "nbformat": 4, | ||||
|   "nbformat_minor": 5 | ||||
| } | ||||
| @ -0,0 +1 @@ | ||||
| 5.95 | ||||
| @ -0,0 +1 @@ | ||||
| 0.45 | ||||
| После Ширина: | Высота: | Размер: 52 KiB | 
| После Ширина: | Высота: | Размер: 100 KiB | 
| После Ширина: | Высота: | Размер: 44 KiB | 
| @ -0,0 +1,417 @@ | ||||
| # Отчёт по лабораторной работе №2 | ||||
| 
 | ||||
| **Кнзев Станислав, Жихарев Данила — А-02-22** | ||||
| 
 | ||||
| --- | ||||
| ## Задание 1 | ||||
| 
 | ||||
| ### 1) В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули. | ||||
| 
 | ||||
| ```python | ||||
| # импорт модулей | ||||
| import os | ||||
| os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab2') | ||||
| 
 | ||||
| import numpy as np | ||||
| import lab02_lib as lib | ||||
| ``` | ||||
| 
 | ||||
| ### 2) Сгенерировали индивидуальный набор двумерных данных в пространстве признаков с координатами центра (6, 6), где 6 – номер бригады. Вывели полученные данные на рисунок и в консоль. | ||||
| 
 | ||||
| ```python | ||||
| # генерация датасета | ||||
| data = lib.datagen(6, 6, 1000, 2) | ||||
| 
 | ||||
| # вывод данных и размерности | ||||
| print('Исходные данные:') | ||||
| print(data) | ||||
| print('Размерность данных:') | ||||
| print(data.shape) | ||||
| ``` | ||||
|  | ||||
| ``` | ||||
| Исходные данные: | ||||
| [[5.8619435  5.99297106] | ||||
|  [6.12066008 5.98527609] | ||||
|  [5.98643623 5.9813867 ] | ||||
|  ... | ||||
|  [5.80640873 6.16429542] | ||||
|  [6.01437944 6.13645626] | ||||
|  [6.00333385 5.99329265]] | ||||
| Размерность данных: | ||||
| (1000, 2) | ||||
| ``` | ||||
| 
 | ||||
| ### 3) Создали и обучили автокодировщик AE1 простой архитектуры, выбрав небольшое количество эпох обучения. Зафиксировали в таблице вида табл.1 количество скрытых слоёв и нейронов в них | ||||
| 
 | ||||
| ```python | ||||
| # обучение AE1 | ||||
| patience = 300 | ||||
| ae1_trained, IRE1, IREth1 = lib.create_fit_save_ae(data,'out/AE1.h5','out/AE1_ire_th.txt', | ||||
| 1000, True, patience) | ||||
| ``` | ||||
| 
 | ||||
| ### 4) Зафиксировали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксировали порог ошибки реконструкции – порог обнаружения аномалий. | ||||
| 
 | ||||
| Ошибка MSE_AE1 = 19.5568 | ||||
| 
 | ||||
| ```python | ||||
| # Построение графика ошибки реконструкции | ||||
| lib.ire_plot('training', IRE1, IREth1, 'AE1') | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ### 5) Создали и обучили второй автокодировщик AE2 с усложненной архитектурой, задав большее количество эпох обучения | ||||
| 
 | ||||
| ```python | ||||
| # обучение AE2 | ||||
| ae2_trained, IRE2, IREth2 = lib.create_fit_save_ae(data,'out/AE2.h5','out/AE2_ire_th.txt', | ||||
| 3000, True, patience) | ||||
| ``` | ||||
| 
 | ||||
| ### 6) Зафиксировали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксировали второй порог ошибки реконструкции – порог обнаружения аномалий. | ||||
| 
 | ||||
| Ошибка MSE_AE2 = 0.0108 | ||||
| 
 | ||||
| ```python | ||||
| # Построение графика ошибки реконструкции | ||||
| lib.ire_plot('training', IRE2, IREth2, 'AE2') | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ### 7) Рассчитали характеристики качества обучения EDCA для AE1 и AE2. Визуализировали и сравнили области пространства признаков, распознаваемые автокодировщиками AE1 и AE2. Сделали вывод о пригодности AE1 и AE2 для качественного обнаружения аномалий. | ||||
| 
 | ||||
| ```python | ||||
| # построение областей покрытия и границ классов | ||||
| # расчет характеристик качества обучения | ||||
| numb_square = 20 | ||||
| xx, yy, Z1 = lib.square_calc(numb_square, data, ae1_trained, IREth1, '1', True) | ||||
| ``` | ||||
|  | ||||
| ``` | ||||
| amount:  21 | ||||
| amount_ae:  287 | ||||
| ``` | ||||
|  | ||||
|  | ||||
| 
 | ||||
| ``` | ||||
| Оценка качества AE1 | ||||
| IDEAL = 0. Excess:  12.666666666666666 | ||||
| IDEAL = 0. Deficit:  0.0 | ||||
| IDEAL = 1. Coating:  1.0 | ||||
| summa:  1.0 | ||||
| IDEAL = 1. Extrapolation precision (Approx):  0.07317073170731707 | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ```python | ||||
| # построение областей покрытия и границ классов | ||||
| # расчет характеристик качества обучения | ||||
| numb_square = 20 | ||||
| xx, yy, Z2 = lib.square_calc(numb_square, data, ae2_trained, IREth2, '2', True) | ||||
| ``` | ||||
|  | ||||
| ``` | ||||
| amount:  21 | ||||
| amount_ae:  28 | ||||
| ``` | ||||
|  | ||||
|  | ||||
| 
 | ||||
| ``` | ||||
| Оценка качества AE2 | ||||
| IDEAL = 0. Excess:  0.3333333333333333 | ||||
| IDEAL = 0. Deficit:  0.0 | ||||
| IDEAL = 1. Coating:  1.0 | ||||
| summa:  1.0 | ||||
| IDEAL = 1. Extrapolation precision (Approx):  0.75 | ||||
| ``` | ||||
| 
 | ||||
| ```python | ||||
| # сравнение характеристик качества обучения и областей аппроксимации | ||||
| lib.plot2in1(data, xx, yy, Z1, Z2) | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ### 8) Если автокодировщик AE2 недостаточно точно аппроксимирует область обучающих данных, то подобрать подходящие параметры автокодировщика и повторить шаги (6) – (8). | ||||
| 
 | ||||
| Полученные показатели EDCA для автокодировщика AE2 нас устраивают. | ||||
| 
 | ||||
| ### 9) Изучили сохраненный набор данных и пространство признаков. Создали тестовую выборку, состоящую, как минимум, из 4ёх элементов, не входящих в обучающую выборку. Элементы должны быть такими, чтобы AE1 распознавал их как норму, а AE2 детектировал как аномалии. | ||||
| 
 | ||||
| ```python | ||||
| # загрузка тестового набора | ||||
| data_test = np.loadtxt('data_test.txt', dtype=float) | ||||
| print(data_test) | ||||
| ``` | ||||
| ``` | ||||
| [[4.52855237 4.55922899] | ||||
|  [4.64838873 4.69473527] | ||||
|  [4.41414674 4.47819019] | ||||
|  [4.43922161 4.43454531]] | ||||
| ``` | ||||
| 
 | ||||
| ### 10) Применили обученные автокодировщики AE1 и AE2 к тестовым данным и вывели значения ошибки реконструкции для каждого элемента тестовой выборки относительно порога на график и в консоль. | ||||
| 
 | ||||
| ```python | ||||
| # тестирование АE1 | ||||
| predicted_labels1, ire1 = lib.predict_ae(ae1_trained, data_test, IREth1) | ||||
| ``` | ||||
| 
 | ||||
| ```python | ||||
| # тестирование АE1 | ||||
| lib.anomaly_detection_ae(predicted_labels1, ire1, IREth1) | ||||
| lib.ire_plot('test', ire1, IREth1, 'AE1') | ||||
| ``` | ||||
| ``` | ||||
| Аномалий не обнаружено | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # тестирование АE2 | ||||
| predicted_labels2, ire2 = lib.predict_ae(ae2_trained, data_test, IREth2) | ||||
| ``` | ||||
| 
 | ||||
| ```python | ||||
| # тестирование АE2 | ||||
| lib.anomaly_detection_ae(predicted_labels2, ire2, IREth2) | ||||
| lib.ire_plot('test', ire2, IREth2, 'AE2') | ||||
| ``` | ||||
| ``` | ||||
| i         Labels    IRE       IREth      | ||||
| 0         [1.]      [2.02]    0.4        | ||||
| 1         [1.]      [1.84]    0.4        | ||||
| 2         [1.]      [2.16]    0.4        | ||||
| 3         [1.]      [2.17]    0.4        | ||||
| Обнаружено  4.0  аномалий | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ### 11) Визуализировали элементы обучающей и тестовой выборки в областях пространства признаков, распознаваемых автокодировщиками AE1 и AE2. | ||||
| 
 | ||||
| ```python | ||||
| # построение областей аппроксимации и точек тестового набора | ||||
| lib.plot2in1_anomaly(data, xx, yy, Z1, Z2, data_test) | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ### 12) Результаты исследования занесли в таблицу: | ||||
| Табл. 1 Результаты задания №1 | ||||
| 
 | ||||
| |      | Количество<br>скрытых слоев | Количество<br>нейронов в скрытых слоях | Количество<br>эпох обучения | Ошибка<br>MSE_stop | Порог ошибки<br>реконструкции | Значение показателя<br>Excess | Значение показателя<br>Approx | Количество обнаруженных<br>аномалий | | ||||
| |-----:|------------------------------|----------------------------------------|-----------------------------|--------------------|-------------------------------|-------------------------------|--------------------------------|-------------------------------------| | ||||
| | AE1  | 1                            | 1                            | 1000                        | 19.5568             | 6.53                         | 12.67                          | 0.073                           | 0                                   | | ||||
| | AE2  | 5                            | 3,2,1,2,3                                | 3000                          | 0.0108             | 0.4                         | 0.33                          | 0.750                           | 4                                   | | ||||
| 
 | ||||
| ### 13) Сделали выводы о требованиях к: | ||||
| - данным для обучения, | ||||
| - архитектуре автокодировщика, | ||||
| - количеству эпох обучения, | ||||
| - ошибке MSE_stop, приемлемой для останова обучения, | ||||
| - ошибке реконструкции обучающей выборки (порогу обнаружения | ||||
| аномалий), | ||||
| - характеристикам качества обучения EDCA одноклассового | ||||
| классификатора | ||||
| 
 | ||||
| для качественного обнаружения аномалий в данных. | ||||
| 
 | ||||
| 1) Данные для обучения должны быть без аномалий, чтобы автокодировщик смог рассчитать верное пороговое значение | ||||
| 2) Архитектура автокодировщика должна постепенно сужатся к бутылочному горлышку,а затем постепенно возвращатся к исходным выходным размерам, кол-во скрытых слоев 3-5 | ||||
| 3) В рамках данного набора данных оптимальное кол-во эпох 3000 с patience 300 эпох | ||||
| 4) Оптимальная ошибка MSE-stop в районе 0.01, желательно не меньше для предотвращения переобучения | ||||
| 5) Значение порога в районе 0.4 | ||||
| 6) Значение Excess не больше 0.5, значение Deficit равное 0, значение Coating равное 1, значение Approx не меньше 0.7 | ||||
| 
 | ||||
| ## Задание 2 | ||||
| 
 | ||||
| ### 1) Изучить описание своего набора реальных данных, что он из себя представляет | ||||
| 
 | ||||
| Бригада 6 => набор данных Cardio. Это реальный набор данных, который состоит из измерений частоты сердечных сокращений плода и | ||||
| сокращений матки на кардиотокограммах, классифицированных экспертами | ||||
| акушерами. Исходный набор данных предназначен для классификации. В нем | ||||
| представлено 3 класса: «норма», «подозрение» и «патология». Для обнаружения | ||||
| аномалий класс «норма» принимается за норму, класс «патология» принимается за | ||||
| аномалии, а класс «подозрение» был отброшен. | ||||
| 
 | ||||
| | Количество<br>признаков | Количество<br>примеров | Количество<br>нормальных примеров | Количество<br>аномальных примеров | | ||||
| |-------------------------:|-----------------------:|----------------------------------:|-----------------------------------:| | ||||
| | 21                       | 1764                   | 1655                               | 109                                | | ||||
| 
 | ||||
| ### 2) Загрузить многомерную обучающую выборку реальных данных Cardio.txt. | ||||
| 
 | ||||
| ```python | ||||
| # загрузка обчуающей выборки | ||||
| train = np.loadtxt('data/cardio_train.txt', dtype=float) | ||||
| ``` | ||||
| 
 | ||||
| ### 3) Вывести полученные данные и их размерность в консоли. | ||||
| 
 | ||||
| ```python | ||||
| print('train:\n', train) | ||||
| print('train.shape:', np.shape(train)) | ||||
| ``` | ||||
| ``` | ||||
| train: | ||||
|  [[ 0.00491231  0.69319077 -0.20364049 ...  0.23149795 -0.28978574 | ||||
|   -0.49329397] | ||||
|  [ 0.11072935 -0.07990259 -0.20364049 ...  0.09356344 -0.25638541 | ||||
|   -0.49329397] | ||||
|  [ 0.21654639 -0.27244466 -0.20364049 ...  0.02459619 -0.25638541 | ||||
|    1.1400175 ] | ||||
|  ... | ||||
|  [ 0.85144861 -0.91998844 -0.20364049 ...  0.57633422 -0.65718941 | ||||
|    1.1400175 ] | ||||
|  [ 0.85144861 -0.91998844 -0.20364049 ...  0.57633422 -0.62378908 | ||||
|   -0.49329397] | ||||
|  [ 1.0630827  -0.51148142 -0.16958144 ...  0.57633422 -0.65718941 | ||||
|   -0.49329397]] | ||||
| train.shape: (1654, 21) | ||||
| ``` | ||||
| ### 4) Создать и обучить автокодировщик с подходящей для данных архитектурой. Выбрать необходимое количество эпох обучения. | ||||
| 
 | ||||
| ```python | ||||
| # **kwargs | ||||
| # verbose_every_n_epochs - отображать прогресс каждые N эпох (по умолчанию - 1000) | ||||
| # early_stopping_delta - дельта для ранней остановки (по умолчанию - 0.01) | ||||
| # early_stopping_value = значение для ранней остановки (по умолчанию -  0.0001) | ||||
| 
 | ||||
| from time import time | ||||
| 
 | ||||
| patience = 4000 | ||||
| start = time() | ||||
| ae3_v1_trained, IRE3_v1, IREth3_v1 = lib.create_fit_save_ae(train,'out/AE3_V1.h5','out/AE3_v1_ire_th.txt', | ||||
| 100000, False, patience, early_stopping_delta = 0.001) | ||||
| print("Время на обучение: ", time() - start) | ||||
| ``` | ||||
| 
 | ||||
| ### 5) Зафиксировать ошибку MSE, на которой обучение завершилось. Построить график ошибки реконструкции обучающей выборки. Зафиксировать порог ошибки реконструкции – порог обнаружения аномалий. | ||||
| 
 | ||||
| Скрытых слоев 7, нейроны: 46->26->14->10->14->26->48 | ||||
| 
 | ||||
| Ошибка MSE_AE3_v1 = 0.0126 | ||||
| 
 | ||||
| ```python | ||||
| # Построение графика ошибки реконструкции | ||||
| lib.ire_plot('training', IRE3_v1, IREth3_v1, 'AE3_v1') | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ### 6) Сделать вывод о пригодности обученного автокодировщика для качественного обнаружения аномалий. Если порог ошибки реконструкции слишком велик, то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (6). | ||||
| 
 | ||||
| ```python | ||||
| # **kwargs | ||||
| # verbose_every_n_epochs - отображать прогресс каждые N эпох (по умолчанию - 1000) | ||||
| # early_stopping_delta - дельта для ранней остановки (по умолчанию - 0.01) | ||||
| # early_stopping_value = значение для ранней остановки (по умолчанию -  0.0001) | ||||
| 
 | ||||
| from time import time | ||||
| 
 | ||||
| patience = 4000 | ||||
| start = time() | ||||
| ae3_v2_trained, IRE3_v2, IREth3_v2 = lib.create_fit_save_ae(train,'out/AE3_V2.h5','out/AE3_v2_ire_th.txt', | ||||
| 100000, False, patience, early_stopping_delta = 0.001) | ||||
| print("Время на обучение: ", time() - start) | ||||
| ``` | ||||
| 
 | ||||
| Скрытых слоев 7, нейроны: 48->36->28->22->16->12->16->22->28->36->48 | ||||
| 
 | ||||
| Ошибка MSE_AE3_v1 = 0.0098 | ||||
| 
 | ||||
| ```python | ||||
| # Построение графика ошибки реконструкции | ||||
| lib.ire_plot('training', IRE3_v2, IREth3_v2, 'AE3_v2') | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ### 7) Изучить и загрузить тестовую выборку Cardio.txt. | ||||
| 
 | ||||
| ```python | ||||
| #загрузка тестовой выборки | ||||
| test = np.loadtxt('data/cardio_test.txt', dtype=float) | ||||
| print('\n test:\n', test) | ||||
| print('test.shape:', np.shape(test)) | ||||
| ``` | ||||
| ``` | ||||
|  test: | ||||
|  [[ 0.21654639 -0.65465178 -0.20364049 ... -2.0444214   4.987467 | ||||
|   -0.49329397] | ||||
|  [ 0.21654639 -0.5653379  -0.20364049 ... -2.1133887   6.490482 | ||||
|   -0.49329397] | ||||
|  [-0.3125388  -0.91998844  6.9653692  ... -1.1478471   3.9186563 | ||||
|   -0.49329397] | ||||
|  ... | ||||
|  [-0.41835583 -0.91998844 -0.16463485 ... -1.4926834   0.24461959 | ||||
|   -0.49329397] | ||||
|  [-0.41835583 -0.91998844 -0.15093411 ... -1.4237162   0.14441859 | ||||
|   -0.49329397] | ||||
|  [-0.41835583 -0.91998844 -0.20364049 ... -1.2857816   3.5846529 | ||||
|   -0.49329397]] | ||||
| test.shape: (109, 21) | ||||
| ``` | ||||
| ### 8) Подать тестовую выборку на вход обученного автокодировщика для обнаружения аномалий. Вывести график ошибки реконструкции элементов тестовой выборки относительно порога. | ||||
| 
 | ||||
| ```python | ||||
| # тестирование АE3 | ||||
| predicted_labels3_v1, ire3_v1 = lib.predict_ae(ae3_v1_trained, test, IREth3_v1) | ||||
| ``` | ||||
| 
 | ||||
| ```python | ||||
| # Построение графика ошибки реконструкции | ||||
| lib.ire_plot('test', ire3_v1, IREth3_v1, 'AE3_v1') | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # тестирование АE3 | ||||
| predicted_labels3_v2, ire3_v2 = lib.predict_ae(ae3_v2_trained, test, IREth3_v2) | ||||
| ``` | ||||
| 
 | ||||
| ```python | ||||
| # Построение графика ошибки реконструкции | ||||
| lib.ire_plot('test', ire3_v2, IREth3_v2, 'AE3_v2') | ||||
| ``` | ||||
|  | ||||
| 
 | ||||
| ```python | ||||
| # тестирование АE2 | ||||
| lib.anomaly_detection_ae(predicted_labels3_v1, IRE3_v1, IREth3_v1) | ||||
| ``` | ||||
| 
 | ||||
| Для AE3_v1 точность составляет 88% | ||||
| 
 | ||||
| ```python | ||||
| # тестирование АE2 | ||||
| lib.anomaly_detection_ae(predicted_labels3_v2, IRE3_v2, IREth3_v2) | ||||
| ``` | ||||
| 
 | ||||
| Для AE3_v2 точность составляет 92% | ||||
| 
 | ||||
| ### 9) Если результаты обнаружения аномалий не удовлетворительные (обнаружено менее 70% аномалий), то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (9). | ||||
| 
 | ||||
| Результаты обнаружения аномалий удовлетворены. | ||||
| 
 | ||||
| ### 10) Параметры наилучшего автокодировщика и результаты обнаружения аномалий занести в таблицу: | ||||
| Табл. 2 Результаты задания №2 | ||||
| 
 | ||||
| | Dataset name | Количество<br>скрытых слоев | Количество<br>нейронов в скрытых слоях | Количество<br>эпох обучения | Ошибка<br>MSE_stop | Порог ошибки<br>реконструкции | % обнаруженных<br>аномалий | | ||||
| |:-------------|:-----------------------------|:----------------------------------------|:-----------------------------|:-------------------|:-------------------------------|:---------------------------| | ||||
| | Cardio       | 11                             | 48, 36, 28, 22, 16, 10, 16, 22, 28, 36, 48              | 100000                      | 0.0098              | 1.6                           | 92%                      | | ||||
| 
 | ||||
| ### 11) Сделать выводы о требованиях к: | ||||
| - данным для обучения, | ||||
| - архитектуре автокодировщика,   | ||||
| - количеству эпох обучения, | ||||
| - ошибке MSE_stop, приемлемой для останова обучения, | ||||
| - ошибке реконструкции обучающей выборки (порогу обнаружения | ||||
| аномалий) | ||||
| 
 | ||||
| для качественного обнаружения аномалий в случае, когда размерность | ||||
| пространства признаков высока. | ||||
| 
 | ||||
| 1) Данные для обучения должны быть без аномалий, чтобы автокодировщик смог рассчитать верное пороговое значение | ||||
| 2) Архитектура автокодировщика должна постепенно сужатся к бутылочному горлышку,а затем постепенно возвращатся к исходным выходным размерам, кол-во скрытых слоев 7-11. | ||||
| 3) В рамках данного набора данных оптимальное кол-во эпох 100000 с patience 4000 эпох | ||||
| 4) Оптимальная ошибка MSE-stop в районе 0.001, желательно не меньше для предотвращения переобучения | ||||
| 5) Значение порога не больше 1.6 | ||||