форкнуто от main/is_dnn
Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
869 строки
70 KiB
Plaintext
869 строки
70 KiB
Plaintext
{
|
|
"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[\"<PAD>\"] = 0\n",
|
|
"word_to_id[\"<START>\"] = 1\n",
|
|
"word_to_id[\"<UNK>\"] = 2\n",
|
|
"word_to_id[\"<UNUSED>\"] = 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": [
|
|
"<START> ok as everyone has pointed out this film is a complete dog to some degree this is because it was a gory <UNK> film that had a lot of material <UNK> or <UNK> down to near <UNK> to escape the <UNK> x rating but the film has many other flaws as well br br to begin with the <UNK> seems to have got his <UNK> and vampires mixed up the <UNK> in this film are <UNK> 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 <UNK> 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 <UNK> you have ever seen anybody in the werewolf movie business ought to know that the werewolf costumes and <UNK> are something the fans <UNK> <UNK> yet some of these <UNK> are just plain goofy br br there are a couple of slightly good bits i actually quite liked the score others have mentioned <UNK> <UNK> <UNK> and br br spoiler if such a thing can exist br br i also quite liked the plan for <UNK> the <UNK> <UNK> there are so many horror movies that <UNK> on characters <UNK> <UNK> but in this case they first <UNK> a very <UNK> and effective anti werewolf <UNK> and go slaughter the monsters i mean you can kill <UNK> with silver bullets and we have some pretty powerful <UNK> these days shouldn't be too hard to put two and two together <UNK> but in typical style this movie goes over the top and adds some other very <UNK> and amusing anti <UNK> 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": [
|
|
"<PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <START> ok as everyone has pointed out this film is a complete dog to some degree this is because it was a gory <UNK> film that had a lot of material <UNK> or <UNK> down to near <UNK> to escape the <UNK> x rating but the film has many other flaws as well br br to begin with the <UNK> seems to have got his <UNK> and vampires mixed up the <UNK> in this film are <UNK> 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 <UNK> 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 <UNK> you have ever seen anybody in the werewolf movie business ought to know that the werewolf costumes and <UNK> are something the fans <UNK> <UNK> yet some of these <UNK> are just plain goofy br br there are a couple of slightly good bits i actually quite liked the score others have mentioned <UNK> <UNK> <UNK> and br br spoiler if such a thing can exist br br i also quite liked the plan for <UNK> the <UNK> <UNK> there are so many horror movies that <UNK> on characters <UNK> <UNK> but in this case they first <UNK> a very <UNK> and effective anti werewolf <UNK> and go slaughter the monsters i mean you can kill <UNK> with silver bullets and we have some pretty powerful <UNK> these days shouldn't be too hard to put two and two together <UNK> but in typical style this movie goes over the top and adds some other very <UNK> and amusing anti <UNK> weapons\n",
|
|
"len: 2744\n"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"#### После обработки в начало отзыва добавилось необходимое количество токенов <PAD>, чтобы отзыв был длинной в 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": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
|
|
"</pre>\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": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
|
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
|
|
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
|
"│ embedding (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Embedding</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">160,000</span> │\n",
|
|
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
|
"│ lstm (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LSTM</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">24,832</span> │\n",
|
|
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
|
"│ dropout (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
|
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
|
"│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">65</span> │\n",
|
|
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
|
|
"</pre>\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": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">184,897</span> (722.25 KB)\n",
|
|
"</pre>\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": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">184,897</span> (722.25 KB)\n",
|
|
"</pre>\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": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
|
|
"</pre>\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": [
|
|
"<keras.src.callbacks.history.History at 0x7a8b2b9509e0>"
|
|
]
|
|
},
|
|
"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": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
],
|
|
"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": []
|
|
}
|
|
]
|
|
} |