diff --git a/gusev_vladislav_lab_7/README.md b/gusev_vladislav_lab_7/README.md new file mode 100644 index 0000000..6b40399 --- /dev/null +++ b/gusev_vladislav_lab_7/README.md @@ -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 эпохах по ошибкам в словах оказался лучше, но всё равно не идеально. \ No newline at end of file diff --git a/gusev_vladislav_lab_7/gusev_vladislav_lab_7.py b/gusev_vladislav_lab_7/gusev_vladislav_lab_7.py new file mode 100644 index 0000000..2cb0fe5 --- /dev/null +++ b/gusev_vladislav_lab_7/gusev_vladislav_lab_7.py @@ -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) \ No newline at end of file diff --git a/gusev_vladislav_lab_7/img.png b/gusev_vladislav_lab_7/img.png new file mode 100644 index 0000000..5e12712 Binary files /dev/null and b/gusev_vladislav_lab_7/img.png differ diff --git a/gusev_vladislav_lab_7/img_1.png b/gusev_vladislav_lab_7/img_1.png new file mode 100644 index 0000000..3a283bf Binary files /dev/null and b/gusev_vladislav_lab_7/img_1.png differ diff --git a/gusev_vladislav_lab_7/img_2.png b/gusev_vladislav_lab_7/img_2.png new file mode 100644 index 0000000..e04b884 Binary files /dev/null and b/gusev_vladislav_lab_7/img_2.png differ diff --git a/gusev_vladislav_lab_7/img_3.png b/gusev_vladislav_lab_7/img_3.png new file mode 100644 index 0000000..8000240 Binary files /dev/null and b/gusev_vladislav_lab_7/img_3.png differ diff --git a/gusev_vladislav_lab_7/img_4.png b/gusev_vladislav_lab_7/img_4.png new file mode 100644 index 0000000..25cfb8c Binary files /dev/null and b/gusev_vladislav_lab_7/img_4.png differ diff --git a/gusev_vladislav_lab_7/text_eng.txt b/gusev_vladislav_lab_7/text_eng.txt new file mode 100644 index 0000000..042f8a6 --- /dev/null +++ b/gusev_vladislav_lab_7/text_eng.txt @@ -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 don’t, 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 he’s 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). \ No newline at end of file diff --git a/gusev_vladislav_lab_7/text_ru.txt b/gusev_vladislav_lab_7/text_ru.txt new file mode 100644 index 0000000..7acb38d --- /dev/null +++ b/gusev_vladislav_lab_7/text_ru.txt @@ -0,0 +1,21 @@ +Вам нравится смотреть мультфильмы? Вероятно, так оно и есть! Но как они появились на свет? Кто их изобрел? + +На самом деле это очень сложный вопрос. Первые мультфильмы были созданы задолго до появления телевидения. +Например, игра с тенью была очень популярной формой развлечения в Древнем Китае. Такие шоу выглядели почти как современные мультфильмы! + +Игрушка под названием книжка-перевертыш была изготовлена в конце 19 века. Это была маленькая мягкая книжка с картинками. +Каждая картинка была нарисована немного по-разному. Когда вы сгибаете эту книгу и отпускаете страницы одну за другой, изображения начинают двигаться. +Строго говоря, это не так, но наши глаза все равно видят это именно так. Первые настоящие мультфильмы тоже были сделаны с использованием этого трюка! + +В 1895 году братья Луи и Огюст Люмьер создали кинематограф. +Это была камера и кинопроектор в одном устройстве. Используя это устройство, многие начинающие режиссеры начали создавать свои собственные мультфильмы. + +К 1910 году это развилось в полноценную индустрию. Многие мультфильмы той эпохи сейчас забыты, но некоторые все еще с нами. +Например, кот Феликс был создан Отто Мессмером в 1919 году, и он все еще с нами, более ста лет спустя. +В настоящее время правами на персонажа владеет DreamWorks Animation. + +Одним из пионеров в этой отрасли был знаменитый Уолт Дисней. +Он не боялся экспериментировать при создании мультфильма, и его фильм "Белоснежка" был одним из первых, в котором использовалась многоплановая камера. +С его помощью персонажи смогли передвигаться по объектам, создавая иллюзию трехмерного мира. + +Сегодня большинство мультфильмов создано с использованием компьютерной анимации. Последним традиционным диснеевским мультфильмом на сегодняшний день был "Винни-Пух" (2011). \ No newline at end of file