From 962a2015de0513a6023f4327b1af3955920dbdaa Mon Sep 17 00:00:00 2001 From: "Bob(ArtyushinaVV)" Date: Wed, 10 Dec 2025 11:44:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=82=D1=87=D0=B5=D1=82=D0=B0,=20?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BA=D0=BD=D0=BE=D1=82=D0=B0=20=D0=B8=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- labworks/LW4/1_p10.png | Bin 0 -> 21060 bytes labworks/LW4/1_p9.png | Bin 0 -> 20053 bytes labworks/LW4/is_lab4.ipynb | 869 +++++++++++++++++++++++++++++++++++++ labworks/LW4/report.md | 325 ++++++++++++++ 4 files changed, 1194 insertions(+) create mode 100644 labworks/LW4/1_p10.png create mode 100644 labworks/LW4/1_p9.png create mode 100644 labworks/LW4/is_lab4.ipynb create mode 100644 labworks/LW4/report.md diff --git a/labworks/LW4/1_p10.png b/labworks/LW4/1_p10.png new file mode 100644 index 0000000000000000000000000000000000000000..74b97ff49f38e8e2970f65ea0548f9011b2a6452 GIT binary patch literal 21060 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 literal 0 HcmV?d00001 diff --git a/labworks/LW4/1_p9.png b/labworks/LW4/1_p9.png new file mode 100644 index 0000000000000000000000000000000000000000..1235e7a6e0f8365936dde33c82495e2d5f0e071b GIT binary patch literal 20053 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 literal 0 HcmV?d00001 diff --git a/labworks/LW4/is_lab4.ipynb b/labworks/LW4/is_lab4.ipynb new file mode 100644 index 0000000..d039d99 --- /dev/null +++ b/labworks/LW4/is_lab4.ipynb @@ -0,0 +1,869 @@ +{ + "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": "markdown", + "source": [ + "### 1) В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули. Настроили блокнот для работы с аппаратным ускорителем GPU." + ], + "metadata": { + "id": "gz18QPRz03Ec" + } + }, + { + "cell_type": "code", + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/drive')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rrZujwYe0bon", + "outputId": "20871566-ff68-40ea-c75e-c8462d282a25" + }, + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Mounted at /content/drive\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# импорт модулей\n", + "import os\n", + "os.mkdir('/content/drive/MyDrive/Colab Notebooks/is_lab4')\n", + "os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab4')\n", + "\n", + "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" + ], + "metadata": { + "id": "mr9IszuQ1ANG" + }, + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "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": "o63-lKG_RuNc", + "outputId": "b82bed4a-c142-4223-b073-5906c07bd3a8" + }, + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Found GPU at: /device:GPU:0\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### 2) Загрузили набор данных IMDb, содержащий оцифрованные отзывы на фильмы, размеченные на два класса: позитивные и негативные. При загрузке набора данных параметр seed выбрали равным значению (4k – 1)=15, где k=4 – номер бригады. Вывели размеры полученных обучающих и тестовых массивов данных." + ], + "metadata": { + "id": "FFRtE0TN1AiA" + } + }, + { + "cell_type": "code", + "source": [ + "# загрузка датасета\n", + "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=15,\n", + " start_char=1,\n", + " oov_char=2,\n", + " index_from=index_from\n", + " )\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": { + "id": "Ixw5Sp0_1A-w", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "270a0783-e583-4feb-aeba-991bd5d220c2" + }, + "execution_count": 6, + "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": "markdown", + "source": [ + "### 3) Вывели один отзыв из обучающего множества в виде списка индексов слов. Преобразовали список индексов в текст и вывели отзыв в виде текста. Вывели длину отзыва. Вывели метку класса данного отзыва и название класса (1 – Positive, 0 – Negative)." + ], + "metadata": { + "id": "aCo_lUXl1BPV" + } + }, + { + "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()}" + ], + "metadata": { + "id": "9W3RklPcZyH0", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "d3dbd233-890c-40e8-b669-3585c80d3ef7" + }, + "execution_count": 7, + "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[26])\n", + "print('len:',len(X_train[26]))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Nu-Bs1jnaYhB", + "outputId": "2625802e-784b-4300-9cd7-9b3aba751900" + }, + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[1, 608, 17, 316, 47, 3381, 46, 14, 22, 9, 6, 601, 912, 8, 49, 2461, 14, 9, 88, 12, 16, 6, 2207, 2, 22, 15, 69, 6, 176, 7, 819, 2, 42, 2, 180, 8, 751, 2, 8, 1090, 4, 2, 1745, 675, 21, 4, 22, 47, 111, 85, 1508, 17, 73, 10, 10, 8, 895, 19, 4, 2, 186, 8, 28, 188, 27, 2, 5, 2109, 1849, 56, 4, 2, 11, 14, 22, 26, 2, 5, 92, 40, 3390, 21, 11, 175, 85, 1161, 36, 4486, 40, 2109, 150, 25, 43, 191, 81, 15, 19, 6, 2136, 512, 509, 874, 188, 8, 1231, 8, 4, 2269, 7, 4, 512, 42, 4, 451, 79, 32, 1471, 5, 3222, 34, 2, 2793, 11, 4, 355, 155, 11, 192, 4, 226, 1499, 5, 862, 1353, 114, 9, 142, 15, 47, 460, 77, 224, 18, 2109, 21, 152, 97, 101, 281, 11, 6, 1985, 20, 10, 10, 4129, 4, 1985, 1352, 26, 4, 2, 25, 28, 126, 110, 1814, 11, 4, 1985, 20, 970, 3882, 8, 124, 15, 4, 1985, 1352, 5, 2, 26, 142, 4, 451, 2, 2, 246, 49, 7, 134, 2, 26, 43, 1044, 2968, 10, 10, 50, 26, 6, 378, 7, 1076, 52, 1801, 13, 165, 179, 423, 4, 603, 409, 28, 1046, 2, 2, 2, 5, 10, 10, 1361, 48, 141, 6, 155, 70, 1778, 10, 10, 13, 82, 179, 423, 4, 1347, 18, 2, 4, 2, 2, 50, 26, 38, 111, 189, 102, 15, 2, 23, 105, 2, 2, 21, 11, 14, 420, 36, 86, 2, 6, 55, 2, 5, 1134, 1210, 1985, 2, 5, 140, 4682, 4, 1939, 13, 384, 25, 70, 516, 2, 19, 3390, 3589, 5, 75, 28, 49, 184, 976, 2, 134, 504, 1616, 30, 99, 254, 8, 276, 107, 5, 107, 295, 2, 21, 11, 801, 405, 14, 20, 271, 120, 4, 350, 5, 1608, 49, 85, 55, 2, 5, 1139, 1210, 2, 2872]\n", + "len: 323\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "review_as_text = ' '.join(id_to_word[id] for id in X_train[26])\n", + "print(review_as_text)\n", + "print('len:',len(review_as_text))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JhTwTurtZ6Sp", + "outputId": "61d0bc9b-681f-49b4-b917-d8ce7936d3d3" + }, + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " ok as everyone has pointed out this film is a complete dog to some degree this is because it was a gory film that had a lot of material or down to near to escape the x rating but the film has many other flaws as well br br to begin with the seems to have got his and vampires mixed up the in this film are and don't like silver but in every other respect they behave like vampires now you just can't do that with a crappy genre flick you've got to stick to the rules of the genre or the fans get all confused and annoyed by disbelief in the wrong thing in fact the whole confusing and poorly presented plot is something that has already been done for vampires but doesn't make any sense in a werewolf movie br br secondly the werewolf costumes are the you have ever seen anybody in the werewolf movie business ought to know that the werewolf costumes and are something the fans yet some of these are just plain goofy br br there are a couple of slightly good bits i actually quite liked the score others have mentioned and br br spoiler if such a thing can exist br br i also quite liked the plan for the there are so many horror movies that on characters but in this case they first a very and effective anti werewolf and go slaughter the monsters i mean you can kill with silver bullets and we have some pretty powerful these days shouldn't be too hard to put two and two together but in typical style this movie goes over the top and adds some other very and amusing anti weapons\n", + "len: 1682\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### 4) Вывели максимальную и минимальную длину отзыва в обучающем множестве." + ], + "metadata": { + "id": "4hclnNaD1BuB" + } + }, + { + "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": "xJH87ISq1B9h", + "outputId": "3a90c92e-3f5b-4cb2-a053-5093ed5b2b7f" + }, + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "MAX Len: 2494\n", + "MIN Len: 11\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### 5) Провели предобработку данных. Выбрали единую длину, к которой будут приведены все отзывы. Короткие отзывы дополнили спецсимволами, а длинные обрезали до выбранной длины." + ], + "metadata": { + "id": "7x99O8ig1CLh" + } + }, + { + "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": "lrF-B2aScR4t" + }, + "execution_count": 11, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "### 6) Повторили пункт 4." + ], + "metadata": { + "id": "HL2_LVga1C3l" + } + }, + { + "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": "81Cgq8dn9uL6", + "outputId": "4d135e21-04e3-4a20-fea8-0103b448a00f" + }, + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "MAX Len: 500\n", + "MIN Len: 500\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### 7) Повторили пункт 3. Сделали вывод о том, как отзыв преобразовался после предобработки." + ], + "metadata": { + "id": "KzrVY1SR1DZh" + } + }, + { + "cell_type": "code", + "source": [ + "print(X_train[26])\n", + "print('len:',len(X_train[26]))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "vudlgqoCbjU1", + "outputId": "399d49b8-0e27-4d4d-edf0-c952565c05df" + }, + "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 1 608 17 316 47\n", + " 3381 46 14 22 9 6 601 912 8 49 2461 14 9 88\n", + " 12 16 6 2207 2 22 15 69 6 176 7 819 2 42\n", + " 2 180 8 751 2 8 1090 4 2 1745 675 21 4 22\n", + " 47 111 85 1508 17 73 10 10 8 895 19 4 2 186\n", + " 8 28 188 27 2 5 2109 1849 56 4 2 11 14 22\n", + " 26 2 5 92 40 3390 21 11 175 85 1161 36 4486 40\n", + " 2109 150 25 43 191 81 15 19 6 2136 512 509 874 188\n", + " 8 1231 8 4 2269 7 4 512 42 4 451 79 32 1471\n", + " 5 3222 34 2 2793 11 4 355 155 11 192 4 226 1499\n", + " 5 862 1353 114 9 142 15 47 460 77 224 18 2109 21\n", + " 152 97 101 281 11 6 1985 20 10 10 4129 4 1985 1352\n", + " 26 4 2 25 28 126 110 1814 11 4 1985 20 970 3882\n", + " 8 124 15 4 1985 1352 5 2 26 142 4 451 2 2\n", + " 246 49 7 134 2 26 43 1044 2968 10 10 50 26 6\n", + " 378 7 1076 52 1801 13 165 179 423 4 603 409 28 1046\n", + " 2 2 2 5 10 10 1361 48 141 6 155 70 1778 10\n", + " 10 13 82 179 423 4 1347 18 2 4 2 2 50 26\n", + " 38 111 189 102 15 2 23 105 2 2 21 11 14 420\n", + " 36 86 2 6 55 2 5 1134 1210 1985 2 5 140 4682\n", + " 4 1939 13 384 25 70 516 2 19 3390 3589 5 75 28\n", + " 49 184 976 2 134 504 1616 30 99 254 8 276 107 5\n", + " 107 295 2 21 11 801 405 14 20 271 120 4 350 5\n", + " 1608 49 85 55 2 5 1139 1210 2 2872]\n", + "len: 500\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "review_as_text = ' '.join(id_to_word[id] for id in X_train[26])\n", + "print(review_as_text)\n", + "print('len:',len(review_as_text))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "dbfkWjDI1Dp7", + "outputId": "08d28188-9454-4b3c-ca6b-9ac8654d4a9b" + }, + "execution_count": 14, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " ok as everyone has pointed out this film is a complete dog to some degree this is because it was a gory film that had a lot of material or down to near to escape the x rating but the film has many other flaws as well br br to begin with the seems to have got his and vampires mixed up the in this film are and don't like silver but in every other respect they behave like vampires now you just can't do that with a crappy genre flick you've got to stick to the rules of the genre or the fans get all confused and annoyed by disbelief in the wrong thing in fact the whole confusing and poorly presented plot is something that has already been done for vampires but doesn't make any sense in a werewolf movie br br secondly the werewolf costumes are the you have ever seen anybody in the werewolf movie business ought to know that the werewolf costumes and are something the fans yet some of these are just plain goofy br br there are a couple of slightly good bits i actually quite liked the score others have mentioned and br br spoiler if such a thing can exist br br i also quite liked the plan for the there are so many horror movies that on characters but in this case they first a very and effective anti werewolf and go slaughter the monsters i mean you can kill with silver bullets and we have some pretty powerful these days shouldn't be too hard to put two and two together but in typical style this movie goes over the top and adds some other very and amusing anti weapons\n", + "len: 2744\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "#### После обработки в начало отзыва добавилось необходимое количество токенов , чтобы отзыв был длинной в 500 индексов." + ], + "metadata": { + "id": "mJNRXo5TdPAE" + } + }, + { + "cell_type": "markdown", + "source": [ + "### 8) Вывели предобработанные массивы обучающих и тестовых данных и их размерности." + ], + "metadata": { + "id": "YgiVGr5_1D3u" + } + }, + { + "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": "7MqcG_wl1EHI", + "outputId": "9cd39393-7f4b-4af2-ed1e-01a217eb04ed" + }, + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "X train: \n", + " [[ 0 0 0 ... 4 86 273]\n", + " [ 0 0 0 ... 705 9 150]\n", + " [ 0 0 0 ... 44 12 32]\n", + " ...\n", + " [ 0 0 0 ... 22 8 377]\n", + " [ 0 0 0 ... 4 2554 647]\n", + " [ 0 0 0 ... 2 4 2]]\n", + "X train: \n", + " [[ 0 0 0 ... 106 14 31]\n", + " [ 0 0 0 ... 458 168 52]\n", + " [ 0 0 0 ... 22 6 31]\n", + " ...\n", + " [ 0 0 0 ... 38 76 128]\n", + " [ 0 0 0 ... 73 290 12]\n", + " [ 0 0 0 ... 12 38 76]]\n", + "Shape of X train: (25000, 500)\n", + "Shape of X test: (25000, 500)\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### 9) Реализовали модель рекуррентной нейронной сети, состоящей из слоев Embedding, LSTM, Dropout, Dense, и обучили ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывели информацию об архитектуре нейронной сети. Добились качества обучения по метрике accuracy не менее 0.8." + ], + "metadata": { + "id": "amaspXGW1EVy" + } + }, + { + "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": 346 + }, + "id": "ktWEeqWd1EyF", + "outputId": "70c15204-d21f-4871-b5c7-26aebd8bdf67" + }, + "execution_count": 16, + "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": "CuPqKpX0kQfP", + "outputId": "1844c134-442a-4052-aea5-a94e660c20b5" + }, + "execution_count": 17, + "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[1m12s\u001b[0m 23ms/step - accuracy: 0.6328 - loss: 0.6075 - val_accuracy: 0.7826 - val_loss: 0.4588\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.8121 - loss: 0.4143 - val_accuracy: 0.8628 - val_loss: 0.3359\n", + "Epoch 3/3\n", + "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 21ms/step - accuracy: 0.8905 - loss: 0.2795 - val_accuracy: 0.8506 - val_loss: 0.3324\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 17 + } + ] + }, + { + "cell_type": "code", + "source": [ + "test_loss, test_acc = model.evaluate(X_test, y_test)\n", + "print(f\"\\nTest accuracy: {test_acc}\")\n", + "print(f\"\\nTest loss: {test_loss}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hJIWinxymQjb", + "outputId": "9035ae8e-7c86-4a8c-d064-38ce1eee8873" + }, + "execution_count": 23, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 10ms/step - accuracy: 0.8544 - loss: 0.3396\n", + "\n", + "Test accuracy: 0.8564800024032593\n", + "\n", + "Test loss: 0.33131280541419983\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### 10) Оценили качество обучения на тестовых данных:\n", + "### - вывели значение метрики качества классификации на тестовых данных\n", + "### - вывели отчет о качестве классификации тестовой выборки \n", + "### - построили ROC-кривую по результату обработки тестовой выборки и вычислили площадь под ROC-кривой (AUC ROC)" + ], + "metadata": { + "id": "mgrihPd61E8w" + } + }, + { + "cell_type": "code", + "source": [ + "#значение метрики качества классификации на тестовых данных\n", + "print(f\"\\nTest accuracy: {test_acc}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Rya5ABT8msha", + "outputId": "3ff03855-050d-402b-bf84-ca26c39671a7" + }, + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Test accuracy: 0.8564800024032593\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": "2kHjcmnCmv0Y", + "outputId": "2d35dde2-ee67-4d7e-bd32-17f1a2d2276c" + }, + "execution_count": 20, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 8ms/step\n", + " precision recall f1-score support\n", + "\n", + " Negative 0.83 0.90 0.86 12500\n", + " Positive 0.89 0.82 0.85 12500\n", + "\n", + " accuracy 0.86 25000\n", + " macro avg 0.86 0.86 0.86 25000\n", + "weighted avg 0.86 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": 489 + }, + "id": "Kp4AQRbcmwAx", + "outputId": "a08c1feb-04d9-4828-9a00-f4c3bc87bc35" + }, + "execution_count": 21, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "AUC ROC: 0.9356664896\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### 11) Сделали выводы по результатам применения рекуррентной нейронной сети для решения задачи определения тональности текста. " + ], + "metadata": { + "id": "MsM3ew3d1FYq" + } + }, + { + "cell_type": "markdown", + "source": [ + "Таблица1:" + ], + "metadata": { + "id": "xxFO4CXbIG88" + } + }, + { + "cell_type": "markdown", + "source": [ + "| Модель | Количество настраиваемых параметров | Количество эпох обучения | Качество классификации тестовой выборки |\n", + "|----------|-------------------------------------|---------------------------|-----------------------------------------|\n", + "| Рекуррентная | 184 897 | 3 | accuracy:0.8564 ; loss:0.3313 ; AUC ROC:0.9357 |\n" + ], + "metadata": { + "id": "xvoivjuNFlEf" + } + }, + { + "cell_type": "markdown", + "source": [ + "#### По результатам применения рекуррентной нейронной сети можно сделать вывод, что модель остаточно неплохо справилась с задачей определения тональности текста. Показатель accuracy = 0.8564 превышает требуемый порог 0.8. Значение AUC ROC = 0.9357 (> 0.9) говорит о высокой способности модели различать два класса на положительные и отрицательные области." + ], + "metadata": { + "id": "YctF8h_sIB-P" + } + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "UryAFcxR3AOj" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/labworks/LW4/report.md b/labworks/LW4/report.md new file mode 100644 index 0000000..2cfd42a --- /dev/null +++ b/labworks/LW4/report.md @@ -0,0 +1,325 @@ +# Отчёт по лабораторной работе №4 +Артюшина Валерия, Хохлов Кирилл, А-01-22 + +# Задание 1 + +## 1) В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули. Настроили блокнот для работы с аппаратным ускорителем GPU. + +```python +# импорт модулей +import os +os.mkdir('/content/drive/MyDrive/Colab Notebooks/is_lab4') +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)=15, где k=4 – номер бригады. Вывели размеры полученных обучающих и тестовых массивов данных. + +```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 + ) + +# вывод размерностей +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[26]) +print('len:',len(X_train[26])) +``` +``` +[1, 608, 17, 316, 47, 3381, 46, 14, 22, 9, 6, 601, 912, 8, 49, 2461, 14, 9, 88, 12, 16, 6, 2207, 2, 22, 15, 69, 6, 176, 7, 819, 2, 42, 2, 180, 8, 751, 2, 8, 1090, 4, 2, 1745, 675, 21, 4, 22, 47, 111, 85, 1508, 17, 73, 10, 10, 8, 895, 19, 4, 2, 186, 8, 28, 188, 27, 2, 5, 2109, 1849, 56, 4, 2, 11, 14, 22, 26, 2, 5, 92, 40, 3390, 21, 11, 175, 85, 1161, 36, 4486, 40, 2109, 150, 25, 43, 191, 81, 15, 19, 6, 2136, 512, 509, 874, 188, 8, 1231, 8, 4, 2269, 7, 4, 512, 42, 4, 451, 79, 32, 1471, 5, 3222, 34, 2, 2793, 11, 4, 355, 155, 11, 192, 4, 226, 1499, 5, 862, 1353, 114, 9, 142, 15, 47, 460, 77, 224, 18, 2109, 21, 152, 97, 101, 281, 11, 6, 1985, 20, 10, 10, 4129, 4, 1985, 1352, 26, 4, 2, 25, 28, 126, 110, 1814, 11, 4, 1985, 20, 970, 3882, 8, 124, 15, 4, 1985, 1352, 5, 2, 26, 142, 4, 451, 2, 2, 246, 49, 7, 134, 2, 26, 43, 1044, 2968, 10, 10, 50, 26, 6, 378, 7, 1076, 52, 1801, 13, 165, 179, 423, 4, 603, 409, 28, 1046, 2, 2, 2, 5, 10, 10, 1361, 48, 141, 6, 155, 70, 1778, 10, 10, 13, 82, 179, 423, 4, 1347, 18, 2, 4, 2, 2, 50, 26, 38, 111, 189, 102, 15, 2, 23, 105, 2, 2, 21, 11, 14, 420, 36, 86, 2, 6, 55, 2, 5, 1134, 1210, 1985, 2, 5, 140, 4682, 4, 1939, 13, 384, 25, 70, 516, 2, 19, 3390, 3589, 5, 75, 28, 49, 184, 976, 2, 134, 504, 1616, 30, 99, 254, 8, 276, 107, 5, 107, 295, 2, 21, 11, 801, 405, 14, 20, 271, 120, 4, 350, 5, 1608, 49, 85, 55, 2, 5, 1139, 1210, 2, 2872] +len: 323 +``` +```python +review_as_text = ' '.join(id_to_word[id] for id in X_train[26]) +print(review_as_text) +print('len:',len(review_as_text)) +``` +``` + ok as everyone has pointed out this film is a complete dog to some degree this is because it was a gory film that had a lot of material or down to near to escape the x rating but the film has many other flaws as well br br to begin with the seems to have got his and vampires mixed up the in this film are and don't like silver but in every other respect they behave like vampires now you just can't do that with a crappy genre flick you've got to stick to the rules of the genre or the fans get all confused and annoyed by disbelief in the wrong thing in fact the whole confusing and poorly presented plot is something that has already been done for vampires but doesn't make any sense in a werewolf movie br br secondly the werewolf costumes are the you have ever seen anybody in the werewolf movie business ought to know that the werewolf costumes and are something the fans yet some of these are just plain goofy br br there are a couple of slightly good bits i actually quite liked the score others have mentioned and br br spoiler if such a thing can exist br br i also quite liked the plan for the there are so many horror movies that on characters but in this case they first a very and effective anti werewolf and go slaughter the monsters i mean you can kill with silver bullets and we have some pretty powerful these days shouldn't be too hard to put two and two together but in typical style this movie goes over the top and adds some other very and amusing anti weapons +len: 1682 +``` + + +## 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[26]) +print('len:',len(X_train[26])) +``` +``` +[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 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 608 17 316 47 + 3381 46 14 22 9 6 601 912 8 49 2461 14 9 88 + 12 16 6 2207 2 22 15 69 6 176 7 819 2 42 + 2 180 8 751 2 8 1090 4 2 1745 675 21 4 22 + 47 111 85 1508 17 73 10 10 8 895 19 4 2 186 + 8 28 188 27 2 5 2109 1849 56 4 2 11 14 22 + 26 2 5 92 40 3390 21 11 175 85 1161 36 4486 40 + 2109 150 25 43 191 81 15 19 6 2136 512 509 874 188 + 8 1231 8 4 2269 7 4 512 42 4 451 79 32 1471 + 5 3222 34 2 2793 11 4 355 155 11 192 4 226 1499 + 5 862 1353 114 9 142 15 47 460 77 224 18 2109 21 + 152 97 101 281 11 6 1985 20 10 10 4129 4 1985 1352 + 26 4 2 25 28 126 110 1814 11 4 1985 20 970 3882 + 8 124 15 4 1985 1352 5 2 26 142 4 451 2 2 + 246 49 7 134 2 26 43 1044 2968 10 10 50 26 6 + 378 7 1076 52 1801 13 165 179 423 4 603 409 28 1046 + 2 2 2 5 10 10 1361 48 141 6 155 70 1778 10 + 10 13 82 179 423 4 1347 18 2 4 2 2 50 26 + 38 111 189 102 15 2 23 105 2 2 21 11 14 420 + 36 86 2 6 55 2 5 1134 1210 1985 2 5 140 4682 + 4 1939 13 384 25 70 516 2 19 3390 3589 5 75 28 + 49 184 976 2 134 504 1616 30 99 254 8 276 107 5 + 107 295 2 21 11 801 405 14 20 271 120 4 350 5 + 1608 49 85 55 2 5 1139 1210 2 2872] +len: 500 +``` + +```python +review_as_text = ' '.join(id_to_word[id] for id in X_train[26]) +print(review_as_text) +print('len:',len(review_as_text)) +``` +``` + ok as everyone has pointed out this film is a complete dog to some degree this is because it was a gory film that had a lot of material or down to near to escape the x rating but the film has many other flaws as well br br to begin with the seems to have got his and vampires mixed up the in this film are and don't like silver but in every other respect they behave like vampires now you just can't do that with a crappy genre flick you've got to stick to the rules of the genre or the fans get all confused and annoyed by disbelief in the wrong thing in fact the whole confusing and poorly presented plot is something that has already been done for vampires but doesn't make any sense in a werewolf movie br br secondly the werewolf costumes are the you have ever seen anybody in the werewolf movie business ought to know that the werewolf costumes and are something the fans yet some of these are just plain goofy br br there are a couple of slightly good bits i actually quite liked the score others have mentioned and br br spoiler if such a thing can exist br br i also quite liked the plan for the there are so many horror movies that on characters but in this case they first a very and effective anti werewolf and go slaughter the monsters i mean you can kill with silver bullets and we have some pretty powerful these days shouldn't be too hard to put two and two together but in typical style this movie goes over the top and adds some other very and amusing anti weapons +len: 2744 +``` +После обработки в начало отзыва добавилось необходимое количество токенов , чтобы отзыв был длинной в 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 ... 4 86 273] + [ 0 0 0 ... 705 9 150] + [ 0 0 0 ... 44 12 32] + ... + [ 0 0 0 ... 22 8 377] + [ 0 0 0 ... 4 2554 647] + [ 0 0 0 ... 2 4 2]] +X train: + [[ 0 0 0 ... 106 14 31] + [ 0 0 0 ... 458 168 52] + [ 0 0 0 ... 22 6 31] + ... + [ 0 0 0 ... 38 76 128] + [ 0 0 0 ... 73 290 12] + [ 0 0 0 ... 12 38 76]] +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() +``` +![alt text](1_p9.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 ━━━━━━━━━━━━━━━━━━━━ 12s 23ms/step - accuracy: 0.6328 - loss: 0.6075 - val_accuracy: 0.7826 - val_loss: 0.4588 +Epoch 2/3 +313/313 ━━━━━━━━━━━━━━━━━━━━ 6s 21ms/step - accuracy: 0.8121 - loss: 0.4143 - val_accuracy: 0.8628 - val_loss: 0.3359 +Epoch 3/3 +313/313 ━━━━━━━━━━━━━━━━━━━━ 10s 21ms/step - accuracy: 0.8905 - loss: 0.2795 - val_accuracy: 0.8506 - val_loss: 0.3324 + +``` +```python +test_loss, test_acc = model.evaluate(X_test, y_test) +print(f"\nTest accuracy: {test_acc}") +print(f"\nTest loss: {test_loss}") +``` +``` +accuracy: 0.8544 +loss: 0.3396 + +Test accuracy: 0.8564800024032593 + +Test loss: 0.33131280541419983 +``` + +## 10) Оценили качество обучения на тестовых данных. +* вывели значение метрики качества классификации на тестовых данных +* вывели отчет о качестве классификации тестовой выборки +* построили ROC-кривую по результату обработки тестовой выборки и вычислили площадь под ROC-кривой (AUC ROC) + +```python +#значение метрики качества классификации на тестовых данных +print(f"\nTest accuracy: {test_acc}") +``` +``` +Test accuracy: 0.8564800024032593 +``` + +```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.90 0.86 12500 + Positive 0.89 0.82 0.85 12500 + + accuracy 0.86 25000 + macro avg 0.86 0.86 0.86 25000 +weighted avg 0.86 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)) +``` +![alt text](1_p10.png) +``` +AUC ROC: 0.9356664896 +``` + +## 11) Сделали выводы по результатам применения рекуррентной нейронной сети для решения задачи определения тональности текста. + +Таблица1: + +| Модель | Количество настраиваемых параметров | Количество эпох обучения | Качество классификации тестовой выборки | +|----------|-------------------------------------|---------------------------|-----------------------------------------| +| Рекуррентная | 184 897 | 3 | accuracy:0.8564 ; loss:0.3313 ; AUC ROC:0.9357 | + + +## Вывод +По результатам применения рекуррентной нейронной сети можно сделать вывод, что модель остаточно неплохо справилась с задачей определения тональности текста. Показатель accuracy = 0.8564 превышает требуемый порог 0.8. Значение AUC ROC = 0.9357 (> 0.9) говорит о высокой способности модели различать два класса на положительные и отрицательные области. \ No newline at end of file