Merge pull request 'kochkareva_elizaveta_lab_7 is ready' (#284) from kochkareva_elizaveta_lab_7 into main

Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/284
This commit is contained in:
Alexey 2023-12-28 10:36:37 +04:00
commit 099679a413
4 changed files with 1760 additions and 0 deletions

View File

@ -0,0 +1,91 @@
# Лабораторная работа 7. Вариант 15
### Задание
Выбрать художественный текст (нечетные варианты англоязычный) и обучить на нем рекуррентную нейронную сеть
для решения задачи генерации. Подобрать архитектуру и параметры так,
чтобы приблизиться к максимально осмысленному результату.
### Как запустить лабораторную работу
Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать:
```
python main.py
```
### Какие технологии использовали
- Библиотека *numpy* для работы с массивами.
- Библиотека *tensorflow* - для машинного обучения. Она предоставляет инструменты для создания и обучения различных моделей машинного обучения, включая нейронные сети.
### Описание лабораторной работы
Для данной лабораторной работы был взят текст на 1596 строк текста.
```python
with open('V3001TH2.txt', 'r', encoding='utf-8') as f:
text = f.read()
```
Далее создали список уникальных символов `chars`, а также словари `char_to_index` и `index_to_char`, которые используются для преобразования символов в индексы и наоборот.
```python
chars = sorted(list(set(text)))
char_to_index = {char: index for index, char in enumerate(chars)}
index_to_char = {index: char for index, char in enumerate(chars)}
```
После чего можем генерировать ренировочные данные `train_x` и `train_y`. `train_x` содержит последовательности символов длиной `seq_length` из текста, а `train_y` содержит следующий символ после каждой входной последовательности. Каждый символ преобразуется в соответствующий индекс, используя словарь `char_to_index`.
```python
# Генерация тренировочных данных
seq_length = 100 # Длина входной последовательности
train_x = []
train_y = []
for i in range(0, text_length - seq_length, 1):
input_seq = text[i:i + seq_length]
output_seq = text[i + seq_length]
train_x.append([char_to_index[char] for char in input_seq])
train_y.append(char_to_index[output_seq])
```
Далее преобразуем `train_x` в трехмерный массив с размерностью (количество примеров, `seq_length`, 1).
Нормализуем значения `train_x` путем деления на `num_chars` и преобразуем `train_y` в `one-hot` представление с помощью `tf.keras.utils.to_categorical.`
```python
train_x = np.reshape(train_x, (len(train_x), seq_length, 1))
train_x = train_x / float(num_chars)
train_y = tf.keras.utils.to_categorical(train_y)
```
Теперь переходим к созданию модели рекуррентной нейронной сети с `LSTM` слоем, принимающим входные данные размерности `(train_x.shape[1], train_x.shape[2])` и плотным слоем с активацией softmax.
Компилируем модель с функцией потерь `categorical_crossentropy` и оптимизатором `adam`.
```python
model = tf.keras.Sequential([
tf.keras.layers.LSTM(128, input_shape=(train_x.shape[1], train_x.shape[2])),
tf.keras.layers.Dense(num_chars, activation='softmax')
])
model.compile(loss='categorical_crossentropy', optimizer='adam')
```
Обучаем модель на тренировачных данных с заданным количеством эпох - 80 и размером пакета - 128.
```
model.fit(train_x, train_y, epochs=80, batch_size=128)
```
Генерируется текст, начиная с случайного индекса `start_index` в `train_x`. Затем, на каждой итерации цикла, модель предсказывает следующий символ, добавляет его к сгенерированному тексту и обновляет `start_seq` для использования в следующей итерации.
Записывает сгенерированный текст в файл *'сгенерированный_текст.txt'*.
Результат выполнения:
```
Ih ses shven they to tore a fit oo th toie th sook a buck and tore tote a siee fot oo the searen.
Jnd buonds sore toee th the shele and thans to the siee and soans tie his and tooning tie hit cnd toens the his and croninng his bioter.
— Iod you ducking tooeeds so toieg a buck and to bor aeeut tore a sigee oo toire a ducn fo toine to see sooeee oo the saelen. Tnd blond toees the sirt and that the sooel and thai to the soeee of the shale.
"Iotk toe ffcrtes," Vincent says suth a suine and a
```
### Вывод
Текст содержит некоторые слова и фразы, которые кажутся некорректными или непонятными. Это может быть связано с недостаточным количеством обучающих данных или эпох обучения.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,64 @@
import numpy as np
import tensorflow as tf
def recurrent_neural_network():
# Загрузка текстового файла и предварительная обработка данных
with open('V3001TH2.txt', 'r', encoding='utf-8') as f:
text = f.read()
chars = sorted(list(set(text)))
char_to_index = {char: index for index, char in enumerate(chars)}
index_to_char = {index: char for index, char in enumerate(chars)}
num_chars = len(chars)
text_length = len(text)
# Генерация тренировочных данных
seq_length = 100 # Длина входной последовательности
train_x = []
train_y = []
for i in range(0, text_length - seq_length, 1):
input_seq = text[i:i + seq_length]
output_seq = text[i + seq_length]
train_x.append([char_to_index[char] for char in input_seq])
train_y.append(char_to_index[output_seq])
train_x = np.reshape(train_x, (len(train_x), seq_length, 1))
train_x = train_x / float(num_chars)
train_y = tf.keras.utils.to_categorical(train_y)
model = tf.keras.Sequential([
tf.keras.layers.LSTM(128, input_shape=(train_x.shape[1], train_x.shape[2])),
tf.keras.layers.Dense(num_chars, activation='softmax')
])
model.compile(loss='categorical_crossentropy', optimizer='adam')
# Обучение модели
model.fit(train_x, train_y, epochs=80, batch_size=128)
# Генерация текста
start_index = np.random.randint(0, len(train_x) - 1)
start_seq = train_x[start_index]
generated_text = ''
for _ in range(500):
x = np.reshape(start_seq, (1, len(start_seq), 1))
x = x / float(num_chars)
prediction = model.predict(x, verbose=0)
index = np.argmax(prediction)
result = index_to_char[index]
generated_text += result
start_seq = np.append(start_seq, index)
start_seq = start_seq[1:]
with open('сгенерированный_текст.txt', 'w', encoding='utf-8') as f:
f.write(generated_text)
if __name__ == '__main__':
recurrent_neural_network()

View File

@ -0,0 +1,8 @@
Ih ses shven they to tore a fit oo th toie th sook a buck and tore tote a siee fot oo the searen.
Jnd buonds sore toee th the shele and thans to the siee and soans tie his and tooning tie hit cnd toens the his and croninng his bioter.
— Iod you ducking tooeeds so toieg a buck and to bor aeeut tore a sigee oo toire a ducn fo toine to see sooeee oo the saelen. Tnd blond toees the sirt and that the sooel and thai to the soeee of the shale.
"Iotk toe ffcrtes," Vincent says suth a suine and a