# Отчёт по лабораторной работе №2 **Кобзев Александр, Кирсанов Егор — А-01-22** ## 1.1. В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули. ```python from google.colab import drive drive.mount('/content/drive') import os os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab2') ``` ``` !wget -N http://uit.mpei.ru/git/main/is_dnn/raw/branch/main/labworks/LW2/lab02_lib.py !wget -N http://uit.mpei.ru/git/main/is_dnn/raw/branch/main/labworks/LW2/data/letter_train.txt !wget -N http://uit.mpei.ru/git/main/is_dnn/raw/branch/main/labworks/LW2/data/letter_test.txt ``` ``` python # импорт модулей import numpy as np import lab02_lib as lib ``` --- ## 1.2. Сгенерировали индивидуальный набор двумерных данных в пространстве признаков с координатами центра (k, k), где k=10 – номер бригады. Вывели полученные данные на рисунок и в консоль: ```python k = 10 data = lib.datagen(k, k, 1000, 2) print('Размерность данных:', data.shape) print('Пример данных:', data) ```  ``` Размерность данных: (1000, 2) Пример данных: [[ 9.91598657 9.75579359] [ 9.97948747 9.98708802] [ 9.99042489 10.01396366] ... [ 9.97013826 9.93047258] [10.00891654 9.94318369] [10.04614761 9.91592173]] ``` --- ## 1.3. Создали и обучили автокодировщик AE1 простой архитектуры, выбрав небольшое количество эпох обучения. ```python patience = 300 ae1_trained, IRE1, IREth1 = lib.create_fit_save_ae( data, 'out/AE1.h5', 'out/AE1_ire_th.txt', 1000, False, patience, verbose_every_n_epochs = 100, early_stopping_delta = 0.001 ) ``` --- ## 1.4. Зафиксировали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксировали порог ошибки реконструкции – порог обнаружения аномалий. MSE = 56.8932 ```python lib.ire_plot('training', IRE1, IREth1, 'AE1') print('AE1 IREth =', IREth1) ```  ``` Порог ошибки реконструкции: AE1 IREth = 10.98 ``` --- ## 1.5. Создали и обучили второй автокодировщик AE2 с усложненной архитектурой, задав большее количество эпох обучения. ```python ae2_trained, IRE2, IREth2 = lib.create_fit_save_ae( data, 'out/AE2.h5', 'out/AE2_ire_th.txt', 3000, False, patience, verbose_every_n_epochs = 500, early_stopping_delta = 0.001 ) ``` --- ## 1.6. Зафиксировали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксировали порог ошибки реконструкции – порог обнаружения аномалий. MSE = 0.0225 ```python lib.ire_plot('training', IRE2, IREth2, 'AE2') print('AE2 IREth =', IREth2) ```  ``` Порог ошибки реконструкции: AE2 IREth = 0.55 ``` --- ## 1.7. Рассчитали характеристики качества обучения EDCA для AE1 и AE2. Визуализировали и сравнить области пространства признаков, распознаваемые автокодировщиками AE1 и AE2. Сделать вывод о пригодности AE1 и AE2 для качественного обнаружения аномалий. ```python # AE1 numb_square = 20 xx, yy, Z1 = lib.square_calc(numb_square, data, ae1_trained, IREth1, '1', True) ```  ``` amount: 18 amount_ae: 293 ```   ``` Оценка качества AE1 IDEAL = 0. Excess: 15.277777777777779 IDEAL = 0. Deficit: 0.0 IDEAL = 1. Coating: 1.0 summa: 1.0 IDEAL = 1. Extrapolation precision (Approx): 0.06143344709897611 ``` ```python # AE2 numb_square = 20 xx, yy, Z2 = lib.square_calc(numb_square, data, ae2_trained, IREth2, '2', True) ```  ``` amount: 18 amount_ae: 50 ```   ``` Оценка качества AE2 IDEAL = 0. Excess: 1.7777777777777777 IDEAL = 0. Deficit: 0.0 IDEAL = 1. Coating: 1.0 summa: 1.0 IDEAL = 1. Extrapolation precision (Approx): 0.36 ``` ```python # Сравнение lib.plot2in1(data, xx, yy, Z1, Z2) ```  --- ## 1.8. Если автокодировщик AE2 недостаточно точно аппроксимирует область обучающих данных, то подобрать подходящие параметры автокодировщика и повторить шаги (6) – (8). Немного изменили параметры автокодировщика AE2 для более качесвенной аппроксимации(использовались выше) --- ## 1.9. Изучили сохраненный набор данных и пространство признаков. Создали тестовую выборку, состоящую, как минимум, из 4ёх элементов, не входящих в обучающую выборку. Элементы должны быть такими, чтобы AE1 распознавал их как норму, а AE2 детектировал как аномалии. ```python with open('data_test.txt', 'w') as file: file.write("10.5 9.5\n") file.write("9.0 10.2\n") file.write("9.6 10.5\n") file.write("9.0 9.0\n") data_test = np.loadtxt('data_test.txt', dtype=float) print(data_test) ``` ``` [[10.5 9.5] [ 9. 10.2] [ 9.6 10.5] [ 9. 9. ]] ``` --- ## 1.10. Применили обученные автокодировщики AE1 и AE2 к тестовым данным и вывели значения ошибки реконструкции для каждого элемента тестовой выборки относительно порога на график и в консоль. ```python # AE1 predicted_labels1, ire1 = lib.predict_ae(ae1_trained, data_test, IREth1) lib.anomaly_detection_ae(predicted_labels1, ire1, IREth1) lib.ire_plot('test', ire1, IREth1, 'AE1') ``` ``` Аномалий не обнаружено ```  ```python # AE2 predicted_labels2, ire2 = lib.predict_ae(ae2_trained, data_test, IREth2) lib.anomaly_detection_ae(predicted_labels2, ire2, IREth2) lib.ire_plot('test', ire2, IREth2, 'AE2') ``` ``` i Labels IRE IREth 0 [1.] [0.62] 0.55 1 [1.] [1.05] 0.55 2 [1.] [0.77] 0.55 3 [1.] [1.29] 0.55 Обнаружено 4.0 аномалий ```  --- ## 1.11. Визуализирывали элементы обучающей и тестовой выборки в областях пространства признаков, распознаваемых автокодировщиками AE1 и AE2. ```python lib.plot2in1_anomaly(data, xx, yy, Z1, Z2, data_test) ```  --- ## 1.12. Результаты исследования занесли в таблицу:
| Количество скрытых слоёв | Количество нейронов в скрытых слоях | Количество эпох обучения | Ошибка MSE_stop | Порог ошибки реконструкции | Значение показателя Excess | Значение показателя Approx | Количество обнаруженных аномалий | |
|---|---|---|---|---|---|---|---|---|
| АЕ1 | 1 | 1 | 1000 | 56.89 | 10.98 | 15.28 | 0.06 | 0 |
| АЕ2 | 5 | 5 3 2 3 5 | 3000 | 0.02 | 0.55 | 1.78 | 0.36 | 4 |