Сравнить коммиты
46 Коммитов
| Автор | SHA1 | Дата | |
|---|---|---|---|
| 2126cdee3d | |||
| e39534cedc | |||
| e5677dfd4d | |||
| 19a5e31b3f | |||
| b7609ca466 | |||
| 744edaabd3 | |||
| e28caaea5a | |||
| 2ac947aa48 | |||
| bfb0d82206 | |||
| 86c2acdcf1 | |||
| c6fad2a4fc | |||
| f1c004f112 | |||
| 062e5ba75e | |||
| d50d70147c | |||
| 00191503bf | |||
| 342ded1968 | |||
| ec9b8102cf | |||
| f9502a93b5 | |||
| 80e8d87a2d | |||
| 80552ec6d3 | |||
| ca38d87736 | |||
| 32e6243ca0 | |||
| e6745a70e2 | |||
| 0f4e54f73a | |||
| 47807cf45c | |||
| f630c61689 | |||
| bd58635ec5 | |||
| 93db390f81 | |||
| a1ab93ff7b | |||
| 9cf8021299 | |||
| 060155b306 | |||
| 6a04cbb61a | |||
| d9826f18e9 | |||
| 2dafceed94 | |||
| e0891867fe | |||
| 215fdc0b2c | |||
| 0e010e7ca9 | |||
| d13e54618a | |||
| a775fbea69 | |||
| af64627e8a | |||
| 4d2b1da469 | |||
| 8f7d654239 | |||
| 2f6055e408 | |||
| ea59417e6d | |||
| 9134bcdef6 | |||
| 5f69b6b929 |
Двоичные данные
labworks/LW2/data/1.png
Обычный файл
|
После Ширина: | Высота: | Размер: 41 KiB |
Двоичные данные
labworks/LW2/data/10.png
Обычный файл
|
После Ширина: | Высота: | Размер: 20 KiB |
Двоичные данные
labworks/LW2/data/11.png
Обычный файл
|
После Ширина: | Высота: | Размер: 48 KiB |
Двоичные данные
labworks/LW2/data/12.png
Обычный файл
|
После Ширина: | Высота: | Размер: 49 KiB |
Двоичные данные
labworks/LW2/data/13.png
Обычный файл
|
После Ширина: | Высота: | Размер: 22 KiB |
Двоичные данные
labworks/LW2/data/14.png
Обычный файл
|
После Ширина: | Высота: | Размер: 89 KiB |
Двоичные данные
labworks/LW2/data/15.png
Обычный файл
|
После Ширина: | Высота: | Размер: 77 KiB |
Двоичные данные
labworks/LW2/data/16.png
Обычный файл
|
После Ширина: | Высота: | Размер: 90 KiB |
Двоичные данные
labworks/LW2/data/17.png
Обычный файл
|
После Ширина: | Высота: | Размер: 66 KiB |
Двоичные данные
labworks/LW2/data/18.png
Обычный файл
|
После Ширина: | Высота: | Размер: 80 KiB |
Двоичные данные
labworks/LW2/data/19.png
Обычный файл
|
После Ширина: | Высота: | Размер: 69 KiB |
Двоичные данные
labworks/LW2/data/2.png
Обычный файл
|
После Ширина: | Высота: | Размер: 54 KiB |
Двоичные данные
labworks/LW2/data/20.png
Обычный файл
|
После Ширина: | Высота: | Размер: 85 KiB |
Двоичные данные
labworks/LW2/data/21.png
Обычный файл
|
После Ширина: | Высота: | Размер: 74 KiB |
Двоичные данные
labworks/LW2/data/3.png
Обычный файл
|
После Ширина: | Высота: | Размер: 104 KiB |
Двоичные данные
labworks/LW2/data/4.png
Обычный файл
|
После Ширина: | Высота: | Размер: 33 KiB |
Двоичные данные
labworks/LW2/data/5.png
Обычный файл
|
После Ширина: | Высота: | Размер: 87 KiB |
Двоичные данные
labworks/LW2/data/6.png
Обычный файл
|
После Ширина: | Высота: | Размер: 103 KiB |
Двоичные данные
labworks/LW2/data/7.png
Обычный файл
|
После Ширина: | Высота: | Размер: 30 KiB |
Двоичные данные
labworks/LW2/data/8.png
Обычный файл
|
После Ширина: | Высота: | Размер: 62 KiB |
Двоичные данные
labworks/LW2/data/9.png
Обычный файл
|
После Ширина: | Высота: | Размер: 75 KiB |
100
labworks/LW2/data/data_test.txt
Обычный файл
@@ -0,0 +1,100 @@
|
|||||||
|
4.856234 5.123456
|
||||||
|
5.234567 4.876543
|
||||||
|
4.765432 5.345678
|
||||||
|
5.123456 4.987654
|
||||||
|
4.987654 5.234567
|
||||||
|
5.345678 4.765432
|
||||||
|
4.876543 5.432109
|
||||||
|
5.432109 4.654321
|
||||||
|
4.654321 5.567890
|
||||||
|
5.567890 4.543210
|
||||||
|
6.856234 6.123456
|
||||||
|
7.234567 6.876543
|
||||||
|
6.765432 7.345678
|
||||||
|
7.123456 6.987654
|
||||||
|
6.987654 7.234567
|
||||||
|
7.345678 6.765432
|
||||||
|
6.876543 7.432109
|
||||||
|
7.432109 6.654321
|
||||||
|
6.654321 7.567890
|
||||||
|
7.567890 6.543210
|
||||||
|
3.156234 3.123456
|
||||||
|
2.734567 3.876543
|
||||||
|
3.265432 2.654321
|
||||||
|
2.876543 3.234567
|
||||||
|
3.423456 2.987654
|
||||||
|
2.987654 3.345678
|
||||||
|
3.576543 2.765432
|
||||||
|
2.654321 3.432109
|
||||||
|
3.687654 2.567890
|
||||||
|
2.543210 3.567890
|
||||||
|
5.123456 7.876543
|
||||||
|
4.876543 8.234567
|
||||||
|
5.234567 7.654321
|
||||||
|
4.765432 8.123456
|
||||||
|
5.345678 7.432109
|
||||||
|
4.654321 8.345678
|
||||||
|
5.432109 7.234567
|
||||||
|
4.543210 8.456789
|
||||||
|
5.567890 7.123456
|
||||||
|
4.432109 8.567890
|
||||||
|
7.856234 5.123456
|
||||||
|
8.234567 4.876543
|
||||||
|
7.765432 5.345678
|
||||||
|
8.123456 4.987654
|
||||||
|
7.987654 5.234567
|
||||||
|
8.345678 4.765432
|
||||||
|
7.876543 5.432109
|
||||||
|
8.432109 4.654321
|
||||||
|
7.654321 5.567890
|
||||||
|
8.567890 4.543210
|
||||||
|
14.856234 14.123456
|
||||||
|
15.234567 14.876543
|
||||||
|
14.765432 15.345678
|
||||||
|
15.123456 14.987654
|
||||||
|
14.987654 15.234567
|
||||||
|
15.345678 14.765432
|
||||||
|
14.876543 15.432109
|
||||||
|
15.432109 14.654321
|
||||||
|
14.654321 15.567890
|
||||||
|
15.567890 14.543210
|
||||||
|
-0.856234 -0.123456
|
||||||
|
0.234567 -0.876543
|
||||||
|
-0.765432 0.345678
|
||||||
|
0.123456 -0.987654
|
||||||
|
-0.987654 0.234567
|
||||||
|
0.345678 -0.765432
|
||||||
|
-0.876543 0.432109
|
||||||
|
0.432109 -0.654321
|
||||||
|
-0.654321 0.567890
|
||||||
|
0.567890 -0.543210
|
||||||
|
17.856234 4.123456
|
||||||
|
18.234567 4.876543
|
||||||
|
17.765432 5.345678
|
||||||
|
18.123456 4.987654
|
||||||
|
17.987654 5.234567
|
||||||
|
18.345678 4.765432
|
||||||
|
17.876543 5.432109
|
||||||
|
18.432109 4.654321
|
||||||
|
17.654321 5.567890
|
||||||
|
18.567890 4.543210
|
||||||
|
-3.123456 22.876543
|
||||||
|
2.345678 18.654321
|
||||||
|
8.765432 -1.234567
|
||||||
|
12.345678 23.456789
|
||||||
|
-4.123456 7.876543
|
||||||
|
19.234567 19.876543
|
||||||
|
-2.876543 -2.123456
|
||||||
|
22.345678 3.654321
|
||||||
|
15.432109 -3.234567
|
||||||
|
-1.543210 25.567890
|
||||||
|
0.000000 15.000000
|
||||||
|
2.500000 16.250000
|
||||||
|
5.000000 17.500000
|
||||||
|
7.500000 18.750000
|
||||||
|
10.000000 20.000000
|
||||||
|
12.500000 21.250000
|
||||||
|
15.000000 22.500000
|
||||||
|
17.500000 23.750000
|
||||||
|
20.000000 25.000000
|
||||||
|
22.500000 26.250000
|
||||||
580
labworks/LW2/lr2.ipynb
Обычный файл
@@ -0,0 +1,580 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 1,
|
||||||
|
"metadata": {
|
||||||
|
"id": "r997fIhZa7-A"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"import os"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 6,
|
||||||
|
"metadata": {
|
||||||
|
"id": "U8PYD8odcxpc"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"os.chdir('/content/drive/MyDrive/Colab Notebooks/lab2')\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/"
|
||||||
|
},
|
||||||
|
"id": "g5cp1saPc6Xa",
|
||||||
|
"outputId": "3089c8c8-d518-48f7-ac90-262398be06cf"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# скачивание библиотеки\n",
|
||||||
|
"!wget -N http://uit.mpei.ru/git/main/is_dnn/raw/branch/main/labworks/LW2/lab02_lib.py"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/"
|
||||||
|
},
|
||||||
|
"id": "pHg8jhkZc90x",
|
||||||
|
"outputId": "0b42b9c8-f640-4a2a-e90b-3954ade65113"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# скачивание выборок\n",
|
||||||
|
"!wget -N http://uit.mpei.ru/git/main/is_dnn/raw/branch/main/labworks/LW2/data/letter_train.txt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/"
|
||||||
|
},
|
||||||
|
"id": "tQhqaB8Pc7Yi",
|
||||||
|
"outputId": "74c6fac7-59f8-4ea9-e6f9-f6aad4196326"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"!wget -N http://uit.mpei.ru/git/main/is_dnn/raw/branch/main/labworks/LW2/data/letter_test.txt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 10,
|
||||||
|
"metadata": {
|
||||||
|
"id": "4DfLVzP-dv_M"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#импортмодулей\n",
|
||||||
|
"import numpy as np\n",
|
||||||
|
"import lab02_lib as lib"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 35
|
||||||
|
},
|
||||||
|
"id": "9_66PjVYd5ch",
|
||||||
|
"outputId": "e6ab839f-f62d-4fd8-cecb-cd02ccecc1cd"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"os.getcwd()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 718
|
||||||
|
},
|
||||||
|
"id": "HFbXybBWeDN0",
|
||||||
|
"outputId": "57c234a4-55c0-488d-bf1f-971fae63cbcc"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#генерациядатасета\n",
|
||||||
|
"data=lib.datagen(5,5,1000,2)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/"
|
||||||
|
},
|
||||||
|
"id": "dZzF5IKBeKh-",
|
||||||
|
"outputId": "6cf53296-1ed0-4a4c-d05c-ac659fea7184"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#вывод данных и размерности\n",
|
||||||
|
"print('Исходные данные:')\n",
|
||||||
|
"print(data)\n",
|
||||||
|
"print('Размерность данных:')\n",
|
||||||
|
"print(data.shape)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/"
|
||||||
|
},
|
||||||
|
"id": "9l-lC2gueRbY",
|
||||||
|
"outputId": "43eaaa96-90ff-457b-f7ad-4cdadb6e2b73"
|
||||||
|
},
|
||||||
|
"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', 1000, False, patience)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 744
|
||||||
|
},
|
||||||
|
"id": "e1-t84RdeyU0",
|
||||||
|
"outputId": "f14d5576-8d67-4b9e-b736-edee255d1996"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#Построение графика ошибки реконструкции\n",
|
||||||
|
"lib.ire_plot('training', IRE1, IREth1, 'AE1')\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 955
|
||||||
|
},
|
||||||
|
"id": "b94IU-MMe50Z",
|
||||||
|
"outputId": "f03f9534-2cad-4216-e157-18c7f9368671"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# обучение AE2\n",
|
||||||
|
"ae2_trained, IRE2, IREth2= lib.create_fit_save_ae(data,'out/AE2.h5','out/AE2_ire_th.txt', 3000, False, patience)\n",
|
||||||
|
"lib.ire_plot('training', IRE2, IREth2, 'AE2')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 1000
|
||||||
|
},
|
||||||
|
"id": "6PE0WU11f0r7",
|
||||||
|
"outputId": "bb22942d-629d-4d44-c742-98f9e372ab3e"
|
||||||
|
},
|
||||||
|
"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",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 1000
|
||||||
|
},
|
||||||
|
"id": "yfb90GShgYfv",
|
||||||
|
"outputId": "99ac3a35-ef93-48e2-9880-100b72bfb156"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"xx,yy,Z2=lib.square_calc(numb_square,data,ae2_trained,IREth2,'2',True)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 472
|
||||||
|
},
|
||||||
|
"id": "wYAaU-Rbgjj7",
|
||||||
|
"outputId": "1c8fedd9-85df-4f49-805c-baa3e7b0b74d"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#сравнение характеристик качества обучения и областей аппроксимации\n",
|
||||||
|
"lib.plot2in1(data,xx,yy,Z1,Z2)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 20,
|
||||||
|
"metadata": {
|
||||||
|
"id": "0oebq1QhgrZC"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#загрузка тестового набора\n",
|
||||||
|
"data_test= np.loadtxt('data_test.txt', dtype=float)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/"
|
||||||
|
},
|
||||||
|
"id": "K_PYA6l6jEJf",
|
||||||
|
"outputId": "17e032e7-c2df-4523-861e-93c29ebfd0c1"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#тестирование АE1\n",
|
||||||
|
"predicted_labels1, ire1 = lib.predict_ae(ae1_trained, data_test, IREth1)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 1000
|
||||||
|
},
|
||||||
|
"id": "aWXqWrJQjObc",
|
||||||
|
"outputId": "2cc638cd-d355-4c61-ab6d-0dc19de94af5"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#тестирование АE1\n",
|
||||||
|
"lib.anomaly_detection_ae(predicted_labels1, ire1, IREth1)\n",
|
||||||
|
"lib.ire_plot('test', ire1, IREth1, 'AE1')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/"
|
||||||
|
},
|
||||||
|
"id": "Of4-wpFDj8kn",
|
||||||
|
"outputId": "eb148cc7-50a9-4efd-be97-16753abddb90"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#тестирование АE2\n",
|
||||||
|
"predicted_labels2, ire2 = lib.predict_ae(ae2_trained, data_test, IREth2)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 1000
|
||||||
|
},
|
||||||
|
"id": "2E9N8TSKkDUZ",
|
||||||
|
"outputId": "1a5d6cd2-d237-47ec-ab17-bb0454c4d6ff"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#тестирование АE2\n",
|
||||||
|
"lib.anomaly_detection_ae(predicted_labels2, ire2, IREth2)\n",
|
||||||
|
"lib.ire_plot('test', ire2, IREth2, 'AE2')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 472
|
||||||
|
},
|
||||||
|
"id": "bdxVRsSMkQet",
|
||||||
|
"outputId": "14f3ccbb-e1b0-4911-c0ad-ad5f41c118a1"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#построение областей аппроксимации и точек тестового набора\n",
|
||||||
|
"lib.plot2in1_anomaly(data, xx, yy, Z1, Z2, data_test)\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 27,
|
||||||
|
"metadata": {
|
||||||
|
"id": "m9x03V--uEl6"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#загрузка выборок\n",
|
||||||
|
"train= np.loadtxt('letter_train.txt', dtype=float)\n",
|
||||||
|
"test = np.loadtxt('letter_test.txt', dtype=float)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 1000
|
||||||
|
},
|
||||||
|
"id": "vYlzC3RKucGi",
|
||||||
|
"outputId": "95cf1135-6d97-4fc7-9e45-99d43ba82044"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# обучение AE3\n",
|
||||||
|
"patience=5000\n",
|
||||||
|
"ae3_trained, IRE3, IREth3= lib.create_fit_save_ae(train,'out/AE3.h5','out/AE3_ire_th.txt', 100000, False, patience)\n",
|
||||||
|
"lib.ire_plot('training', IRE3, IREth3, 'AE3')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/"
|
||||||
|
},
|
||||||
|
"id": "pfcKYERV3c5-",
|
||||||
|
"outputId": "e486caf8-67ab-4255-85b4-91c852bb4eef"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#тестирование АE3\n",
|
||||||
|
"predicted_labels3, ire3 = lib.predict_ae(ae3_trained, test, IREth3)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 1000
|
||||||
|
},
|
||||||
|
"id": "QCwzSFvU3net",
|
||||||
|
"outputId": "161a8c60-c332-48d2-a082-dfce1332c011"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#тестированиеАE3\n",
|
||||||
|
"lib.anomaly_detection_ae(predicted_labels3, ire3, IREth3)\n",
|
||||||
|
"lib.ire_plot('test', ire3, IREth3, 'AE3')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 1000
|
||||||
|
},
|
||||||
|
"id": "m_ZsgfDo41Wj",
|
||||||
|
"outputId": "d0309f17-5878-4fc7-ce54-d9db48292d3b"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# обучение AE3.2\n",
|
||||||
|
"patience=5000\n",
|
||||||
|
"ae32_trained, IRE32, IREth32= lib.create_fit_save_ae(train,'out/AE32.h5','out/AE32_ire_th.txt', 100000, False, patience)\n",
|
||||||
|
"lib.ire_plot('training', IRE32, IREth32, 'AE32')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/"
|
||||||
|
},
|
||||||
|
"id": "Jp7OVlnqBDtI",
|
||||||
|
"outputId": "c89e7c86-271a-4c95-ae2c-10c7e8d44f62"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#тестирование АE32\n",
|
||||||
|
"predicted_labels32, ire32 = lib.predict_ae(ae32_trained, test, IREth32)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 1000
|
||||||
|
},
|
||||||
|
"id": "QGhswhfsBI49",
|
||||||
|
"outputId": "ce8d2bf4-e500-42ef-f25b-cdde7d8c9cfe"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#тестированиеАE32\n",
|
||||||
|
"lib.anomaly_detection_ae(predicted_labels32, ire32, IREth32)\n",
|
||||||
|
"lib.ire_plot('test', ire32, IREth32, 'AE32')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 1000
|
||||||
|
},
|
||||||
|
"id": "xcBsBGB_BqSs",
|
||||||
|
"outputId": "cfa85dff-a0a5-4b30-ec94-adf4e4fc9ae7"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# обучение AE3.3\n",
|
||||||
|
"patience=5000\n",
|
||||||
|
"ae33_trained, IRE33, IREth33= lib.create_fit_save_ae(train,'out/AE33.h5','out/AE33_ire_th.txt', 100000, False, patience)\n",
|
||||||
|
"lib.ire_plot('training', IRE33, IREth33, 'AE33')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/"
|
||||||
|
},
|
||||||
|
"id": "vie1zEOTQgKO",
|
||||||
|
"outputId": "3176a42d-2edc-4866-c6ed-88fcc29a8b4e"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#тестирование АE33\n",
|
||||||
|
"predicted_labels33, ire33 = lib.predict_ae(ae33_trained, test, IREth33)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 761
|
||||||
|
},
|
||||||
|
"id": "5LA0JPraQkIp",
|
||||||
|
"outputId": "85f0c50b-8223-4c95-84e4-675733fe61e2"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#тестированиеАE33\n",
|
||||||
|
"lib.anomaly_detection_ae(predicted_labels33, ire33, IREth33)\n",
|
||||||
|
"lib.ire_plot('test', ire33, IREth33, 'AE33')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 1000
|
||||||
|
},
|
||||||
|
"id": "Xk9QG5I9Qrc-",
|
||||||
|
"outputId": "c978348f-cb4e-49f0-d863-8d03c19947fc"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# обучение AE3.4\n",
|
||||||
|
"patience=5000\n",
|
||||||
|
"ae34_trained, IRE34, IREth34=lib.create_fit_save_ae(train,'out/AE34.h5','out/AE34_ire_th.txt', 100000, False, patience)\n",
|
||||||
|
"lib.ire_plot('training', IRE34, IREth34, 'AE34')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/",
|
||||||
|
"height": 1000
|
||||||
|
},
|
||||||
|
"id": "EWRa-rSVbGmx",
|
||||||
|
"outputId": "0241dc58-7e85-4a7b-fb45-37c85f5e4e34"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#тестированиеАE34\n",
|
||||||
|
"lib.anomaly_detection_ae(predicted_labels34, ire34, IREth34)\n",
|
||||||
|
"lib.ire_plot('test', ire34, IREth34, 'AE34')"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"base_uri": "https://localhost:8080/"
|
||||||
|
},
|
||||||
|
"id": "GVODHJ6XbBLU",
|
||||||
|
"outputId": "e12cc3e2-e6d6-4384-c72a-6e48f2f1111d"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#тестирование АE34\n",
|
||||||
|
"predicted_labels34, ire34 = lib.predict_ae(ae34_trained, test, IREth34)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"accelerator": "GPU",
|
||||||
|
"colab": {
|
||||||
|
"gpuType": "T4",
|
||||||
|
"provenance": []
|
||||||
|
},
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"name": "python"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 0
|
||||||
|
}
|
||||||
746
labworks/LW2/report.md
Обычный файл
@@ -0,0 +1,746 @@
|
|||||||
|
# Отчёт по лабораторной работе №2
|
||||||
|
|
||||||
|
**Сидора Д.А. Пивоваров Я.В. А-02-22**
|
||||||
|
|
||||||
|
---
|
||||||
|
## Задание 1
|
||||||
|
|
||||||
|
### 1) В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# скачивание библиотеки
|
||||||
|
!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
|
||||||
|
|
||||||
|
# импорт модулей
|
||||||
|
import os
|
||||||
|
os.chdir('/content/drive/MyDrive/Colab Notebooks/lab2')
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import lab02_lib as lib
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2) Сгенерировали индивидуальный набор двумерных данных в пространстве признаков с координатами центра (5, 5). Вывели полученные данные на рисунок и в консоль.
|
||||||
|
|
||||||
|
```python
|
||||||
|
#генерация датасета
|
||||||
|
data=lib.datagen(5,5,1000,2)
|
||||||
|
|
||||||
|
#вывод данных и размерности
|
||||||
|
print('Исходные данные:')
|
||||||
|
print(data)
|
||||||
|
print('Размерность данных:')
|
||||||
|
print(data.shape)
|
||||||
|
```
|
||||||
|

|
||||||
|
```
|
||||||
|
Исходные данные:
|
||||||
|
[[4.92346186 5.06160261]
|
||||||
|
[4.86776523 4.87688396]
|
||||||
|
[5.04434246 4.99621627]
|
||||||
|
...
|
||||||
|
[5.08559661 4.90905577]
|
||||||
|
[5.13652538 5.08244034]
|
||||||
|
[5.04940858 4.87050374]]
|
||||||
|
Размерность данных:
|
||||||
|
(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, False, patience)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4) Зафиксировали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксировали порог ошибки реконструкции – порог обнаружения аномалий.
|
||||||
|
|
||||||
|
Ошибка MSE_AE1 = 7.0839
|
||||||
|
|
||||||
|
```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.0114
|
||||||
|
|
||||||
|
```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: 19
|
||||||
|
amount_ae: 295
|
||||||
|
```
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
Оценка качества AE1
|
||||||
|
IDEAL = 0. Excess: 14.526315789473685
|
||||||
|
IDEAL = 0. Deficit: 0.0
|
||||||
|
IDEAL = 1. Coating: 1.0
|
||||||
|
summa: 1.0
|
||||||
|
IDEAL = 1. Extrapolation precision (Approx): 0.06440677966101695
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
# построение областей покрытия и границ классов
|
||||||
|
# расчет характеристик качества обучения
|
||||||
|
numb_square = 20
|
||||||
|
xx, yy, Z2 = lib.square_calc(numb_square, data, ae2_trained, IREth2, '2', True)
|
||||||
|
```
|
||||||
|

|
||||||
|
```
|
||||||
|
amount: 19
|
||||||
|
amount_ae: 41
|
||||||
|
```
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
Оценка качества AE2
|
||||||
|
IDEAL = 0. Excess: 1.1578947368421053
|
||||||
|
IDEAL = 0. Deficit: 0.0
|
||||||
|
IDEAL = 1. Coating: 1.0
|
||||||
|
summa: 1.0
|
||||||
|
IDEAL = 1. Extrapolation precision (Approx): 0.46341463414634143
|
||||||
|
```
|
||||||
|
|
||||||
|
```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.856234 5.123456]
|
||||||
|
[ 5.234567 4.876543]
|
||||||
|
[ 4.765432 5.345678]
|
||||||
|
[ 5.123456 4.987654]
|
||||||
|
[ 4.987654 5.234567]
|
||||||
|
[ 5.345678 4.765432]
|
||||||
|
[ 4.876543 5.432109]
|
||||||
|
[ 5.432109 4.654321]
|
||||||
|
[ 4.654321 5.56789 ]
|
||||||
|
[ 5.56789 4.54321 ]
|
||||||
|
[ 6.856234 6.123456]
|
||||||
|
[ 7.234567 6.876543]
|
||||||
|
[ 6.765432 7.345678]
|
||||||
|
[ 7.123456 6.987654]
|
||||||
|
[ 6.987654 7.234567]
|
||||||
|
[ 7.345678 6.765432]
|
||||||
|
[ 6.876543 7.432109]
|
||||||
|
[ 7.432109 6.654321]
|
||||||
|
[ 6.654321 7.56789 ]
|
||||||
|
[ 7.56789 6.54321 ]
|
||||||
|
[ 3.156234 3.123456]
|
||||||
|
[ 2.734567 3.876543]
|
||||||
|
[ 3.265432 2.654321]
|
||||||
|
[ 2.876543 3.234567]
|
||||||
|
[ 3.423456 2.987654]
|
||||||
|
[ 2.987654 3.345678]
|
||||||
|
[ 3.576543 2.765432]
|
||||||
|
[ 2.654321 3.432109]
|
||||||
|
[ 3.687654 2.56789 ]
|
||||||
|
[ 2.54321 3.56789 ]
|
||||||
|
[ 5.123456 7.876543]
|
||||||
|
[ 4.876543 8.234567]
|
||||||
|
[ 5.234567 7.654321]
|
||||||
|
[ 4.765432 8.123456]
|
||||||
|
[ 5.345678 7.432109]
|
||||||
|
[ 4.654321 8.345678]
|
||||||
|
[ 5.432109 7.234567]
|
||||||
|
[ 4.54321 8.456789]
|
||||||
|
[ 5.56789 7.123456]
|
||||||
|
[ 4.432109 8.56789 ]
|
||||||
|
[ 7.856234 5.123456]
|
||||||
|
[ 8.234567 4.876543]
|
||||||
|
[ 7.765432 5.345678]
|
||||||
|
[ 8.123456 4.987654]
|
||||||
|
[ 7.987654 5.234567]
|
||||||
|
[ 8.345678 4.765432]
|
||||||
|
[ 7.876543 5.432109]
|
||||||
|
[ 8.432109 4.654321]
|
||||||
|
[ 7.654321 5.56789 ]
|
||||||
|
[ 8.56789 4.54321 ]
|
||||||
|
[14.856234 14.123456]
|
||||||
|
[15.234567 14.876543]
|
||||||
|
[14.765432 15.345678]
|
||||||
|
[15.123456 14.987654]
|
||||||
|
[14.987654 15.234567]
|
||||||
|
[15.345678 14.765432]
|
||||||
|
[14.876543 15.432109]
|
||||||
|
[15.432109 14.654321]
|
||||||
|
[14.654321 15.56789 ]
|
||||||
|
[15.56789 14.54321 ]
|
||||||
|
[-0.856234 -0.123456]
|
||||||
|
[ 0.234567 -0.876543]
|
||||||
|
[-0.765432 0.345678]
|
||||||
|
[ 0.123456 -0.987654]
|
||||||
|
[-0.987654 0.234567]
|
||||||
|
[ 0.345678 -0.765432]
|
||||||
|
[-0.876543 0.432109]
|
||||||
|
[ 0.432109 -0.654321]
|
||||||
|
[-0.654321 0.56789 ]
|
||||||
|
[ 0.56789 -0.54321 ]
|
||||||
|
[17.856234 4.123456]
|
||||||
|
[18.234567 4.876543]
|
||||||
|
[17.765432 5.345678]
|
||||||
|
[18.123456 4.987654]
|
||||||
|
[17.987654 5.234567]
|
||||||
|
[18.345678 4.765432]
|
||||||
|
[17.876543 5.432109]
|
||||||
|
[18.432109 4.654321]
|
||||||
|
[17.654321 5.56789 ]
|
||||||
|
[18.56789 4.54321 ]
|
||||||
|
[-3.123456 22.876543]
|
||||||
|
[ 2.345678 18.654321]
|
||||||
|
[ 8.765432 -1.234567]
|
||||||
|
[12.345678 23.456789]
|
||||||
|
[-4.123456 7.876543]
|
||||||
|
[19.234567 19.876543]
|
||||||
|
[-2.876543 -2.123456]
|
||||||
|
[22.345678 3.654321]
|
||||||
|
[15.432109 -3.234567]
|
||||||
|
[-1.54321 25.56789 ]
|
||||||
|
[ 0. 15. ]
|
||||||
|
[ 2.5 16.25 ]
|
||||||
|
[ 5. 17.5 ]
|
||||||
|
[ 7.5 18.75 ]
|
||||||
|
[10. 20. ]
|
||||||
|
[12.5 21.25 ]
|
||||||
|
[15. 22.5 ]
|
||||||
|
[17.5 23.75 ]
|
||||||
|
[20. 25. ]
|
||||||
|
[22.5 26.25 ]]
|
||||||
|
Размерность data_test: (100, 2)
|
||||||
|
```
|
||||||
|
В данной тестовой выборке среди 100 примеров: 10 нормальные данные(строки 1-10), 40 пограничные случаи (строки 11-50), 50 аномалий, из которых 15 являются сложными для обнаружения(точки рядом с границей) и 35 являются легко обнаружимыми (находятся по углам двумерного набора данных)
|
||||||
|
|
||||||
|
|
||||||
|
### 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')
|
||||||
|
```
|
||||||
|
```
|
||||||
|
i Labels IRE IREth
|
||||||
|
0 [0.] [3.73] 4.11
|
||||||
|
1 [0.] [3.88] 4.11
|
||||||
|
2 [0.] [3.81] 4.11
|
||||||
|
3 [0.] [3.85] 4.11
|
||||||
|
4 [0.] [3.9] 4.11
|
||||||
|
5 [0.] [3.92] 4.11
|
||||||
|
6 [0.] [3.95] 4.11
|
||||||
|
7 [0.] [3.93] 4.11
|
||||||
|
8 [0.] [3.89] 4.11
|
||||||
|
9 [0.] [4.] 4.11
|
||||||
|
10 [1.] [5.92] 4.11
|
||||||
|
11 [1.] [6.67] 4.11
|
||||||
|
12 [1.] [6.63] 4.11
|
||||||
|
13 [1.] [6.66] 4.11
|
||||||
|
14 [1.] [6.72] 4.11
|
||||||
|
15 [1.] [6.69] 4.11
|
||||||
|
16 [1.] [6.77] 4.11
|
||||||
|
17 [1.] [6.7] 4.11
|
||||||
|
18 [1.] [6.71] 4.11
|
||||||
|
19 [1.] [6.75] 4.11
|
||||||
|
20 [0.] [1.23] 4.11
|
||||||
|
21 [0.] [1.41] 4.11
|
||||||
|
22 [0.] [1.28] 4.11
|
||||||
|
23 [0.] [1.03] 4.11
|
||||||
|
24 [0.] [1.46] 4.11
|
||||||
|
25 [0.] [1.18] 4.11
|
||||||
|
26 [0.] [1.59] 4.11
|
||||||
|
27 [0.] [1.] 4.11
|
||||||
|
28 [0.] [1.7] 4.11
|
||||||
|
29 [0.] [1.05] 4.11
|
||||||
|
30 [1.] [6.04] 4.11
|
||||||
|
31 [1.] [6.26] 4.11
|
||||||
|
32 [1.] [5.91] 4.11
|
||||||
|
33 [1.] [6.12] 4.11
|
||||||
|
34 [1.] [5.78] 4.11
|
||||||
|
35 [1.] [6.3] 4.11
|
||||||
|
36 [1.] [5.67] 4.11
|
||||||
|
37 [1.] [6.38] 4.11
|
||||||
|
38 [1.] [5.66] 4.11
|
||||||
|
39 [1.] [6.48] 4.11
|
||||||
|
40 [1.] [6.33] 4.11
|
||||||
|
41 [1.] [6.59] 4.11
|
||||||
|
42 [1.] [6.33] 4.11
|
||||||
|
43 [1.] [6.53] 4.11
|
||||||
|
44 [1.] [6.49] 4.11
|
||||||
|
45 [1.] [6.66] 4.11
|
||||||
|
46 [1.] [6.47] 4.11
|
||||||
|
47 [1.] [6.71] 4.11
|
||||||
|
48 [1.] [6.33] 4.11
|
||||||
|
49 [1.] [6.81] 4.11
|
||||||
|
50 [1.] [17.17] 4.11
|
||||||
|
51 [1.] [17.96] 4.11
|
||||||
|
52 [1.] [17.94] 4.11
|
||||||
|
53 [1.] [17.95] 4.11
|
||||||
|
54 [1.] [18.02] 4.11
|
||||||
|
55 [1.] [17.97] 4.11
|
||||||
|
56 [1.] [18.08] 4.11
|
||||||
|
57 [1.] [17.96] 4.11
|
||||||
|
58 [1.] [18.02] 4.11
|
||||||
|
59 [1.] [17.99] 4.11
|
||||||
|
60 [0.] [2.12] 4.11
|
||||||
|
61 [0.] [3.66] 4.11
|
||||||
|
62 [0.] [1.86] 4.11
|
||||||
|
63 [0.] [3.73] 4.11
|
||||||
|
64 [0.] [1.79] 4.11
|
||||||
|
65 [0.] [3.58] 4.11
|
||||||
|
66 [0.] [1.76] 4.11
|
||||||
|
67 [0.] [3.5] 4.11
|
||||||
|
68 [0.] [1.84] 4.11
|
||||||
|
69 [0.] [3.4] 4.11
|
||||||
|
70 [1.] [15.92] 4.11
|
||||||
|
71 [1.] [16.38] 4.11
|
||||||
|
72 [1.] [15.98] 4.11
|
||||||
|
73 [1.] [16.28] 4.11
|
||||||
|
74 [1.] [16.19] 4.11
|
||||||
|
75 [1.] [16.48] 4.11
|
||||||
|
76 [1.] [16.11] 4.11
|
||||||
|
77 [1.] [16.55] 4.11
|
||||||
|
78 [1.] [15.91] 4.11
|
||||||
|
79 [1.] [16.67] 4.11
|
||||||
|
80 [1.] [22.45] 4.11
|
||||||
|
81 [1.] [17.93] 4.11
|
||||||
|
82 [1.] [7.85] 4.11
|
||||||
|
83 [1.] [23.23] 4.11
|
||||||
|
84 [1.] [8.76] 4.11
|
||||||
|
85 [1.] [24.31] 4.11
|
||||||
|
86 [0.] [3.67] 4.11
|
||||||
|
87 [1.] [20.37] 4.11
|
||||||
|
88 [1.] [14.71] 4.11
|
||||||
|
89 [1.] [24.9] 4.11
|
||||||
|
90 [1.] [14.24] 4.11
|
||||||
|
91 [1.] [15.55] 4.11
|
||||||
|
92 [1.] [17.18] 4.11
|
||||||
|
93 [1.] [18.58] 4.11
|
||||||
|
94 [1.] [19.23] 4.11
|
||||||
|
95 [1.] [21.29] 4.11
|
||||||
|
96 [1.] [23.65] 4.11
|
||||||
|
97 [1.] [26.11] 4.11
|
||||||
|
98 [1.] [28.63] 4.11
|
||||||
|
99 [1.] [31.19] 4.11
|
||||||
|
Обнаружено 69.0 аномалий
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
```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 [0.] [0.14] 0.48
|
||||||
|
1 [0.] [0.35] 0.48
|
||||||
|
2 [0.] [0.38] 0.48
|
||||||
|
3 [0.] [0.21] 0.48
|
||||||
|
4 [0.] [0.26] 0.48
|
||||||
|
5 [1.] [0.49] 0.48
|
||||||
|
6 [0.] [0.44] 0.48
|
||||||
|
7 [1.] [0.62] 0.48
|
||||||
|
8 [1.] [0.63] 0.48
|
||||||
|
9 [1.] [0.8] 0.48
|
||||||
|
10 [1.] [2.25] 0.48
|
||||||
|
11 [1.] [3.] 0.48
|
||||||
|
12 [1.] [3.] 0.48
|
||||||
|
13 [1.] [2.98] 0.48
|
||||||
|
14 [1.] [3.06] 0.48
|
||||||
|
15 [1.] [3.02] 0.48
|
||||||
|
16 [1.] [3.14] 0.48
|
||||||
|
17 [1.] [3.02] 0.48
|
||||||
|
18 [1.] [3.11] 0.48
|
||||||
|
19 [1.] [3.08] 0.48
|
||||||
|
20 [1.] [2.56] 0.48
|
||||||
|
21 [1.] [2.44] 0.48
|
||||||
|
22 [1.] [2.86] 0.48
|
||||||
|
23 [1.] [2.68] 0.48
|
||||||
|
24 [1.] [2.49] 0.48
|
||||||
|
25 [1.] [2.53] 0.48
|
||||||
|
26 [1.] [2.59] 0.48
|
||||||
|
27 [1.] [2.74] 0.48
|
||||||
|
28 [1.] [2.71] 0.48
|
||||||
|
29 [1.] [2.76] 0.48
|
||||||
|
30 [1.] [2.89] 0.48
|
||||||
|
31 [1.] [3.25] 0.48
|
||||||
|
32 [1.] [2.68] 0.48
|
||||||
|
33 [1.] [3.14] 0.48
|
||||||
|
34 [1.] [2.48] 0.48
|
||||||
|
35 [1.] [3.37] 0.48
|
||||||
|
36 [1.] [2.31] 0.48
|
||||||
|
37 [1.] [3.49] 0.48
|
||||||
|
38 [1.] [2.23] 0.48
|
||||||
|
39 [1.] [3.61] 0.48
|
||||||
|
40 [1.] [2.95] 0.48
|
||||||
|
41 [1.] [3.33] 0.48
|
||||||
|
42 [1.] [2.88] 0.48
|
||||||
|
43 [1.] [3.21] 0.48
|
||||||
|
44 [1.] [3.09] 0.48
|
||||||
|
45 [1.] [3.44] 0.48
|
||||||
|
46 [1.] [3.] 0.48
|
||||||
|
47 [1.] [3.54] 0.48
|
||||||
|
48 [1.] [2.81] 0.48
|
||||||
|
49 [1.] [3.69] 0.48
|
||||||
|
50 [1.] [13.5] 0.48
|
||||||
|
51 [1.] [14.3] 0.48
|
||||||
|
52 [1.] [14.3] 0.48
|
||||||
|
53 [1.] [14.29] 0.48
|
||||||
|
54 [1.] [14.37] 0.48
|
||||||
|
55 [1.] [14.3] 0.48
|
||||||
|
56 [1.] [14.44] 0.48
|
||||||
|
57 [1.] [14.29] 0.48
|
||||||
|
58 [1.] [14.38] 0.48
|
||||||
|
59 [1.] [14.31] 0.48
|
||||||
|
60 [1.] [6.74] 0.48
|
||||||
|
61 [1.] [7.48] 0.48
|
||||||
|
62 [1.] [6.97] 0.48
|
||||||
|
63 [1.] [7.63] 0.48
|
||||||
|
64 [1.] [6.8] 0.48
|
||||||
|
65 [1.] [7.33] 0.48
|
||||||
|
66 [1.] [6.95] 0.48
|
||||||
|
67 [1.] [7.19] 0.48
|
||||||
|
68 [1.] [6.9] 0.48
|
||||||
|
69 [1.] [7.03] 0.48
|
||||||
|
70 [1.] [12.98] 0.48
|
||||||
|
71 [1.] [13.33] 0.48
|
||||||
|
72 [1.] [12.86] 0.48
|
||||||
|
73 [1.] [13.21] 0.48
|
||||||
|
74 [1.] [13.08] 0.48
|
||||||
|
75 [1.] [13.44] 0.48
|
||||||
|
76 [1.] [12.98] 0.48
|
||||||
|
77 [1.] [13.53] 0.48
|
||||||
|
78 [1.] [12.76] 0.48
|
||||||
|
79 [1.] [13.67] 0.48
|
||||||
|
80 [1.] [19.63] 0.48
|
||||||
|
81 [1.] [13.96] 0.48
|
||||||
|
82 [1.] [7.32] 0.48
|
||||||
|
83 [1.] [19.91] 0.48
|
||||||
|
84 [1.] [9.39] 0.48
|
||||||
|
85 [1.] [20.66] 0.48
|
||||||
|
86 [1.] [7.18] 0.48
|
||||||
|
87 [1.] [17.49] 0.48
|
||||||
|
88 [1.] [13.36] 0.48
|
||||||
|
89 [1.] [21.6] 0.48
|
||||||
|
90 [1.] [11.17] 0.48
|
||||||
|
91 [1.] [11.57] 0.48
|
||||||
|
92 [1.] [12.57] 0.48
|
||||||
|
93 [1.] [14.] 0.48
|
||||||
|
94 [1.] [15.85] 0.48
|
||||||
|
95 [1.] [17.95] 0.48
|
||||||
|
96 [1.] [20.21] 0.48
|
||||||
|
97 [1.] [22.59] 0.48
|
||||||
|
98 [1.] [25.06] 0.48
|
||||||
|
99 [1.] [27.59] 0.48
|
||||||
|
Обнаружено 94.0 аномалий
|
||||||
|
|
||||||
|
```
|
||||||
|
| Параметр | AE1 | AE2 |
|
||||||
|
|----------|-----|-----|
|
||||||
|
| **True Positive (TP)** | 29 | 50 |
|
||||||
|
| **True Negative (TN)** | 10 | 4 |
|
||||||
|
| **False Positive (FP)** | 29 | 46 |
|
||||||
|
| **False Negative (FN)** | 21 | 0 |
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 11) Визуализировали элементы обучающей и тестовой выборки в областях пространства признаков, распознаваемых автокодировщиками AE1 и AE2.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# построение областей аппроксимации и точек тестового набора
|
||||||
|
lib.plot2in1_anomaly(data, xx, yy, Z1, Z2, data_test)
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
### 12) Результаты исследования занесли в таблицу:
|
||||||
|
Табл. 1 Результаты задания №1
|
||||||
|
|
||||||
|
| | Количество скрытых слоев | Количество нейронов в скрытых слоях | Количество эпох обучения | Ошибка MSE_stop | Порог ошибки реконструкции | Значение показателя Excess | Значение показателя Approx | Количество обнаруженных аномалий |
|
||||||
|
|-----:|------------------------------|----------------------------------------|-----------------------------|--------------------|-------------------------------|-------------------------------|--------------------------------|-------------------------------------|
|
||||||
|
| AE1 | 1 | 1 | 1000 | 7.0839 | 4.16 | 14.526 | 0.064 | 69 |
|
||||||
|
| AE2 | 5 | 3,2,1,2,3 | 3000 | 0.0114 | 0.48 | 1.158 | 0.463 | 94 |
|
||||||
|
|
||||||
|
### 13) Сделали выводы о требованиях к:
|
||||||
|
- данным для обучения,
|
||||||
|
- архитектуре автокодировщика,
|
||||||
|
- количеству эпох обучения,
|
||||||
|
- ошибке MSE_stop, приемлемой для останова обучения,
|
||||||
|
- ошибке реконструкции обучающей выборки (порогу обнаружения
|
||||||
|
аномалий),
|
||||||
|
- характеристикам качества обучения EDCA одноклассового
|
||||||
|
классификатора
|
||||||
|
|
||||||
|
для качественного обнаружения аномалий в данных.
|
||||||
|
|
||||||
|
1) Данные для обучения должны быть без аномалий, чтобы автокодировщик смог рассчитать верное пороговое значение
|
||||||
|
2) Слишком простая архитектура, как у AE1, приводит к неполному выявлению аномалий. Напротив, архитектура, как у AE2, приводит к переобучению
|
||||||
|
3) 1000 эпох - недостаточно, 3000 - избыточно
|
||||||
|
4) Оптимальная ошибка MSE-stop в диапазоне 0.1- 0.01, желательно не меньше для предотвращения переобучения
|
||||||
|
5) 4.16 адекватный, но завышен из-за выбросов. 0.48 слишком низкий, чрезмерная чувствительность.
|
||||||
|
6) Значение Excess не больше 0.5, значение Deficit равное 0, значение Coating равное 1, значение Approx не меньше 0.7
|
||||||
|
|
||||||
|
## Задание 2
|
||||||
|
|
||||||
|
### 1) Изучить описание своего набора реальных данных, что он из себя представляет
|
||||||
|
|
||||||
|
Бригада 4 => набор данных Letter. Он представляет собой набор данных для многоклассовой классификации. Набор предназначен для распознавания черно-белых пиксельных прямоугольниковкак одну из 26 заглавных букв английского алфавита, где буквы алфавита представлены в 16 измерениях. Чтобы получить данные, подходящие для обнаружения аномалий, была произведена подвыборка данных из 3 букв, чтобы сформировать нормальный класс, и случайным образом их пары были объединены так, чтобы их размерность удваивалась. Чтобы сформировать класс аномалий, случайным образом были выбраны несколько экземпляров букв, которые не входят нормальный класс, и они были объединены с экземплярами из нормального класса. Процесс объединения выполняется для того, чтобы сделать обнаружение более сложным, поскольку каждый аномальный пример также будет иметь некоторые нормальные значения признаков
|
||||||
|
|
||||||
|
| Количество признаков | Количество примеров | Количество нормальных примеров | Количество аномальных примеров |
|
||||||
|
|-------------------------:|-----------------------:|----------------------------------:|-----------------------------------:|
|
||||||
|
| 32 | 1600 | 1500 | 100 |
|
||||||
|
|
||||||
|
### 2) Загрузить многомерную обучающую выборку реальных данных Letter.txt.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# загрузка обчуающей выборки
|
||||||
|
train= np.loadtxt('letter_train.txt', dtype=float)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3) Вывести полученные данные и их размерность в консоли.
|
||||||
|
|
||||||
|
```python
|
||||||
|
print('train:\n', train)
|
||||||
|
print('train.shape:', np.shape(train))
|
||||||
|
```
|
||||||
|
```
|
||||||
|
train:
|
||||||
|
[[ 6. 10. 5. ... 10. 2. 7.]
|
||||||
|
[ 0. 6. 0. ... 8. 1. 7.]
|
||||||
|
[ 4. 7. 5. ... 8. 2. 8.]
|
||||||
|
...
|
||||||
|
[ 7. 10. 10. ... 8. 5. 6.]
|
||||||
|
[ 7. 7. 10. ... 6. 0. 8.]
|
||||||
|
[ 3. 4. 5. ... 9. 5. 5.]]
|
||||||
|
train.shape: (1500, 32)
|
||||||
|
```
|
||||||
|
### 4) Создать и обучить автокодировщик с подходящей для данных архитектурой. Выбрать необходимое количество эпох обучения.
|
||||||
|
|
||||||
|
```python
|
||||||
|
|
||||||
|
patience = 5000
|
||||||
|
ae3_trained, IRE3, IREth3= lib.create_fit_save_ae(train,'out/AE3.h5','out/AE3_ire_th.txt', 100000, False, patience)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5) Зафиксировать ошибку MSE, на которой обучение завершилось. Построить график ошибки реконструкции обучающей выборки. Зафиксировать порог ошибки реконструкции – порог обнаружения аномалий.
|
||||||
|
|
||||||
|
Скрытых слоев 7, нейроны: 14 12 9 7 9 12 14
|
||||||
|
|
||||||
|
Ошибка MSE_AE3 = 0.9383
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Построение графика ошибки реконструкции
|
||||||
|
lib.ire_plot('training', IRE3, IREth3, 'AE3')
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
### 6) Сделать вывод о пригодности обученного автокодировщика для качественного обнаружения аномалий. Если порог ошибки реконструкции слишком велик, то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (6).
|
||||||
|
|
||||||
|
```python
|
||||||
|
# обучение AE3.2
|
||||||
|
patience=5000
|
||||||
|
ae32_trained, IRE32, IREth32= lib.create_fit_save_ae(train,'out/AE32.h5','out/AE32_ire_th.txt', 100000, False, patience)
|
||||||
|
```
|
||||||
|
|
||||||
|
Скрытых слоев 7, нейроны: 12 10 8 7 8 10 12
|
||||||
|
|
||||||
|
Ошибка MSE_AE32 = 0.9393
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Построение графика ошибки реконструкции
|
||||||
|
lib.ire_plot('training', IRE32, IREth32, 'AE32')
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
```python
|
||||||
|
# обучение AE3.3
|
||||||
|
patience=5000
|
||||||
|
ae33_trained, IRE33, IREth33= lib.create_fit_save_ae(train,'out/AE33.h5','out/AE33_ire_th.txt', 100000, False, patience)
|
||||||
|
```
|
||||||
|
|
||||||
|
Скрытых слоев 7, нейроны: 10 9 8 7 8 9 10
|
||||||
|
|
||||||
|
Ошибка MSE_AE33 = 1.0524
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Построение графика ошибки реконструкции
|
||||||
|
lib.ire_plot('training', IRE33, IREth33, 'AE33')
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
```python
|
||||||
|
# обучение AE3.4
|
||||||
|
patience=5000
|
||||||
|
ae34_trained, IRE34, IREth34=lib.create_fit_save_ae(train,'out/AE34.h5','out/AE34_ire_th.txt', 100000, False, patience)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Скрытых слоев 11, нейроны: 48 36 28 22 16 10 16 22 28 36 48
|
||||||
|
|
||||||
|
Ошибка MSE_AE34 = 0.3074
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Построение графика ошибки реконструкции
|
||||||
|
lib.ire_plot('training', IRE34, IREth34, 'AE34')
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
### 7) Изучить и загрузить тестовую выборку Letter.txt.
|
||||||
|
|
||||||
|
```python
|
||||||
|
#загрузка тестовой выборки
|
||||||
|
test = np.loadtxt('letter_test.txt', dtype=float)
|
||||||
|
print('\n test:\n', test)
|
||||||
|
print('test.shape:', np.shape(test))
|
||||||
|
```
|
||||||
|
```
|
||||||
|
test:
|
||||||
|
[[ 8. 11. 8. ... 7. 4. 9.]
|
||||||
|
[ 4. 5. 4. ... 13. 8. 8.]
|
||||||
|
[ 3. 3. 5. ... 8. 3. 8.]
|
||||||
|
...
|
||||||
|
[ 4. 9. 4. ... 8. 3. 8.]
|
||||||
|
[ 6. 10. 6. ... 9. 8. 8.]
|
||||||
|
[ 3. 1. 3. ... 9. 1. 7.]]
|
||||||
|
test.shape: (100, 32)
|
||||||
|
```
|
||||||
|
### 8) Подать тестовую выборку на вход обученного автокодировщика для обнаружения аномалий. Вывести график ошибки реконструкции элементов тестовой выборки относительно порога.
|
||||||
|
|
||||||
|
```python
|
||||||
|
#тестирование АE3
|
||||||
|
predicted_labels3, ire3 = lib.predict_ae(ae3_trained, test, IREth3)
|
||||||
|
#тестированиеАE3
|
||||||
|
lib.anomaly_detection_ae(predicted_labels3, ire3, IREth3)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Построение графика ошибки реконструкции
|
||||||
|
lib.ire_plot('test', ire3, IREth3, 'AE3')
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
```python
|
||||||
|
#тестирование АE32
|
||||||
|
predicted_labels32, ire32 = lib.predict_ae(ae32_trained, test, IREth32)
|
||||||
|
#тестированиеАE32
|
||||||
|
lib.anomaly_detection_ae(predicted_labels32, ire32, IREth32)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Построение графика ошибки реконструкции
|
||||||
|
lib.ire_plot('test', ire32, IREth32, 'AE32')
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
```python
|
||||||
|
#тестирование АE33
|
||||||
|
predicted_labels33, ire33 = lib.predict_ae(ae33_trained, test, IREth33)
|
||||||
|
#тестированиеАE33
|
||||||
|
lib.anomaly_detection_ae(predicted_labels33, ire33, IREth33)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Построение графика ошибки реконструкции
|
||||||
|
lib.ire_plot('test', ire33, IREth33, 'AE33')
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
```python
|
||||||
|
#тестирование АE34
|
||||||
|
predicted_labels34, ire34 = lib.predict_ae(ae34_trained, test, IREth34)
|
||||||
|
#тестированиеАE34
|
||||||
|
lib.anomaly_detection_ae(predicted_labels34, ire34, IREth34)
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Построение графика ошибки реконструкции
|
||||||
|
lib.ire_plot('test', ire34, IREth34, 'AE34')
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
### 9) Если результаты обнаружения аномалий не удовлетворительные (обнаружено менее 70% аномалий), то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (9).
|
||||||
|
|
||||||
|
Результаты обнаружения аномалий удовлетворены.
|
||||||
|
|
||||||
|
### 10) Параметры наилучшего автокодировщика и результаты обнаружения аномалий занести в таблицу:
|
||||||
|
Табл. 2 Результаты задания №2
|
||||||
|
|
||||||
|
| Dataset name | Количество скрытых слоев | Количество нейронов в скрытых слоях | Количество эпох обучения | Ошибка MSE_stop | Порог ошибки реконструкции | % обнаруженных аномалий |
|
||||||
|
|:-------------|:-----------------------------|:----------------------------------------|:-----------------------------|:-------------------|:-------------------------------|:---------------------------|
|
||||||
|
| Cardio | 11 | 48 36 28 22 16 10 16 22 28 36 48 | 100000 | 0.3074 | 7.3 | 85% |
|
||||||
|
|
||||||
|
### 11) Сделать выводы о требованиях к:
|
||||||
|
- данным для обучения,
|
||||||
|
- архитектуре автокодировщика,
|
||||||
|
- количеству эпох обучения,
|
||||||
|
- ошибке MSE_stop, приемлемой для останова обучения,
|
||||||
|
- ошибке реконструкции обучающей выборки (порогу обнаружения
|
||||||
|
аномалий)
|
||||||
|
|
||||||
|
для качественного обнаружения аномалий в случае, когда размерность
|
||||||
|
пространства признаков высока.
|
||||||
|
|
||||||
|
1) Данные для обучения должны быть без аномалий, чтобы автокодировщик смог рассчитать верное пороговое значение
|
||||||
|
2) Архитектура автокодировщика должна постепенно сужатся к бутылочному горлышку,а затем постепенно возвращатся к исходным выходным размерам, кол-во скрытых слоев 7-11.
|
||||||
|
3) В рамках данного набора данных оптимальное кол-во эпох 100000 с patience 5000 эпох
|
||||||
|
4) Оптимальная ошибка MSE-stop в районе 0.1, желательно не меньше для предотвращения переобучения
|
||||||
|
5) Значение порога не больше 1.6
|
||||||
399
labworks/LW4/IS_LR4.ipynb
Обычный файл
@@ -0,0 +1,399 @@
|
|||||||
|
{
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 0,
|
||||||
|
"metadata": {
|
||||||
|
"colab": {
|
||||||
|
"provenance": [],
|
||||||
|
"gpuType": "T4"
|
||||||
|
},
|
||||||
|
"kernelspec": {
|
||||||
|
"name": "python3",
|
||||||
|
"display_name": "Python 3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"name": "python"
|
||||||
|
},
|
||||||
|
"accelerator": "GPU"
|
||||||
|
},
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"id": "7kDlfTCMN-n2"
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"import tensorflow as tf\n",
|
||||||
|
"device_name=tf.test.gpu_device_name()\n",
|
||||||
|
"if device_name!='/device:GPU:0':\n",
|
||||||
|
" raise SystemError ('GPUdevicenotfound')\n",
|
||||||
|
"print('FoundGPUat:{}'.format(device_name))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"#загрузка датасета\n",
|
||||||
|
"from keras.datasets import imdb\n",
|
||||||
|
"vocabulary_size=5000\n",
|
||||||
|
"index_from=3\n",
|
||||||
|
"(X_train,y_train),(X_test,y_test)=imdb.load_data(path=\"imdb.npz\",num_words=vocabulary_size,skip_top=0,maxlen=None,seed=15,start_char=1,oov_char=2,index_from=index_from)"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "TJBFrj0mP_as"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# Вывод размеров массивов данных\n",
|
||||||
|
"print(\"Размеры обучающих данных:\")\n",
|
||||||
|
"print(f\"X_train: {len(X_train)} \")\n",
|
||||||
|
"print(f\"y_train: {y_train.shape}\")\n",
|
||||||
|
"print(\"\\nРазмеры тестовых данных:\")\n",
|
||||||
|
"print(f\"X_test: {len(X_test)} \")\n",
|
||||||
|
"print(f\"y_test: {y_test.shape}\")"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "wHyWnCbvWauD"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# Пункт 3: Создание словаря для перевода индексов в слова\n",
|
||||||
|
"# Загрузка словаря \"слово:индекс\"\n",
|
||||||
|
"word_to_id = imdb.get_word_index()\n",
|
||||||
|
"\n",
|
||||||
|
"# Уточнение словаря\n",
|
||||||
|
"word_to_id = {key: (value + index_from) for key, value in word_to_id.items()}\n",
|
||||||
|
"word_to_id[\"<PAD>\"] = 0\n",
|
||||||
|
"word_to_id[\"<START>\"] = 1\n",
|
||||||
|
"word_to_id[\"<UNK>\"] = 2\n",
|
||||||
|
"word_to_id[\"<UNUSED>\"] = 3"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "5A3EcfboWtHs"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# Создание обратного словаря \"индекс:слово\"\n",
|
||||||
|
"id_to_word = {value: key for key, value in word_to_id.items()}\n",
|
||||||
|
"\n",
|
||||||
|
"# Вывод одного отзыва из обучающего множества\n",
|
||||||
|
"import random\n",
|
||||||
|
"sample_index = random.randint(0, len(X_train)-1)\n",
|
||||||
|
"print(f\"\\nОтзыв №{sample_index}\")\n",
|
||||||
|
"print(\"Список индексов слов:\")\n",
|
||||||
|
"print(X_train[sample_index])"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "QFWpDHnzWvVI"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# Преобразование в текст\n",
|
||||||
|
"review_as_text = ' '.join(id_to_word.get(id, '<UNK>') for id in X_train[sample_index])\n",
|
||||||
|
"print(\"\\nОтзыв в виде текста:\")\n",
|
||||||
|
"print(review_as_text)\n",
|
||||||
|
"\n",
|
||||||
|
"# Длина отзыва и метка класса\n",
|
||||||
|
"print(f\"\\nДлина отзыва: {len(X_train[sample_index])} слов\")\n",
|
||||||
|
"print(f\"Метка класса: {y_train[sample_index]} ({'Positive' if y_train[sample_index] == 1 else 'Negative'})\")"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "gcM-G1ZDWxye"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# Пункт 4: Максимальная и минимальная длина отзыва в обучающем множестве\n",
|
||||||
|
"lengths = [len(review) for review in X_train]\n",
|
||||||
|
"max_length = max(lengths)\n",
|
||||||
|
"min_length = min(lengths)\n",
|
||||||
|
"print(f\"Максимальная длина отзыва: {max_length} слов\")\n",
|
||||||
|
"print(f\"Минимальная длина отзыва: {min_length} слов\")"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "FvosOeEyW3gD"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# Пункт 5: Предобработка данных\n",
|
||||||
|
"from tensorflow.keras.utils import pad_sequences\n",
|
||||||
|
"\n",
|
||||||
|
"max_words = 500 # Выбранная единая длина\n",
|
||||||
|
"\n",
|
||||||
|
"X_train = pad_sequences(\n",
|
||||||
|
" X_train,\n",
|
||||||
|
" maxlen=max_words,\n",
|
||||||
|
" value=0,\n",
|
||||||
|
" padding='pre',\n",
|
||||||
|
" truncating='post'\n",
|
||||||
|
")"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "O49mrPqEW6F6"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"X_test = pad_sequences(\n",
|
||||||
|
" X_test,\n",
|
||||||
|
" maxlen=max_words,\n",
|
||||||
|
" value=0,\n",
|
||||||
|
" padding='pre',\n",
|
||||||
|
" truncating='post'\n",
|
||||||
|
")"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "XxoGW1oNW9Gu"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# Пункт 6: Повторение п. 4 после предобработки\n",
|
||||||
|
"print(f\"Длина всех отзывов: {X_train.shape[1]} слов\")\n"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "Zj4jmsjjW_OY"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# Пункт 7: Повторение п. 3 после предобработки\n",
|
||||||
|
"print(\"Список индексов слов:\")\n",
|
||||||
|
"print(X_train[sample_index])\n"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "3bg2bfazXDQV"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# Преобразование в текст (игнорируем нулевые паддинги)\n",
|
||||||
|
"review_after_preprocessing = ' '.join(\n",
|
||||||
|
" id_to_word.get(id, '<UNK>') for id in X_train[sample_index] if id != 0\n",
|
||||||
|
")\n",
|
||||||
|
"print(\"\\nОтзыв в виде текста после предобработки:\")\n",
|
||||||
|
"print(review_after_preprocessing)\n",
|
||||||
|
"\n",
|
||||||
|
"print(f\"\\nДлина отзыва после предобработки: {len([id for id in X_train[sample_index] if id != 0])} значимых слов\")\n",
|
||||||
|
"print(f\"Общая длина с паддингом: {len(X_train[sample_index])}\")\n",
|
||||||
|
"\n",
|
||||||
|
"print(\"\\nВывод: После предобработки все отзывы приведены к единой длине 500 слов.\")\n",
|
||||||
|
"\n"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "enEAfqWFXFYh"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# Пункт 8: Вывод предобработанных массивов и их размерностей\n",
|
||||||
|
"print(\"Предобработанное обучающее множество X_train (первые 5 примеров):\")\n",
|
||||||
|
"print(X_train[:5])\n",
|
||||||
|
"print(\"\\nПредобработанное тестовое множество X_test (первые 5 примеров):\")\n",
|
||||||
|
"print(X_test[:5])\n",
|
||||||
|
"print(f\"Размерность X_train после предобработки: {X_train.shape}\")\n",
|
||||||
|
"print(f\"Размерность X_test после предобработки: {X_test.shape}\")\n",
|
||||||
|
"print(f\"Размерность y_train: {y_train.shape}\")\n",
|
||||||
|
"print(f\"Размерность y_test: {y_test.shape}\")"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "XhHax3ytXNfn"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"\n",
|
||||||
|
"from tensorflow.keras.models import Sequential\n",
|
||||||
|
"from tensorflow.keras.layers import Embedding, LSTM, Dropout, Dense\n",
|
||||||
|
"import numpy as np\n",
|
||||||
|
"\n",
|
||||||
|
"model = Sequential()\n",
|
||||||
|
"\n",
|
||||||
|
"model.add(Embedding(\n",
|
||||||
|
" input_dim=vocabulary_size,\n",
|
||||||
|
" output_dim=32,\n",
|
||||||
|
" input_length=max_words\n",
|
||||||
|
"))\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"model.add(LSTM(units=100))\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"model.add(Dropout(rate=0.3))\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"model.add(Dense(1, activation='sigmoid')) #\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"model.build(input_shape=(None, max_words))\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"model.compile(\n",
|
||||||
|
" loss='binary_crossentropy',\n",
|
||||||
|
" optimizer='adam',\n",
|
||||||
|
" metrics=['accuracy']\n",
|
||||||
|
")\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"print(\"Архитектура нейронной сети\")\n",
|
||||||
|
"model.summary()"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "37SouWnhYOpH"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"history = model.fit(\n",
|
||||||
|
" X_train,\n",
|
||||||
|
" y_train,\n",
|
||||||
|
" validation_split=0.2,\n",
|
||||||
|
" batch_size=64,\n",
|
||||||
|
" epochs=5,\n",
|
||||||
|
" verbose=1\n",
|
||||||
|
")"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "RKFjXgRTZOxV"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# Проверяем достигнутое качество на валидационных данных\n",
|
||||||
|
"val_accuracy = history.history['val_accuracy'][-1]\n",
|
||||||
|
"print(f\"\\nТочность на валидационных данных: {val_accuracy:.4f}\")\n",
|
||||||
|
"if val_accuracy >= 0.8:\n",
|
||||||
|
" print(\"Цель достигнута: accuracy >= 0.8\")\n",
|
||||||
|
"else:\n",
|
||||||
|
" print(\"Цель не достигнута: accuracy < 0.8\")"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "FYcoID1UZafM"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# Пункт 10: Оценка качества обучения на тестовых данных\n",
|
||||||
|
"\n",
|
||||||
|
"# 1) Значение метрики качества классификации на тестовых данных\n",
|
||||||
|
"print(\"\\n1) Метрика качества на тестовых данных:\")\n",
|
||||||
|
"test_loss, test_accuracy = model.evaluate(X_test, y_test, verbose=0)\n",
|
||||||
|
"print(f\" Loss: {test_loss:.4f}\")\n",
|
||||||
|
"print(f\" Accuracy: {test_accuracy:.4f}\")"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "lvqn53FDZdj0"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# 2) Отчет о качестве классификации тестовой выборки\n",
|
||||||
|
"y_score = model.predict(X_test, verbose=0)\n",
|
||||||
|
"\n",
|
||||||
|
"# Преобразуем вероятности в бинарные предсказания (порог 0.5)\n",
|
||||||
|
"y_pred = [1 if y_score[i, 0] >= 0.5 else 0 for i in range(len(y_score))]\n",
|
||||||
|
"\n",
|
||||||
|
"from sklearn.metrics import classification_report\n",
|
||||||
|
"print(classification_report(y_test, y_pred, labels=[0,1], target_names=['Negative','Positive']))"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "2GbHQzH2Zo_D"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# 3) Построение ROC-кривой и вычисление AUC-ROC\n",
|
||||||
|
"from sklearn.metrics import roc_curve, auc, roc_auc_score\n",
|
||||||
|
"import matplotlib.pyplot as plt\n",
|
||||||
|
"\n",
|
||||||
|
"fpr, tpr, thresholds = roc_curve(y_test, y_score)\n",
|
||||||
|
"\n",
|
||||||
|
"plt.figure(figsize=(8, 6))\n",
|
||||||
|
"plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {auc(fpr, tpr):.4f})')\n",
|
||||||
|
"plt.xlim([0.0, 1.0])\n",
|
||||||
|
"plt.ylim([0.0, 1.05])\n",
|
||||||
|
"plt.xlabel('False Positive Rate')\n",
|
||||||
|
"plt.ylabel('True Positive Rate')\n",
|
||||||
|
"plt.title('ROC Curve')\n",
|
||||||
|
"plt.legend(loc=\"lower right\")\n",
|
||||||
|
"plt.grid(True)\n",
|
||||||
|
"plt.show()"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "7bclQvRoZu0F"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"source": [
|
||||||
|
"# Вычисляем AUC-ROC\n",
|
||||||
|
"auc_roc = roc_auc_score(y_test, y_score)\n",
|
||||||
|
"print(f\" Площадь под ROC-кривой (AUC-ROC): {auc_roc:.4f}\")"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"id": "StkTG5k7ZxxD"
|
||||||
|
},
|
||||||
|
"execution_count": null,
|
||||||
|
"outputs": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Двоичные данные
labworks/LW4/ROC-кривая.png
Обычный файл
|
После Ширина: | Высота: | Размер: 26 KiB |
464
labworks/LW4/report.md
Обычный файл
@@ -0,0 +1,464 @@
|
|||||||
|
# Лабораторная работа №4: Распознавание последовательностей
|
||||||
|
**Сидора Д.А.; Пивоваров Я.В.**
|
||||||
|
## Номер бригады - 4
|
||||||
|
|
||||||
|
### Цель работы
|
||||||
|
|
||||||
|
Получить практические навыки обработки текстовой информации с помощью рекуррентных искусственных нейронных сетей при решении задачи определения тональности текста.
|
||||||
|
|
||||||
|
### Определение варианта
|
||||||
|
|
||||||
|
- Номер бригады: k = 4
|
||||||
|
- random_state = (4k - 1) = 15
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Пункт №1. Настройка блокнота для работы с аппаратным ускорителем GPU.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import tensorflow as tf
|
||||||
|
device_name=tf.test.gpu_device_name()
|
||||||
|
if device_name!='/device:GPU:0':
|
||||||
|
raise SystemError ('GPUdevicenotfound')
|
||||||
|
print('FoundGPUat:{}'.format(device_name))
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пункт №2. Загрузка набора данных IMDb.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# загрузка датасета
|
||||||
|
from keras.datasets import imdb
|
||||||
|
vocabulary_size=5000
|
||||||
|
index_from=3
|
||||||
|
(X_train,y_train),(X_test,y_test)=imdb.load_data(path="imdb.npz",
|
||||||
|
num_words=vocabulary_size,
|
||||||
|
skip_top=0,
|
||||||
|
maxlen=None,
|
||||||
|
seed=15,
|
||||||
|
start_char=1,
|
||||||
|
oov_char=2,
|
||||||
|
index_from=index_from)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат выполнения:**
|
||||||
|
```
|
||||||
|
Размеры обучающих данных:
|
||||||
|
X_train: 25000
|
||||||
|
y_train: (25000,)
|
||||||
|
|
||||||
|
Размеры тестовых данных:
|
||||||
|
X_test: 25000
|
||||||
|
y_test: (25000,)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пункт №3. Вывод отзывов из обучающего множества в виде списка индексов слов.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# создание словаря для перевода индексов в слова
|
||||||
|
# заргузка словаря "слово:индекс"
|
||||||
|
word_to_id = imdb.get_word_index()
|
||||||
|
# уточнение словаря
|
||||||
|
word_to_id = {key:(value + index_from) for key,value in word_to_id.items()}
|
||||||
|
word_to_id["<PAD>"] = 0
|
||||||
|
word_to_id["<START>"] = 1
|
||||||
|
word_to_id["<UNK>"] = 2
|
||||||
|
word_to_id["<UNUSED>"] = 3
|
||||||
|
# Создание обратного словаря "индекс:слово"
|
||||||
|
id_to_word = {value: key for key, value in word_to_id.items()}
|
||||||
|
|
||||||
|
# Вывод одного отзыва из обучающего множества
|
||||||
|
import random
|
||||||
|
sample_index = random.randint(0, len(X_train)-1)
|
||||||
|
print(f"\nОтзыв №{sample_index}")
|
||||||
|
print("Список индексов слов:")
|
||||||
|
print(X_train[sample_index])
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат выполнения:**
|
||||||
|
```
|
||||||
|
Отзыв №11211
|
||||||
|
Список индексов слов:
|
||||||
|
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 1 175 280 11 6 137 11
|
||||||
|
4 389 182 7 189 2 26 2882 5 31 461 340 2 34
|
||||||
|
94 2099 3499 14 9 57 329 74 6 3643 14 9 6 22
|
||||||
|
2 7 2 2860 2 5 465 841 5 13 104 45 2277 8
|
||||||
|
135 31 7 61 1640 189 108 7 32 58 5 7 265 12
|
||||||
|
1367 242 4 686 91 1035 46 629 720 11 4 226 7 479
|
||||||
|
7 189 175 58 13 67 4 22 5 12 214 56 8 4
|
||||||
|
213 121 25 124 4 2 80 593 13 353 8 377 618 54
|
||||||
|
13 80 30 2 46 7 61 2 21 12 115 996 8 593
|
||||||
|
13 115 79 12 208 5 13 169 546 17 2 17 4 86
|
||||||
|
58 13 219 12 150 12 215 30 301 8 2337 6 2 189
|
||||||
|
337 40 15 15 9 164 346 7 1050 3203 1025 4 1531 4
|
||||||
|
2 124 68 2 36 193 3114 11 4 498 7 116 36 81
|
||||||
|
24 359 101 318 962 11 661 8 2833 841 36 2 23 4
|
||||||
|
671 7 4 2 65 5 4 2 11 14 420 7 2 5
|
||||||
|
2 175 686 1427 9 2 39 4 270 1328 4 116 4 65
|
||||||
|
8 4 3541 841 2 2 1348 100 97 4 2113 2 198 18
|
||||||
|
252 17 35 130 854 48 25 18 49 4729 282 92 40 14
|
||||||
|
418 7 2 95 25 1252 92 124 51 189 9 32 44 5
|
||||||
|
2035 81 24 1833 8 124 12 345 1294 25]
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Преобразование в текст
|
||||||
|
review_as_text = ' '.join(id_to_word.get(id, '<UNK>') for id in X_train[sample_index])
|
||||||
|
print("\nОтзыв в виде текста:")
|
||||||
|
print(review_as_text)
|
||||||
|
|
||||||
|
# Длина отзыва и метка класса
|
||||||
|
print(f"\nДлина отзыва: {len(X_train[sample_index])} слов")
|
||||||
|
print(f"Метка класса: {y_train[sample_index]} ({'Positive' if y_train[sample_index] == 1 else 'Negative'})")
|
||||||
|
```
|
||||||
|
**Результат выполнения:**
|
||||||
|
```
|
||||||
|
Отзыв в виде текста:
|
||||||
|
<START> my all time favorite movie i have seen many movies but this one beats them
|
||||||
|
all <UNK> acting wonderful story you will as a normal caring person start to love
|
||||||
|
george <UNK> he is an actor he is also himself and a very lovable person and
|
||||||
|
<UNK> most important thing you will learn to respect look different to people with
|
||||||
|
down <UNK>
|
||||||
|
Длина отзыва: 63 слов
|
||||||
|
Метка класса: 1 (Positive)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пункт №4. Вывод максимальной и минимальной длины отзыва в обучающем множестве.
|
||||||
|
|
||||||
|
```python
|
||||||
|
lengths = [len(review) for review in X_train]
|
||||||
|
max_length = max(lengths)
|
||||||
|
min_length = min(lengths)
|
||||||
|
|
||||||
|
print(f"Максимальная длина отзыва: {max_length} слов")
|
||||||
|
print(f"Минимальная длина отзыва: {min_length} слов")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат выполнения:**
|
||||||
|
```
|
||||||
|
Максимальная длина отзыва: 2494 слов
|
||||||
|
Минимальная длина отзыва: 11 слов
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пункт №5. Проведение предобработки данных.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from tensorflow.keras.utils import pad_sequences
|
||||||
|
|
||||||
|
max_words = 500 # Выбранная единая длина
|
||||||
|
|
||||||
|
X_train = pad_sequences(
|
||||||
|
X_train,
|
||||||
|
maxlen=max_words,
|
||||||
|
value=0,
|
||||||
|
padding='pre',
|
||||||
|
truncating='post'
|
||||||
|
)
|
||||||
|
X_test = pad_sequences(
|
||||||
|
X_test,
|
||||||
|
maxlen=max_words,
|
||||||
|
value=0,
|
||||||
|
padding='pre',
|
||||||
|
truncating='post'
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пункт №6. Повторение пункта 4.
|
||||||
|
|
||||||
|
```python
|
||||||
|
print(f"Длина всех отзывов: {X_train.shape[1]} слов")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат выполнения:**
|
||||||
|
```
|
||||||
|
Длина всех отзывов: 500 слов
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пункт №7. Повторение пункта 3.
|
||||||
|
|
||||||
|
```python
|
||||||
|
print(f"\nОтзыв №{sample_index} после предобработки")
|
||||||
|
print("Список индексов слов:")
|
||||||
|
print(X_train[sample_index])
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат выполнения:**
|
||||||
|
```
|
||||||
|
Отзыв №11211 после предобработки
|
||||||
|
Список индексов слов:
|
||||||
|
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
0 0 0 0 0 0 0 1 175 280 11 6 137 11
|
||||||
|
4 389 182 7 189 2 26 2882 5 31 461 340 2 34
|
||||||
|
94 2099 3499 14 9 57 329 74 6 3643 14 9 6 22
|
||||||
|
2 7 2 2860 2 5 465 841 5 13 104 45 2277 8
|
||||||
|
135 31 7 61 1640 189 108 7 32 58 5 7 265 12
|
||||||
|
1367 242 4 686 91 1035 46 629 720 11 4 226 7 479
|
||||||
|
7 189 175 58 13 67 4 22 5 12 214 56 8 4
|
||||||
|
213 121 25 124 4 2 80 593 13 353 8 377 618 54
|
||||||
|
13 80 30 2 46 7 61 2 21 12 115 996 8 593
|
||||||
|
13 115 79 12 208 5 13 169 546 17 2 17 4 86
|
||||||
|
58 13 219 12 150 12 215 30 301 8 2337 6 2 189
|
||||||
|
337 40 15 15 9 164 346 7 1050 3203 1025 4 1531 4
|
||||||
|
2 124 68 2 36 193 3114 11 4 498 7 116 36 81
|
||||||
|
24 359 101 318 962 11 661 8 2833 841 36 2 23 4
|
||||||
|
671 7 4 2 65 5 4 2 11 14 420 7 2 5
|
||||||
|
2 175 686 1427 9 2 39 4 270 1328 4 116 4 65
|
||||||
|
8 4 3541 841 2 2 1348 100 97 4 2113 2 198 18
|
||||||
|
252 17 35 130 854 48 25 18 49 4729 282 92 40 14
|
||||||
|
418 7 2 95 25 1252 92 124 51 189 9 32 44 5
|
||||||
|
2035 81 24 1833 8 124 12 345 1294 25]
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Преобразование в текст (игнорируем нулевые паддинги)
|
||||||
|
review_after_preprocessing = ' '.join(
|
||||||
|
id_to_word.get(id, '<UNK>') for id in X_train[sample_index] if id != 0
|
||||||
|
)
|
||||||
|
print("\nОтзыв в виде текста после предобработки:")
|
||||||
|
print(review_after_preprocessing)
|
||||||
|
|
||||||
|
print(f"\nДлина отзыва после предобработки: {len([id for id in X_train[sample_index] if id != 0])} значимых слов")
|
||||||
|
print(f"Общая длина с паддингом: {len(X_train[sample_index])}")
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат выполнения:**
|
||||||
|
```
|
||||||
|
Отзыв в виде текста после предобработки:
|
||||||
|
<START> every once in a while in the wonderful world of horror <UNK> are crafted and one becomes completely <UNK> by its sheer brilliance this is no less than a diamond this is a film <UNK> of <UNK> chilling <UNK> and dark atmosphere and i think it's safe to say one of my favourite horror films of all time and of course it contains probably the single most flat out scary sequence in the whole of history of horror every time i see the film and it gets up to the point where you know the <UNK> will happen i try to remember exactly when i will be <UNK> out of my <UNK> but it never fails to happen i never get it right and i find myself as <UNK> as the first time i saw it now it must be said to scare a <UNK> horror fan like that that is nothing short of pure perfection unlike the americans the <UNK> know their <UNK> they take pride in the art of acting they do not need any special effect in order to convey atmosphere they <UNK> on the power of the <UNK> story and the <UNK> in this case of <UNK> and <UNK> every single element is <UNK> from the set pieces the acting the story to the menacing atmosphere <UNK> <UNK> surely could make the devil <UNK> that's for sure as an end note if you for some demented reason don't like this piece of <UNK> then you honestly don't know what horror is all about and frankly do not deserve to know it either thank you
|
||||||
|
|
||||||
|
Длина отзыва после предобработки: 269 значимых слов
|
||||||
|
Общая длина с паддингом: 500
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
**Вывод:**
|
||||||
|
```
|
||||||
|
После предобработки длина всех отзывов была приведена к 500 словам. Рассматриваемый отзыв был дополнен нулями (<PAD>) в начале, так как его исходная длина была меньше выбранного максимума. Обрезания текста не произошло. Функция pad_sequences выровняла все отзывы к единой длине.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пункт №8. Вывод предобработанных массивов обучающих и тестовых данных.
|
||||||
|
|
||||||
|
```python
|
||||||
|
print("Предобработанное обучающее множество X_train (первые 5 примеров):")
|
||||||
|
print(X_train[:5])
|
||||||
|
print("\nПредобработанное тестовое множество X_test (первые 5 примеров):")
|
||||||
|
print(X_test[:5])
|
||||||
|
print(f"Размерность X_train после предобработки: {X_train.shape}")
|
||||||
|
print(f"Размерность X_test после предобработки: {X_test.shape}")
|
||||||
|
print(f"Размерность y_train: {y_train.shape}")
|
||||||
|
print(f"Размерность y_test: {y_test.shape}")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат выполнения:**
|
||||||
|
```
|
||||||
|
Предобработанное обучающее множество X_train (первые 5 примеров):
|
||||||
|
[[ 0 0 0 ... 4 86 273]
|
||||||
|
[ 0 0 0 ... 705 9 150]
|
||||||
|
[ 0 0 0 ... 44 12 32]
|
||||||
|
[ 0 0 0 ... 176 7 253]
|
||||||
|
[ 0 0 0 ... 2 2 1143]]
|
||||||
|
|
||||||
|
Предобработанное тестовое множество X_test (первые 5 примеров):
|
||||||
|
[[ 0 0 0 ... 106 14 31]
|
||||||
|
[ 0 0 0 ... 458 168 52]
|
||||||
|
[ 0 0 0 ... 22 6 31]
|
||||||
|
[ 0 0 0 ... 5 2 229]
|
||||||
|
[ 0 0 0 ... 2 7 2204]]
|
||||||
|
Размерность X_train после предобработки: (25000, 500)
|
||||||
|
Размерность X_test после предобработки: (25000, 500)
|
||||||
|
Размерность y_train: (25000,)
|
||||||
|
Размерность y_test: (25000,)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пункт №9. Реализация модели рекуррентной нейронной сети.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from tensorflow.keras.models import Sequential
|
||||||
|
from tensorflow.keras.layers import Embedding, LSTM, Dropout, Dense
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
model = Sequential()
|
||||||
|
model.add(Embedding(
|
||||||
|
input_dim=vocabulary_size,
|
||||||
|
output_dim=32,
|
||||||
|
input_length=max_words
|
||||||
|
))
|
||||||
|
model.add(LSTM(units=100))
|
||||||
|
model.add(Dropout(rate=0.3))
|
||||||
|
model.add(Dense(1, activation='sigmoid'))
|
||||||
|
model.build(input_shape=(None, max_words))
|
||||||
|
model.compile(
|
||||||
|
loss='binary_crossentropy',
|
||||||
|
optimizer='adam',
|
||||||
|
metrics=['accuracy']
|
||||||
|
)
|
||||||
|
|
||||||
|
model.summary()
|
||||||
|
|
||||||
|
# Обучение модели
|
||||||
|
history = model.fit(
|
||||||
|
X_train,
|
||||||
|
y_train,
|
||||||
|
validation_split=0.2,
|
||||||
|
batch_size=64,
|
||||||
|
epochs=5,
|
||||||
|
verbose=1
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат выполнения:**
|
||||||
|
|
||||||
|
| Layer (type) | Output Shape | Param # |
|
||||||
|
|-----------------------|-------------------|-----------|
|
||||||
|
| embedding_3 (Embedding) | (None, 500, 32) | 160,000 |
|
||||||
|
| lstm_3 (LSTM) | (None, 100) | 53,200 |
|
||||||
|
| dropout_3 (Dropout) | (None, 100) | 0 |
|
||||||
|
| dense_3 (Dense) | (None, 1) | 101 |
|
||||||
|
|
||||||
|
Total params: 213,301 (833.21 KB)
|
||||||
|
Trainable params: 213,301 (833.21 KB)
|
||||||
|
Non-trainable params: 0 (0.00 B)
|
||||||
|
|
||||||
|
```
|
||||||
|
Качество обучения по эпохам
|
||||||
|
Epoch 1/5
|
||||||
|
accuracy: 0.6407 - loss: 0.6171 - val_accuracy: 0.8348 - val_loss: 0.3843
|
||||||
|
Epoch 2/5
|
||||||
|
accuracy: 0.8714 - loss: 0.3196 - val_accuracy: 0.8746 - val_loss: 0.3228
|
||||||
|
Epoch 3/5
|
||||||
|
accuracy: 0.8949 - loss: 0.2688 - val_accuracy: 0.8568 - val_loss: 0.3423
|
||||||
|
Epoch 4/5
|
||||||
|
accuracy: 0.9168 - loss: 0.2190 - val_accuracy: 0.8558 - val_loss: 0.3538
|
||||||
|
Epoch 5/5
|
||||||
|
accuracy: 0.9177 - loss: 0.2205 - val_accuracy: 0.8238 - val_loss: 0.6978
|
||||||
|
|
||||||
|
```
|
||||||
|
Добились качества обучения по метрике val_accuracy не менее 0.8.
|
||||||
|
|
||||||
|
### Пункт №10.1 Оценка качества обучения на тестовых данных.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# 1) Значение метрики качества классификации на тестовых данных
|
||||||
|
print("\n1) Метрика качества на тестовых данных:")
|
||||||
|
test_loss, test_accuracy = model.evaluate(X_test, y_test, verbose=0)
|
||||||
|
print(f" Loss: {test_loss:.4f}")
|
||||||
|
print(f" Accuracy: {test_accuracy:.4f}")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат выполнения:**
|
||||||
|
```
|
||||||
|
1) Метрика качества на тестовых данных:
|
||||||
|
Loss: 0.7164
|
||||||
|
Accuracy: 0.8165
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пункт №10.2
|
||||||
|
|
||||||
|
```python
|
||||||
|
# 2) Отчет о качестве классификации тестовой выборки
|
||||||
|
print("\n2) Отчет о качестве классификации:")
|
||||||
|
y_score = model.predict(X_test, verbose=0)
|
||||||
|
|
||||||
|
y_pred = [1 if y_score[i, 0] >= 0.5 else 0 for i in range(len(y_score))]
|
||||||
|
|
||||||
|
from sklearn.metrics import classification_report
|
||||||
|
print(classification_report(y_test, y_pred, labels=[0,1], target_names=['Negative','Positive']))
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат выполнения:**
|
||||||
|
|
||||||
|
| Class | Precision | Recall | F1-Score | Support |
|
||||||
|
|-----------|-----------|--------|----------|---------|
|
||||||
|
| Negative | 0.91 | 0.80 | 0.85 | 12500 |
|
||||||
|
| Positive | 0.82 | 0.92 | 0.87 | 12500 |
|
||||||
|
| Macro Avg | 0.87 | 0.86 | 0.86 | 25000 |
|
||||||
|
| Weighted Avg | 0.87 | 0.86 | 0.86 | 25000 |
|
||||||
|
|
||||||
|
```
|
||||||
|
accuracy 0.86 25000
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пункт №10.3
|
||||||
|
|
||||||
|
```python
|
||||||
|
# 3) Построение ROC-кривой и вычисление AUC-ROC
|
||||||
|
from sklearn.metrics import roc_curve, auc, roc_auc_score
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
fpr, tpr, thresholds = roc_curve(y_test, y_score)
|
||||||
|
|
||||||
|
plt.figure(figsize=(8, 6))
|
||||||
|
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {auc(fpr, tpr):.4f})')
|
||||||
|
plt.xlim([0.0, 1.0])
|
||||||
|
plt.ylim([0.0, 1.05])
|
||||||
|
plt.xlabel('False Positive Rate')
|
||||||
|
plt.ylabel('True Positive Rate')
|
||||||
|
plt.title('ROC Curve')
|
||||||
|
plt.legend(loc="lower right")
|
||||||
|
plt.grid(True)
|
||||||
|
plt.show()
|
||||||
|
# Вычисляем AUC-ROC
|
||||||
|
auc_roc = roc_auc_score(y_test, y_score)
|
||||||
|
print(f" Площадь под ROC-кривой (AUC-ROC): {auc_roc:.4f}")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат выполнения:**
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Площадь под ROC-кривой (AUC-ROC): 0.9361
|
||||||
|
|
||||||
|
### Пункт №11. Выводы по результатам применения рекуррентной нейронной сети.
|
||||||
|
|
||||||
|
**Выводы по лабораторной работе:**
|
||||||
|
|
||||||
|
|
||||||
|
В ходе выполнения лабораторной работы были получены практические навыки обработки текстовой информации с помощью рекуррентных искусственных нейронных сетей для решения задачи определения тональности текста на примере набора данных IMDb.
|
||||||
|
|
||||||
|
Ключевые результаты:
|
||||||
|
Набор данных IMDb был загружен и предобработан. Все отзывы приведены к единой длине 500 слов с помощью паддинга и truncating.
|
||||||
|
|
||||||
|
Реализована модель рекуррентной нейронной сети со следующей архитектурой:
|
||||||
|
|
||||||
|
-Embedding слой (160,000 параметров) для преобразования слов в векторные представления
|
||||||
|
-LSTM слой (53,200 параметров) для обработки последовательностей с учетом контекста
|
||||||
|
-Dropout слой (rate=0.3) для предотвращения переобучения
|
||||||
|
-Dense слой (101 параметр) с сигмоидальной активацией для бинарной классификации
|
||||||
|
|
||||||
|
Модель достигла точности (accuracy) на тестовых данных не менее 0.8, что соответствует требованиям задания.
|
||||||
|
|
||||||
|
Качество классификации было подтверждено различными метриками: accuracy на тестовой выборке, precision, recall и f1-score, ROC-кривая и AUC-ROC показатель.
|
||||||
|
|
||||||
|
Использование LSTM-сетей доказало свою эффективность для обработки последовательных данных, таких как тексты, поскольку позволяет учитывать контекст и зависимости между словами в отзывах.
|
||||||