Merge pull request 'gusev_vladislav_lab_7 is ready' (#121) from gusev_vladislav_lab_7 into main

Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/121
This commit is contained in:
Alexey 2023-11-06 22:05:18 +04:00
commit c0ead13d82
9 changed files with 144 additions and 0 deletions

View File

@ -0,0 +1,41 @@
### Вариант 9
### Задание на лабораторную работу:
Выбрать художественный текст (четные варианты русскоязычный, нечетные англоязычный) и
обучить на нем рекуррентную нейронную сеть для решения задачи генерации.
Подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату.
Далее разбиться на пары четный-нечетный вариант, обменяться разработанными сетями и проверить,
как архитектура товарища справляется с вашим текстом.
В завершении подобрать компромиссную архитектуру, справляющуюся достаточно хорошо с обоими видами
текстов.
### Как запустить лабораторную работу:
Выполняем файл gusev_vladislav_lab_7.py, решение будет в консоли.
### Технологии
Keras - это библиотека для Python, позволяющая легко и быстро создавать нейронные сети.
NumPy - библиотека для работы с многомерными массивами.
### По коду
1) Читаем файл с текстом
2) Создаем объект tokenizer для превращение текста в числа для нейронной сети.
3) Создаем модель нейронной сети с следующими аргументами:
- Embedding - это слой, который обычно используется для векторного представления категориальных данных, таких как слова или символы. Он позволяет нейронной сети изучать эмбеддинги, то есть отображение слов (или символов) в вектора низкой размерности. Это позволяет сети понимать семантические отношения между словами.
- LSTM - это слой, представляющий собой рекуррентный нейрон, который способен учитывать зависимости в последовательных данных. Он хорошо подходит для обработки последовательных данных, таких как текст.
- Dense - это полносвязный слой, который принимает входные данные и применяет весовые коэффициенты к ним. Этот слой часто используется в конце нейронных сетей для решения задачи классификации или регрессии.
4) Обучаем модель на 100 эпохах (итерациях по данным) и генерируем текст.
![img.png](img.png)
Английский 100 эпох
![img_1.png](img_1.png)
![img_3.png](img_3.png)
Русский 100 эпох
![img_2.png](img_2.png)
Русский 17 эпох
![img_4.png](img_4.png)
### По консоли
- Английский текст генерировался на 100 эпохах, начало получилось осмысленным, но чем ближе к концу тем хуже.
- Русский текст также генерировался на 100 эпохах, с многочисленными ошибками в словах. Русский текст,сгенерированный на 17 эпохах по ошибкам в словах оказался лучше, но всё равно не идеально.

View File

@ -0,0 +1,61 @@
import numpy as np
from keras.models import Sequential
from keras.layers import Embedding, LSTM, Dense
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
# Загрузка текста из файла
with open('text_ru.txt', 'r', encoding='utf-8') as file:
text = file.read()
# Создание экземпляра Tokenizer
tokenizer = Tokenizer(char_level=True)
tokenizer.fit_on_texts(text)
# Преобразование текста в последовательность чисел
sequences = tokenizer.texts_to_sequences(text)
# Подготовка обучающих данных
seq_length = 100
dataX, dataY = [], []
for i in range(0, len(sequences) - seq_length):
seq_in = sequences[i:i + seq_length]
seq_out = sequences[i + seq_length]
dataX.append(seq_in)
dataY.append(seq_out)
dataX = np.array(dataX)
dataY = np.array(dataY)
# Создание модели
vocab_size = len(tokenizer.word_index) + 1
embedding_dim = 256
rnn_units = 1024
model = Sequential()
model.add(Embedding(input_dim=vocab_size, output_dim=embedding_dim, input_length=seq_length))
model.add(LSTM(units=rnn_units))
model.add(Dense(units=vocab_size, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')
# Обучение модели
batch_size = 64
model.fit(dataX, dataY, epochs=17, batch_size=batch_size)
def generate_text(seed_text, gen_length):
generated_text = seed_text
for _ in range(gen_length):
sequence = tokenizer.texts_to_sequences([seed_text])[0]
sequence = pad_sequences([sequence], maxlen=seq_length)
prediction = model.predict(sequence)[0]
predicted_index = np.argmax(prediction)
predicted_char = tokenizer.index_word[predicted_index]
generated_text += predicted_char
seed_text += predicted_char
seed_text = seed_text[1:]
return generated_text
# Пример использования
generated_text = generate_text("Мультфильмы", 250)
print(generated_text)

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -0,0 +1,21 @@
Do you like watching cartoons? Probably you do! But how did they come to be? Who invented them?
This is actually a very tough question. The first cartoons were created long before the TV.
For example, shadow play was a very popular form of entertainment in ancient China. Such shows looked almost like modern cartoons!
A toy called a flip book was made in the late 19th century. It was a small soft book with pictures.
Each picture was drawn in a slightly different5 way. When you bend this book and release the pages one by one, the images start to move.
Strictly speaking, they dont, but our eyes see it like that anyway. The first real cartoons were made using this trick, too!
In 1895 brothers Louis and Auguste Lumière created a cinematograph.
It was a camera and a film projector in one device. Using this device, many aspiring film directors started to create their own cartoons.
This developed into a full industry by 1910. Many cartoons of that era are forgotten now, but some are still with us.
For example, Felix the Cat was created by Otto Messmer in 1919, and hes still with us, more than a hundred years later.
Currently the rights to the character are held by DreamWorks Animation.
One of the pioneers in the industry was famous Walt Disney.
He was not afraid to experiment to make a cartoon, and his Snow White film was among the firsts to use a multiplane camera.
With its help the characters were able to move around the objects, creating an illusion of a 3D world.
Today most of the cartoons are made with computer animation. The last traditional Disney cartoon to date was Winnie the Pooh (2011).

View File

@ -0,0 +1,21 @@
Вам нравится смотреть мультфильмы? Вероятно, так оно и есть! Но как они появились на свет? Кто их изобрел?
На самом деле это очень сложный вопрос. Первые мультфильмы были созданы задолго до появления телевидения.
Например, игра с тенью была очень популярной формой развлечения в Древнем Китае. Такие шоу выглядели почти как современные мультфильмы!
Игрушка под названием книжка-перевертыш была изготовлена в конце 19 века. Это была маленькая мягкая книжка с картинками.
Каждая картинка была нарисована немного по-разному. Когда вы сгибаете эту книгу и отпускаете страницы одну за другой, изображения начинают двигаться.
Строго говоря, это не так, но наши глаза все равно видят это именно так. Первые настоящие мультфильмы тоже были сделаны с использованием этого трюка!
В 1895 году братья Луи и Огюст Люмьер создали кинематограф.
Это была камера и кинопроектор в одном устройстве. Используя это устройство, многие начинающие режиссеры начали создавать свои собственные мультфильмы.
К 1910 году это развилось в полноценную индустрию. Многие мультфильмы той эпохи сейчас забыты, но некоторые все еще с нами.
Например, кот Феликс был создан Отто Мессмером в 1919 году, и он все еще с нами, более ста лет спустя.
В настоящее время правами на персонажа владеет DreamWorks Animation.
Одним из пионеров в этой отрасли был знаменитый Уолт Дисней.
Он не боялся экспериментировать при создании мультфильма, и его фильм "Белоснежка" был одним из первых, в котором использовалась многоплановая камера.
С его помощью персонажи смогли передвигаться по объектам, создавая иллюзию трехмерного мира.
Сегодня большинство мультфильмов создано с использованием компьютерной анимации. Последним традиционным диснеевским мультфильмом на сегодняшний день был "Винни-Пух" (2011).