Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

449 строки
15 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": [
"# импорт модулей\n",
"import os\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": null,
"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": {
"id": "o63-lKG_RuNc"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"### 2) Загрузили набор данных IMDb, содержащий оцифрованные отзывы на фильмы, размеченные на два класса: позитивные и негативные. При загрузке набора данных параметр seed выбрали равным значению (4k – 1)=23, где k=6 – номер бригады. Вывели размеры полученных обучающих и тестовых массивов данных."
],
"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=26,\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"
},
"execution_count": null,
"outputs": []
},
{
"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"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"print(X_train[26])\n",
"print('len:',len(X_train[26]))"
],
"metadata": {
"id": "Nu-Bs1jnaYhB"
},
"execution_count": null,
"outputs": []
},
{
"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": {
"id": "JhTwTurtZ6Sp"
},
"execution_count": null,
"outputs": []
},
{
"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": {
"id": "xJH87ISq1B9h"
},
"execution_count": null,
"outputs": []
},
{
"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": null,
"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": {
"id": "81Cgq8dn9uL6"
},
"execution_count": null,
"outputs": []
},
{
"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": {
"id": "vudlgqoCbjU1"
},
"execution_count": null,
"outputs": []
},
{
"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": {
"id": "dbfkWjDI1Dp7"
},
"execution_count": null,
"outputs": []
},
{
"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": {
"id": "7MqcG_wl1EHI"
},
"execution_count": null,
"outputs": []
},
{
"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": {
"id": "ktWEeqWd1EyF"
},
"execution_count": null,
"outputs": []
},
{
"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": {
"id": "CuPqKpX0kQfP"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"test_loss, test_acc = model.evaluate(X_test, y_test)\n",
"print(f\"\\nTest accuracy: {test_acc}\")"
],
"metadata": {
"id": "hJIWinxymQjb"
},
"execution_count": null,
"outputs": []
},
{
"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": {
"id": "Rya5ABT8msha"
},
"execution_count": null,
"outputs": []
},
{
"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": {
"id": "2kHjcmnCmv0Y"
},
"execution_count": null,
"outputs": []
},
{
"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": {
"id": "Kp4AQRbcmwAx"
},
"execution_count": null,
"outputs": []
},
{
"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.8556 ; loss:0.5214 ; AUC ROC:0.9165 |\n"
],
"metadata": {
"id": "xvoivjuNFlEf"
}
},
{
"cell_type": "markdown",
"source": [
"#### По результатам применения рекуррентной нейронной сети, а также по данным таблицы 1 можно сделать вывод, что модель хорошо справилась с задачей определения тональности текста. Показатель accuracy = 0.8556 превышает требуемый порог 0.8. Значение AUC ROC = 0.9165 (> 0.9) говорит о высокой способности модели различать два класса (положительные и отрицательные отзывы)."
],
"metadata": {
"id": "YctF8h_sIB-P"
}
}
]
}