Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
31
Добавлен:
18.07.2022
Размер:
173.51 Кб
Скачать

Отчет по лабораторной работе № 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

Соседние файлы в папке Лабораторные работы