From 1d0184c4cc2d71cdaed0e531215f227cad1bbcb4 Mon Sep 17 00:00:00 2001 From: Matvey Date: Wed, 17 Dec 2025 22:06:28 +0300 Subject: [PATCH] lr4 --- labworks/LW4/1.png | Bin 0 -> 14156 bytes labworks/LW4/2.png | Bin 0 -> 21180 bytes labworks/LW4/Untitled4.ipynb | 1 + labworks/LW4/report4.md | 315 +++++++++++++++++++++++++++++++++++ 4 files changed, 316 insertions(+) create mode 100644 labworks/LW4/1.png create mode 100644 labworks/LW4/2.png create mode 100644 labworks/LW4/Untitled4.ipynb create mode 100644 labworks/LW4/report4.md diff --git a/labworks/LW4/1.png b/labworks/LW4/1.png new file mode 100644 index 0000000000000000000000000000000000000000..875a23adb2e36b613f56234d0d17580b181312cb GIT binary patch literal 14156 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 DTEuD6 literal 0 HcmV?d00001 diff --git a/labworks/LW4/2.png b/labworks/LW4/2.png new file mode 100644 index 0000000000000000000000000000000000000000..44b6d482d6d229c54422f24ae1a08d445f47bec7 GIT binary patch literal 21180 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 literal 0 HcmV?d00001 diff --git a/labworks/LW4/Untitled4.ipynb b/labworks/LW4/Untitled4.ipynb new file mode 100644 index 0000000..3b9990e --- /dev/null +++ b/labworks/LW4/Untitled4.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"gpuType":"T4","mount_file_id":"1dQiaK4Y4D4eYkkKYx5IBKLvpkudanxQO","authorship_tag":"ABX9TyORSDet3l9scspyGr9Z+1WD"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"accelerator":"GPU"},"cells":[{"cell_type":"code","execution_count":2,"metadata":{"id":"rASa9J7lykKr","executionInfo":{"status":"ok","timestamp":1765983141737,"user_tz":-180,"elapsed":41,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}}},"outputs":[],"source":["import os\n","os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab4')"]},{"cell_type":"code","source":["from tensorflow import keras\n","from tensorflow.keras import layers\n","from tensorflow.keras.models import Sequential\n","import matplotlib.pyplot as plt\n","import numpy as np\n","\n","import tensorflow as tf\n","device_name = tf.test.gpu_device_name()\n","if device_name != '/device:GPU:0':\n"," raise SystemError('GPU device not found')\n","print('Found GPU at: {}'.format(device_name))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ivnaOo__zEWA","executionInfo":{"status":"ok","timestamp":1765983184600,"user_tz":-180,"elapsed":9392,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"382aaeea-c183-4225-bd05-15447035225a"},"execution_count":3,"outputs":[{"output_type":"stream","name":"stdout","text":["Found GPU at: /device:GPU:0\n"]}]},{"cell_type":"code","source":["from keras.datasets import imdb\n","\n","vocabulary_size = 5000\n","index_from = 3\n","\n","(X_train, y_train), (X_test, y_test) = imdb.load_data(\n"," path=\"imdb.npz\",\n"," num_words=vocabulary_size,\n"," skip_top=0,\n"," maxlen=None,\n"," seed=23,\n"," start_char=1,\n"," oov_char=2,\n"," index_from=index_from\n"," )\n","\n","print('Shape of X train:', X_train.shape)\n","print('Shape of y train:', y_train.shape)\n","print('Shape of X test:', X_test.shape)\n","print('Shape of y test:', y_test.shape)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"vEvCcnAazRYl","executionInfo":{"status":"ok","timestamp":1765983273528,"user_tz":-180,"elapsed":6591,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"c030c415-4ee5-418f-958d-5105ea420484"},"execution_count":4,"outputs":[{"output_type":"stream","name":"stdout","text":["Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz\n","\u001b[1m17464789/17464789\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 0us/step\n","Shape of X train: (25000,)\n","Shape of y train: (25000,)\n","Shape of X test: (25000,)\n","Shape of y test: (25000,)\n"]}]},{"cell_type":"code","source":["# создание словаря для перевода индексов в слова\n","# заргузка словаря \"слово:индекс\"\n","word_to_id = imdb.get_word_index()\n","# уточнение словаря\n","word_to_id = {key:(value + index_from) for key,value in word_to_id.items()}\n","word_to_id[\"\"] = 0\n","word_to_id[\"\"] = 1\n","word_to_id[\"\"] = 2\n","word_to_id[\"\"] = 3\n","# создание обратного словаря \"индекс:слово\"\n","id_to_word = {value:key for key,value in word_to_id.items()}\n","\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"zMtAST4d0VaM","executionInfo":{"status":"ok","timestamp":1765983530313,"user_tz":-180,"elapsed":2232,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"48cd3621-3c3d-41b0-8d77-c42c32e47c75"},"execution_count":5,"outputs":[{"output_type":"stream","name":"stdout","text":["Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb_word_index.json\n","\u001b[1m1641221/1641221\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 1us/step\n"]}]},{"cell_type":"code","source":["print(X_train[23])\n","print('len:',len(X_train[23]))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"KnfAYV9e0mym","executionInfo":{"status":"ok","timestamp":1765983620380,"user_tz":-180,"elapsed":39,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"165ae9e5-07c1-45f6-81ff-6a54f631277b"},"execution_count":8,"outputs":[{"output_type":"stream","name":"stdout","text":["[1, 14, 20, 9, 290, 149, 48, 25, 358, 2, 120, 318, 302, 50, 26, 49, 221, 2057, 10, 10, 1212, 39, 15, 45, 801, 2, 2, 363, 2396, 7, 2, 209, 2327, 283, 8, 4, 425, 10, 10, 45, 24, 290, 3613, 972, 4, 65, 198, 40, 3462, 1224, 2, 23, 6, 4457, 225, 24, 76, 50, 8, 895, 19, 45, 164, 204, 5, 24, 55, 318, 38, 92, 140, 11, 18, 4, 65, 33, 32, 43, 168, 33, 4, 302, 10, 10, 17, 47, 77, 1046, 12, 188, 6, 117, 2, 33, 4, 130, 2, 4, 2, 7, 87, 3709, 2199, 7, 35, 2504, 5, 33, 211, 320, 2504, 132, 190, 48, 25, 2754, 4, 1273, 2, 45, 6, 1682, 8, 2, 42, 24, 8, 2, 10, 10, 32, 11, 32, 45, 6, 542, 3709, 22, 290, 319, 18, 15, 1288, 5, 15, 584]\n","len: 146\n"]}]},{"cell_type":"code","source":["review_as_text = ' '.join(id_to_word[id] for id in X_train[23])\n","print(review_as_text)\n","print('len:',len(review_as_text))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eFf0XX2b0_Na","executionInfo":{"status":"ok","timestamp":1765983653187,"user_tz":-180,"elapsed":8,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"49af7bce-a738-4b08-a35a-667b0cd699f8"},"execution_count":9,"outputs":[{"output_type":"stream","name":"stdout","text":[" this movie is worth watching if you enjoy over special effects there are some interesting visuals br br aside from that it's typical hollywood fare of without substance true to the title br br it's not worth picking apart the story that's like performing brain on a dinosaur there's not much there to begin with it's nothing original and not very special so don't go in for the story at all just look at the effects br br as has been mentioned it got a little at the end the of great fx treatment of an invisible and at times half invisible man however if you ignore the standard it's a sight to or not to br br all in all it's a decent fx film worth seeing for that purpose and that alone\n","len: 763\n"]}]},{"cell_type":"code","source":["print('MAX Len: ',len(max(X_train, key=len)))\n","print('MIN Len: ',len(min(X_train, key=len)))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"yqXFOWGa1E0j","executionInfo":{"status":"ok","timestamp":1765983671908,"user_tz":-180,"elapsed":9,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"ab5edfa3-f814-4f1f-b09c-61d1027a655b"},"execution_count":10,"outputs":[{"output_type":"stream","name":"stdout","text":["MAX Len: 2494\n","MIN Len: 11\n"]}]},{"cell_type":"code","source":["# предобработка данных\n","from tensorflow.keras.utils import pad_sequences\n","max_words = 500\n","X_train = pad_sequences(X_train, maxlen=max_words, value=0, padding='pre', truncating='post')\n","X_test = pad_sequences(X_test, maxlen=max_words, value=0, padding='pre', truncating='post')"],"metadata":{"id":"o89GWgu51KkF","executionInfo":{"status":"ok","timestamp":1765983696841,"user_tz":-180,"elapsed":1297,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}}},"execution_count":11,"outputs":[]},{"cell_type":"code","source":["print('MAX Len: ',len(max(X_train, key=len)))\n","print('MIN Len: ',len(min(X_train, key=len)))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"t-HAPdSq1MxI","executionInfo":{"status":"ok","timestamp":1765983703497,"user_tz":-180,"elapsed":2,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"57f5f920-e872-4d8b-ba8d-b01e60089253"},"execution_count":12,"outputs":[{"output_type":"stream","name":"stdout","text":["MAX Len: 500\n","MIN Len: 500\n"]}]},{"cell_type":"code","source":["print(X_train[23])\n","print('len:',len(X_train[23]))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"pFijUmIL1N3o","executionInfo":{"status":"ok","timestamp":1765983717854,"user_tz":-180,"elapsed":15,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"7fde05fe-3d14-4946-b2c9-61495d2cc387"},"execution_count":13,"outputs":[{"output_type":"stream","name":"stdout","text":["[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 1 14 20 9 290 149 48 25 358 2\n"," 120 318 302 50 26 49 221 2057 10 10 1212 39 15 45\n"," 801 2 2 363 2396 7 2 209 2327 283 8 4 425 10\n"," 10 45 24 290 3613 972 4 65 198 40 3462 1224 2 23\n"," 6 4457 225 24 76 50 8 895 19 45 164 204 5 24\n"," 55 318 38 92 140 11 18 4 65 33 32 43 168 33\n"," 4 302 10 10 17 47 77 1046 12 188 6 117 2 33\n"," 4 130 2 4 2 7 87 3709 2199 7 35 2504 5 33\n"," 211 320 2504 132 190 48 25 2754 4 1273 2 45 6 1682\n"," 8 2 42 24 8 2 10 10 32 11 32 45 6 542\n"," 3709 22 290 319 18 15 1288 5 15 584]\n","len: 500\n"]}]},{"cell_type":"code","source":["review_as_text = ' '.join(id_to_word[id] for id in X_train[23])\n","print(review_as_text)\n","print('len:',len(review_as_text))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"SJ0r-p8l1Sv4","executionInfo":{"status":"ok","timestamp":1765983767943,"user_tz":-180,"elapsed":15,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"42d68b4c-dcdc-43cb-81a6-34a6570d9aaa"},"execution_count":17,"outputs":[{"output_type":"stream","name":"stdout","text":[" this movie is worth watching if you enjoy over special effects there are some interesting visuals br br aside from that it's typical hollywood fare of without substance true to the title br br it's not worth picking apart the story that's like performing brain on a dinosaur there's not much there to begin with it's nothing original and not very special so don't go in for the story at all just look at the effects br br as has been mentioned it got a little at the end the of great fx treatment of an invisible and at times half invisible man however if you ignore the standard it's a sight to or not to br br all in all it's a decent fx film worth seeing for that purpose and that alone\n","len: 2887\n"]}]},{"cell_type":"code","source":["# вывод данных\n","print('X train: \\n',X_train)\n","print('X train: \\n',X_test)\n","\n","# вывод размерностей\n","print('Shape of X train:', X_train.shape)\n","print('Shape of X test:', X_test.shape)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"hsbobKXb1dL0","executionInfo":{"status":"ok","timestamp":1765983790872,"user_tz":-180,"elapsed":19,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"9813b826-988d-46f1-aa98-9a82faa8fae4"},"execution_count":18,"outputs":[{"output_type":"stream","name":"stdout","text":["X train: \n"," [[ 0 0 0 ... 6 52 106]\n"," [ 0 0 0 ... 87 22 231]\n"," [ 0 0 0 ... 6 158 158]\n"," ...\n"," [ 0 0 0 ... 1005 4 1630]\n"," [ 0 0 0 ... 9 6 991]\n"," [ 0 0 0 ... 7 32 58]]\n","X train: \n"," [[ 0 0 0 ... 4 2 2]\n"," [ 0 0 0 ... 6 2 123]\n"," [ 0 0 0 ... 2 11 831]\n"," ...\n"," [ 1 14 402 ... 819 45 131]\n"," [ 0 0 0 ... 17 1540 2]\n"," [ 1 17 6 ... 1026 362 37]]\n","Shape of X train: (25000, 500)\n","Shape of X test: (25000, 500)\n"]}]},{"cell_type":"code","source":["embed_dim = 32\n","lstm_units = 64\n","\n","model = Sequential()\n","model.add(layers.Embedding(input_dim=vocabulary_size, output_dim=embed_dim, input_length=max_words, input_shape=(max_words,)))\n","model.add(layers.LSTM(lstm_units))\n","model.add(layers.Dropout(0.5))\n","model.add(layers.Dense(1, activation='sigmoid'))\n","\n","model.summary()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":363},"id":"cgVZk2R81nLO","executionInfo":{"status":"ok","timestamp":1765983814420,"user_tz":-180,"elapsed":1762,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"95e38ad5-7969-415d-9fd3-ad36221ee7ce"},"execution_count":19,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.12/dist-packages/keras/src/layers/core/embedding.py:97: UserWarning: Argument `input_length` is deprecated. Just remove it.\n"," warnings.warn(\n","/usr/local/lib/python3.12/dist-packages/keras/src/layers/core/embedding.py:100: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n"," super().__init__(**kwargs)\n"]},{"output_type":"display_data","data":{"text/plain":["\u001b[1mModel: \"sequential\"\u001b[0m\n"],"text/html":["
Model: \"sequential\"\n","
\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n","┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n","┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n","│ embedding (\u001b[38;5;33mEmbedding\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m500\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m160,000\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ lstm (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m24,832\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m65\u001b[0m │\n","└─────────────────────────────────┴────────────────────────┴───────────────┘\n"],"text/html":["
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n","┃ Layer (type)                     Output Shape                  Param # ┃\n","┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n","│ embedding (Embedding)           │ (None, 500, 32)        │       160,000 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ lstm (LSTM)                     │ (None, 64)             │        24,832 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ dropout (Dropout)               │ (None, 64)             │             0 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ dense (Dense)                   │ (None, 1)              │            65 │\n","└─────────────────────────────────┴────────────────────────┴───────────────┘\n","
\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["\u001b[1m Total params: \u001b[0m\u001b[38;5;34m184,897\u001b[0m (722.25 KB)\n"],"text/html":["
 Total params: 184,897 (722.25 KB)\n","
\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m184,897\u001b[0m (722.25 KB)\n"],"text/html":["
 Trainable params: 184,897 (722.25 KB)\n","
\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"],"text/html":["
 Non-trainable params: 0 (0.00 B)\n","
\n"]},"metadata":{}}]},{"cell_type":"code","source":["# компилируем и обучаем модель\n","batch_size = 64\n","epochs = 3\n","model.compile(loss=\"binary_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"])\n","model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.2)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"GTLaDqUc1qES","executionInfo":{"status":"ok","timestamp":1765983854527,"user_tz":-180,"elapsed":24070,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"524a1871-22c0-4d7b-bc92-3c35695e458a"},"execution_count":20,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1/3\n","\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m11s\u001b[0m 22ms/step - accuracy: 0.6255 - loss: 0.6261 - val_accuracy: 0.8294 - val_loss: 0.3905\n","Epoch 2/3\n","\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 21ms/step - accuracy: 0.8643 - loss: 0.3334 - val_accuracy: 0.8626 - val_loss: 0.3467\n","Epoch 3/3\n","\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 19ms/step - accuracy: 0.8877 - loss: 0.2905 - val_accuracy: 0.8722 - val_loss: 0.3317\n"]},{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":20}]},{"cell_type":"code","source":["test_loss, test_acc = model.evaluate(X_test, y_test)\n","print(f\"\\nTest accuracy: {test_acc}\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"x1suf0Ja1zHn","executionInfo":{"status":"ok","timestamp":1765983869364,"user_tz":-180,"elapsed":7401,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"a7802332-5719-4270-f626-1526a64531b9"},"execution_count":21,"outputs":[{"output_type":"stream","name":"stdout","text":["\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.8640 - loss: 0.3313\n","\n","Test accuracy: 0.8622000217437744\n"]}]},{"cell_type":"code","source":["#значение метрики качества классификации на тестовых данных\n","print(f\"\\nTest accuracy: {test_acc}\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"2v7LKydR2Bjs","executionInfo":{"status":"ok","timestamp":1765983940438,"user_tz":-180,"elapsed":48,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"8235b522-9545-4313-f5a1-59ef89873352"},"execution_count":22,"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Test accuracy: 0.8622000217437744\n"]}]},{"cell_type":"code","source":["#отчет о качестве классификации тестовой выборки\n","y_score = model.predict(X_test)\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":{"colab":{"base_uri":"https://localhost:8080/"},"id":"vvZxAYYg2Hr1","executionInfo":{"status":"ok","timestamp":1765983962172,"user_tz":-180,"elapsed":10700,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"0951f090-e463-4ea3-afd5-edc55e4b2bc8"},"execution_count":23,"outputs":[{"output_type":"stream","name":"stdout","text":["\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 12ms/step\n"," precision recall f1-score support\n","\n"," Negative 0.83 0.91 0.87 12500\n"," Positive 0.90 0.81 0.86 12500\n","\n"," accuracy 0.86 25000\n"," macro avg 0.87 0.86 0.86 25000\n","weighted avg 0.87 0.86 0.86 25000\n","\n"]}]},{"cell_type":"code","source":["#построение ROC-кривой и AUC ROC\n","from sklearn.metrics import roc_curve, auc\n","\n","fpr, tpr, thresholds = roc_curve(y_test, y_score)\n","plt.plot(fpr, tpr)\n","plt.grid()\n","plt.xlabel('False Positive Rate')\n","plt.ylabel('True Positive Rate')\n","plt.title('ROC')\n","plt.show()\n","print('AUC ROC:', auc(fpr, tpr))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":490},"id":"7IGX_vWY20SC","executionInfo":{"status":"ok","timestamp":1765984128331,"user_tz":-180,"elapsed":618,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"c6f239e9-1b43-4ac5-9f8b-22950df9bf9e"},"execution_count":24,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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r1749ddfba9v374dAwcOhJ+fH+Li4vDEE0+gvLz8srUpFApERUUhJiYGt9xyC5544gls3rwZlZWVkCQJzz//PFq2bAmdTofu3btjw4YNtm1NJhOSk5MRHR0NvV6Pa665BmlpaXb7rj0t1bp1awBAjx49oFAocNNNNwGwPxry7rvvIiYmxm4WbgC48847cf/999uef/311+jZsyf0ej3atGmDuXPnorq6+rKfU61WIyoqCrGxsUhMTMSoUaOQkZFhe91iseCBBx5A69at4efnhw4dOmDRokW215977jl8+OGH+Prrr21HgbZu3QoAOHHiBEaPHo3Q0FA0a9YMd955J44fP37Zeoh8BcMNkY9RKpX473//iz/++AMffvghvvvuOzzzzDOXXH/cuHFo2bIldu/ejT179mD69OnQaDQAgGPHjmH48OG4++678dtvv2H16tXYvn07kpOTHarJz88PkiShuroaixYtwuuvv47XXnsNv/32G5KSknDHHXfgzz//BAD897//xdq1a/Hpp58iKysLH3/8MeLj4+vd765duwAAmzdvRl5eHr744os664waNQrnzp3D999/b1tWVFSEDRs2YNy4cQCAbdu2YcKECZgyZQoOHjyId955B+np6XjppZca/BmPHz+OjRs3QqvV2pZJkoSWLVtizZo1OHjwIObMmYOZM2fi008/BQBMnToVo0ePxvDhw5GXl4e8vDz0798fZrMZSUlJCAoKwrZt27Bjxw4EBgZi+PDhMJlMDa6JyGu5fGpOInK7iRMnCpVKJQICAmx/7rnnnnrXXbNmjWjevLnt+QcffCBCQkJsz4OCgkR6enq92z7wwAPioYceslu2bds2oVQqRWVlZb3b/H3/R44cEe3btxe9e/cWQggRExMjXnrpJbttrr/+evHoo48KIYR4/PHHxZAhQ4QkSfXuH4D48ssvhRBC5OTkCABi3759duv8fUbzO++8U9x///225++8846IiYkRFotFCCHEzTffLObNm2e3jxUrVojo6Oh6axBCiNTUVKFUKkVAQIDQ6/W22ZMXLFhwyW2EEOKxxx4Td9999yVrrX3vDh062PXAaDQKPz8/sXHjxsvun8gXcMwNkZcaPHgw/ve//9meBwQEALAexUhLS8Phw4dhMBhQXV2NqqoqVFRUwN/fv85+UlJS8OCDD2LFihW2Uytt27YFYD1l9dtvv+Hjjz+2rS+EgCRJyMnJQadOneqtraSkBIGBgZAkCVVVVbjhhhuwdOlSGAwGnD59GgMGDLBbf8CAAdi/fz8A6ymloUOHokOHDhg+fDhuv/12DBs27Kp6NW7cOEyePBlvv/02dDodPv74Y/zrX/+CUqm0fc4dO3bYHamxWCyX7RsAdOjQAWvXrkVVVRU++ugjZGZm4vHHH7dbZ/HixVi2bBlyc3NRWVkJk8mE7t27X7be/fv34+jRowgKCrJbXlVVhWPHjjWiA0TeheGGyEsFBASgXbt2dsuOHz+O22+/HY888gheeuklNGvWDNu3b8cDDzwAk8lU75f0c889h7Fjx2LdunX49ttvkZqailWrVuGf//wnysrK8O9//xtPPPFEne1atWp1ydqCgoKwd+9eKJVKREdHw8/PDwBgMBiu+Ll69uyJnJwcfPvtt9i8eTNGjx6NxMREfPbZZ1fc9lJGjBgBIQTWrVuH66+/Htu2bcMbb7xhe72srAxz587FXXfdVWdbvV5/yf1qtVrb38HLL7+M2267DXPnzsULL7wAAFi1ahWmTp2K119/Hf369UNQUBDmz5+PX3755bL1lpWVoVevXnahslZTGTROJCeGGyIfsmfPHkiShNdff912VKJ2fMfltG/fHu3bt8eTTz6Je++9Fx988AH++c9/omfPnjh48GCdEHUlSqWy3m2Cg4MRExODHTt2YNCgQbblO3bsQJ8+fezWGzNmDMaMGYN77rkHw4cPR1FREZo1a2a3v9rxLRaL5bL16PV63HXXXfj4449x9OhRdOjQAT179rS93rNnT2RlZTn8Of9u1qxZGDJkCB555BHb5+zfvz8effRR2zp/P/Ki1Wrr1N+zZ0+sXr0aERERCA4OvqqaiLwRBxQT+ZB27drBbDbjzTffRHZ2NlasWIElS5Zccv3KykokJydj69at+Ouvv7Bjxw7s3r3bdrpp2rRp+Omnn5CcnIzMzEz8+eef+Prrrx0eUHyxp59+Gq+88gpWr16NrKwsTJ8+HZmZmZgyZQoAYMGCBfjkk09w+PBhHDlyBGvWrEFUVFS9Nx6MiIiAn58fNmzYgIKCApSUlFzyfceNG4d169Zh2bJltoHEtebMmYPly5dj7ty5+OOPP3Do0CGsWrUKs2bNcuiz9evXD127dsW8efMAANdeey1+/fVXbNy4EUeOHMHs2bOxe/duu23i4+Px22+/ISsrC4WFhTCbzRg3bhzCw8Nx5513Ytu2bcjJycHWrVvxxBNP4OTJkw7VROSV5B70Q0TOV98g1FoLFiwQ0dHRws/PTyQlJYnly5cLAOL8+fNCCPsBv0ajUfzrX/8ScXFxQqvVipiYGJGcnGw3WHjXrl1i6NChIjAwUAQEBIiuXbvWGRB8sb8PKP47i8UinnvuOREbGys0Go3o1q2b+Pbbb22vv/vuu6J79+4iICBABAcHi5tvvlns3bvX9jouGlAshBDvvfeeiIuLE0qlUgwaNOiS/bFYLCI6OloAEMeOHatT14YNG0T//v2Fn5+fCA4OFn369BHvvvvuJT9Hamqq6NatW53ln3zyidDpdCI3N1dUVVWJ++67T4SEhIjQ0FDxyCOPiOnTp9ttd+bMGVt/AYjvv/9eCCFEXl6emDBhgggPDxc6nU60adNGTJ48WZSUlFyyJiJfoRBCCHnjFREREZHz8LQUEREReRWGGyIiIvIqDDdERETkVRhuiIiIyKsw3BAREZFXYbghIiIir8JwQ0RERF6F4YaIiIi8CsMNEREReRWGGyIiIvIqDDdERETkVRhuiIiIyKv8fz1oc0+wRXZPAAAAAElFTkSuQmCC\n"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["AUC ROC: 0.9370553728000001\n"]}]}]} \ No newline at end of file diff --git a/labworks/LW4/report4.md b/labworks/LW4/report4.md new file mode 100644 index 0000000..95555bb --- /dev/null +++ b/labworks/LW4/report4.md @@ -0,0 +1,315 @@ +# Отчёт по лабораторной работе №4 + +### Киселёв Матвей, Мамедов Расул А-01-22 +### Вариант 6 + +### 1) В среде Google Colab создать новый блокнот (notebook). Настроить блокнот для работы с аппаратным ускорителем GPU. +```python +# импорт модулей +import os +os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab4') + +from tensorflow import keras +from tensorflow.keras import layers +from tensorflow.keras.models import Sequential +import matplotlib.pyplot as plt +import numpy as np +``` +```python +import tensorflow as tf +device_name = tf.test.gpu_device_name() +if device_name != '/device:GPU:0': + raise SystemError('GPU device not found') +print('Found GPU at: {}'.format(device_name)) +``` +``` +Found GPU at: /device:GPU:0 +``` + +### 2) Загрузить набор данных IMDb, содержащий оцифрованные отзывы на фильмы, размеченные на два класса: позитивные и негативные. При загрузке набора данных параметр seed выбрать равным (4k – 1), где k – номер бригады. Вывести размеры полученных обучающих и тестовых массивов данных. + +```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=23, + start_char=1, + oov_char=2, + index_from=index_from + ) + +# вывод размерностей +print('Shape of X train:', X_train.shape) +print('Shape of y train:', y_train.shape) +print('Shape of X test:', X_test.shape) +print('Shape of y test:', y_test.shape) +``` +``` +Shape of X train: (25000,) +Shape of y train: (25000,) +Shape of X test: (25000,) +Shape of y test: (25000,) +``` + +### 3) Вывести один отзыв из обучающего множества в виде списка индексов слов. Преобразовать список индексов в текст и вывести отзыв в виде текста. Вывести длину отзыва. Вывести метку класса данного отзыва и название класса (1 – Positive, 0 – Negative). + +```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[""] = 0 +word_to_id[""] = 1 +word_to_id[""] = 2 +word_to_id[""] = 3 +# создание обратного словаря "индекс:слово" +id_to_word = {value:key for key,value in word_to_id.items()} +``` +```python +print(X_train[23]) +print('len:',len(X_train[23])) +``` +``` +[1, 14, 20, 9, 290, 149, 48, 25, 358, 2, 120, 318, 302, 50, 26, 49, 221, 2057, 10, 10, 1212, 39, 15, 45, 801, 2, 2, 363, 2396, 7, 2, 209, 2327, 283, 8, 4, 425, 10, 10, 45, 24, 290, 3613, 972, 4, 65, 198, 40, 3462, 1224, 2, 23, 6, 4457, 225, 24, 76, 50, 8, 895, 19, 45, 164, 204, 5, 24, 55, 318, 38, 92, 140, 11, 18, 4, 65, 33, 32, 43, 168, 33, 4, 302, 10, 10, 17, 47, 77, 1046, 12, 188, 6, 117, 2, 33, 4, 130, 2, 4, 2, 7, 87, 3709, 2199, 7, 35, 2504, 5, 33, 211, 320, 2504, 132, 190, 48, 25, 2754, 4, 1273, 2, 45, 6, 1682, 8, 2, 42, 24, 8, 2, 10, 10, 32, 11, 32, 45, 6, 542, 3709, 22, 290, 319, 18, 15, 1288, 5, 15, 584] +len: 146 +``` +```python +review_as_text = ' '.join(id_to_word[id] for id in X_train[23]) +print(review_as_text) +print('len:',len(review_as_text)) +``` +``` + this movie is worth watching if you enjoy over special effects there are some interesting visuals br br aside from that it's typical hollywood fare of without substance true to the title br br it's not worth picking apart the story that's like performing brain on a dinosaur there's not much there to begin with it's nothing original and not very special so don't go in for the story at all just look at the effects br br as has been mentioned it got a little at the end the of great fx treatment of an invisible and at times half invisible man however if you ignore the standard it's a sight to or not to br br all in all it's a decent fx film worth seeing for that purpose and that alone +len: 763 +``` + + +### 4) Вывести максимальную и минимальную длину отзыва в обучающем множестве. + +```python +print('MAX Len: ',len(max(X_train, key=len))) +print('MIN Len: ',len(min(X_train, key=len))) +``` +``` +MAX Len: 2494 +MIN Len: 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('MAX Len: ',len(max(X_train, key=len))) +print('MIN Len: ',len(min(X_train, key=len))) +``` +``` +MAX Len: 500 +MIN Len: 500 +``` + +### 7) Повторить п. 3. Сделать вывод о том, как отзыв преобразовался после предобработки. +```python +print(X_train[23]) +print('len:',len(X_train[23])) +``` +``` +[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 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 14 20 9 290 149 48 25 358 2 + 120 318 302 50 26 49 221 2057 10 10 1212 39 15 45 + 801 2 2 363 2396 7 2 209 2327 283 8 4 425 10 + 10 45 24 290 3613 972 4 65 198 40 3462 1224 2 23 + 6 4457 225 24 76 50 8 895 19 45 164 204 5 24 + 55 318 38 92 140 11 18 4 65 33 32 43 168 33 + 4 302 10 10 17 47 77 1046 12 188 6 117 2 33 + 4 130 2 4 2 7 87 3709 2199 7 35 2504 5 33 + 211 320 2504 132 190 48 25 2754 4 1273 2 45 6 1682 + 8 2 42 24 8 2 10 10 32 11 32 45 6 542 + 3709 22 290 319 18 15 1288 5 15 584] +len: 500 +``` + +```python +review_as_text = ' '.join(id_to_word[id] for id in X_train[23]) +print(review_as_text) +print('len:',len(review_as_text)) +``` +``` + + + this movie is worth watching if you enjoy over special effects there are some interesting visuals br br aside from that it's typical hollywood fare of without substance true to the title br br it's not worth picking apart the story that's like performing brain on a dinosaur there's not much there to begin with it's nothing original and not very special so don't go in for the story at all just look at the effects br br as has been mentioned it got a little at the end the of great fx treatment of an invisible and at times half invisible man however if you ignore the standard it's a sight to or not to br br all in all it's a decent fx film worth seeing for that purpose and that alone +len: 2887 + +``` +### В начало отзыва добавились токены PAD в количестве, необходимом для достижения длины в 500 индексов. + +### 8) Вывести предобработанные массивы обучающих и тестовых данных и их размерности. + +```python +# вывод данных +print('X train: \n',X_train) +print('X train: \n',X_test) + +# вывод размерностей +print('Shape of X train:', X_train.shape) +print('Shape of X test:', X_test.shape) +``` +``` +X train: + [[ 0 0 0 ... 6 52 106] + [ 0 0 0 ... 87 22 231] + [ 0 0 0 ... 6 158 158] + ... + [ 0 0 0 ... 1005 4 1630] + [ 0 0 0 ... 9 6 991] + [ 0 0 0 ... 7 32 58]] +X train: + [[ 0 0 0 ... 4 2 2] + [ 0 0 0 ... 6 2 123] + [ 0 0 0 ... 2 11 831] + ... + [ 1 14 402 ... 819 45 131] + [ 0 0 0 ... 17 1540 2] + [ 1 17 6 ... 1026 362 37]] +Shape of X train: (25000, 500) +Shape of X test: (25000, 500) + +``` + +### 9) Реализовать модель рекуррентной нейронной сети, состоящей из слоев Embedding, LSTM, Dropout, Dense, и обучить ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывести информацию об архитектуре нейронной сети. Добиться качества обучения по метрике accuracy не менее 0.8. + +```python +embed_dim = 32 +lstm_units = 64 + +model = Sequential() +model.add(layers.Embedding(input_dim=vocabulary_size, output_dim=embed_dim, input_length=max_words, input_shape=(max_words,))) +model.add(layers.LSTM(lstm_units)) +model.add(layers.Dropout(0.5)) +model.add(layers.Dense(1, activation='sigmoid')) + +model.summary() +``` +![picture](1.png) + +```python +# компиляция и обучение модели +batch_size = 64 +epochs = 3 +model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) +model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.2) +``` +``` +Epoch 1/3 +313/313 ━━━━━━━━━━━━━━━━━━━━ 11s 22ms/step - accuracy: 0.6255 - loss: 0.6261 - val_accuracy: 0.8294 - val_loss: 0.3905 +Epoch 2/3 +313/313 ━━━━━━━━━━━━━━━━━━━━ 6s 21ms/step - accuracy: 0.8643 - loss: 0.3334 - val_accuracy: 0.8626 - val_loss: 0.3467 +Epoch 3/3 +313/313 ━━━━━━━━━━━━━━━━━━━━ 6s 19ms/step - accuracy: 0.8877 - loss: 0.2905 - val_accuracy: 0.8722 - val_loss: 0.3317 + + +``` +```python +test_loss, test_acc = model.evaluate(X_test, y_test) +print(f"\nTest accuracy: {test_acc}") +``` +``` +782/782 ━━━━━━━━━━━━━━━━━━━━ 7s 9ms/step - accuracy: 0.8640 - loss: 0.3313 + +Test accuracy: 0.8622000217437744 +``` + +### 10) Оценить качество обучения на тестовых данных: +### - вывести значение метрики качества классификации на тестовых данных, +### - вывести отчет о качестве классификации тестовой выборки. +### - построить ROC-кривую по результату обработки тестовой выборки и вычислить площадь под ROC-кривой (AUC ROC). + +```python +#значение метрики качества классификации на тестовых данных +print(f"\nTest accuracy: {test_acc}") +``` +``` +Test accuracy: 0.8622000217437744 +``` + +```python +#отчет о качестве классификации тестовой выборки +y_score = model.predict(X_test) +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'])) +``` +``` + precision recall f1-score support + + Negative 0.83 0.91 0.87 12500 + Positive 0.90 0.81 0.86 12500 + + accuracy 0.86 25000 + macro avg 0.87 0.86 0.86 25000 +weighted avg 0.87 0.86 0.86 25000 +``` + +```python +#построение ROC-кривой и AUC ROC +from sklearn.metrics import roc_curve, auc + +fpr, tpr, thresholds = roc_curve(y_test, y_score) +plt.plot(fpr, tpr) +plt.grid() +plt.xlabel('False Positive Rate') +plt.ylabel('True Positive Rate') +plt.title('ROC') +plt.show() +print('AUC ROC:', auc(fpr, tpr)) +``` +![picture](2.png) +``` +AUC ROC: 0.9370553728000001 +``` + +### 11) Сделать выводы по результатам применения рекуррентной нейронной сети для решения задачи определения тональности текста. + +### Показатель accuracy превышает требуемый порог 0.8, а значение AUC ROC > 0.9 показывает высокую способность модели различать два класса. Таким образом, рекуррентная нейронная сеть хорошо справилась с задачей определения тональности текста. \ No newline at end of file