Лабораторные работы / intel_lab4
.pdfОтчет по лабораторной работе № 4 по дисциплине «Интеллектуальные системы»
на тему «Распознавание последовательностей»
Цель работы
Получить практические навыки обработки текстовой информации с помощью рекуррентных искусственных нейронных сетей при решении задачи определения тональности текста.
Выполнение
1. В среде Google Colab создать новый блокнот (notebook). Настроить блокнот для работы с аппаратным ускорителем GPU.
%tensorflow_version 2.x 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 выбрать равным (4*22 – 1) = 87. Вывести размеры полученных обучающих и тестовых массивов данных.
#загрузка датасета
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,
1
maxlen=None, seed=87, 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).
print(X_train[90])
Результат:
[1, 225, 38, … 78 20 356]
#создание словаря для перевода индексов в слова
#заргузка словаря "слово:индекс"
word_to_id = imdb.get_word_index()
# уточнение словаря
word_to_id = {key:(value + index_from) for key,value in word_to_id.items()} word_to_id["<PAD>"] = 0
2
word_to_id["<START>"] = 1 word_to_id["<UNK>"] = 2 word_to_id["<UNUSED>"] = 3
# создание обратного словаря "индекс:слово"
id_to_word = {value:key for key,value in word_to_id.items()} review_as_text = ' '.join(id_to_word[id] for id in X_train[90])
Результат:
<START> there's so many negative … bad movie classic
len(X_train[90])
Результат: 252
len(review_as_text)
Результат: 1272
print(y_train[90]) if y_train[90]==0: print('Negative') elif y_train[90]==1: print('Positive')
Результат: 0 Negative
4. Вывести максимальную и минимальную длину отзыва в обучающем множестве. print('Len max =',len(max(X_train, key=len)))
print('Len min =',len(min(X_train, key=len)))
Результат: Len max = 2494
3
Len min = 11
5.Провести предобработку данных. Выбрать единую длину, к которой будут приведены все отзывы. Короткие отзывы дополнить спецсимволами, а длинные обрезать до выбранной длины.
#предобработка данных
from keras.preprocessing import sequence max_words = 500
X_train = sequence.pad_sequences(X_train, maxlen=max_words, value=0, padding='pre', truncating='post')
X_test = sequence.pad_sequences(X_test, maxlen=max_words, value=0, padding='pre', truncating='post')
6. Вывести максимальную и минимальную длину отзыва в обучающем множестве. print('Len max =',len(max(X_train, key=len)))
print('Len min =',len(min(X_train, key=len)))
Результат: Len max = 500 Len min = 500
7.Вывести один отзыв из обучающего множества в виде списка индексов слов. Преобразовать список индексов в текст и вывести отзыв в виде текста. Вывести длину отзыва.
print(X_train[90])
Результат:
[ 0 0 0 … 78 20 356]
review_as_text2 = ' '.join(id_to_word[id] for id in X_train[90]) print(review_as_text2)
Результат:
4
<PAD> <PAD> <PAD> … bad movie classic
len(X_train[90])
Результат: 500
len(review_as_text2)
Результат: 2760
Таким образом, так как исходная длина рассмотренного отзыва была равна 252 < 500, то после предобработки массива X_train она была дополнена до 500 нулями слева
8. Вывести предобработанные массивы обучающих и тестовых данных и их размерности. print(X_train)
Результат: |
|
|
|
|||
[[ |
0 |
0 |
0 ... |
23 |
735 |
314] |
[ |
0 |
0 |
0 ... |
221 1242 1148] |
||
[ |
0 |
0 |
0 ... |
209 |
824 |
2] |
... |
|
|
|
|
|
|
[ |
0 |
0 |
0 ... |
10 |
470 |
158] |
[ |
0 |
0 |
0 ... |
10 |
241 |
158] |
[ |
0 |
0 |
0 ... |
43 |
358 |
624]] |
|
|
|
|
|||
print(X_test) |
|
|
|
|||
|
|
|
|
|||
Результат: |
|
|
|
|||
[[ |
0 |
0 |
0 ... 1124 18 |
252] |
||
[ |
0 |
0 |
0 ... |
15 |
78 |
99] |
[ |
0 |
0 |
0 ... |
178 |
32 |
849] |
... |
|
|
|
|
|
|
[ |
0 |
0 |
0 ... |
67 |
4 130] |
5
[ |
0 |
0 |
0 ... |
2 2731 2] |
[ |
0 |
0 |
0 ... |
8 94 1500]] |
print('Shape of X train:', X_train.shape) print('Shape of X test:', X_test.shape)
Результат:
Shape of X train: (25000, 500) Shape of X test: (25000, 500)
9.Реализовать модель рекуррентной нейронной сети, состоящей из слоев Embedding, LSTM, Dropout, Dense, и обучить ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывести информацию об архитектуре нейронной сети.
Добиться качества обучения по метрике accuracy не менее 0.8. model = tf.keras.Sequential()
model.add(tf.keras.layers.Embedding(5000, 32, input_length=max_words)) model.add(tf.keras.layers.LSTM(units=100)) model.add(tf.keras.layers.Dropout(0.5)) model.add(tf.keras.layers.Dense(1, activation="sigmoid")) model.summary()
Результат:
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, 500, 32) |
160000 |
||
lstm (LSTM) |
(None, 100) |
53200 |
|
dropout (Dropout) |
(None, 100) |
0 |
|
dense (Dense) |
(None, 1) |
101 |
|
=================================================================
6
Total params: 213,301 Trainable params: 213,301 Non-trainable params: 0
_________________________________________________________________
batch_size = 32 epochs = 5
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1)
Результат: Epoch 5/5
704/704 [==============================] - 54s 76ms/step - loss: 0.2362 - accuracy: 0.9105 - val_loss: 0.3698 - val_accuracy: 0.8564
10.Оценить качество обучения на тестовых данных. Вывести значение метрики качества классификации на тестовых данных. Вывести отчет о качестве классификации тестовой выборки.
#Оценка качества работы модели на тестовых данных
scores = model.evaluate(X_test, y_test) print('Loss on test data:', scores[0]) print('Accuracy on test data:', scores[1])
Результат:
782/782 [==============================] - 29s 37ms/step - loss: 0.3583 - accuracy: 0.8559 Loss on test data: 0.35833391547203064
Accuracy on test data: 0.8558800220489502
test_result = model.predict(X_test)
predicted_labels = [1 if test_result[i,0]>=0.5 else 0 for i in range(len(test_result))] from sklearn.metrics import classification_report
print(classification_report(y_test, predicted_labels, labels = [0, 1], target_names=['Negative', 'Positive']))
7
Результат:
precision recall f1-score support
Negative |
0.89 |
0.82 |
0.85 |
12500 |
Positive |
0.83 |
0.89 |
0.86 |
12500 |
accuracy |
|
|
0.86 |
25000 |
macro avg |
0.86 |
0.86 |
0.86 |
25000 |
weighted avg |
0.86 |
0.86 |
0.86 |
25000 |
11. Выводы:
Врезультате применения рекуррентной нейронной сети для решения задачи определения тональности текста были получены значения метрик качества precision, recall, f1-score, support, достаточно близкие к идеальному значению, равному единице, и для класса Positive, и для класса Negative. Невзвешенное среднее и взвешенное среднее значения этих параметров также близки к идеальным. Значение показателя accuracy достаточно близко к идеальному, равному единице.
Врезультате оценки качества работы модели на тестовых данных были получены значение ошибки 0,358, не слишком близкое к идеальному, равному нулю, и значение метрики качества 0,856, достаточно близкое к идеальному значению, равному единице.
Таким образом, полученная рекуррентная нейронная сеть может применяться для решения задачи определения тональности текста.
8