Обновление генератора текста

от автора

Привет! Я решил вернуться к созданию модели на основе рекуррентных нейронных сетей. Она показалась мне очень интересной, ведь мне лично нравится не использовать нейросеть по назначению, а смотреть, как она учится при определённых показателях.

Я решил сильно упростить использование кода, создав множество настроек и указав, какие можно изменять и подкручивать под реальные практические нужды, если такие найдутся. Я так же сделал красивый прогрессбар, ведь программа только при генерации текста много пишет

Для начала я решил обновить сами слои. Я понял, что создание лишних слоёв со спец свойствами в целом не очень нужны, ведь наша задача создать модель нейросети, которая будет работать на обычном компьютере, а например слой внимания сильно увеличивает время обучения, пусть и делает модель точней.

Вот как выглядят импорт всех составляющих и создание слоёв:

# Функция для создания модели def create_model(total_words, max_sequence_len):     model = Sequential()     model.add(Embedding(total_words, 100, input_length=max_sequence_len-1)) # Число нейронов можно менять     model.add(LSTM(100)) # Число нейронов можно менять     for _ in range(2): # Число нейронов можно менять         model.add(Dense(100)) # Число нейронов можно менять     model.add(Dense(total_words, activation='softmax'))     model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])     return model

Обучение модели не сильно изменилось, разве что я изменил ту часть, где задаётся датасет с текстом. Из предыдущей статьи я понял, что пользователи могут не понимать, какой именно текст нужен. Я сразу говорю, обучайте модель на любом тексте! Просто задайте запрос в гугл, например «Что значит прокрастинировать» и ответ запишите в текстовый файл. Главное, чтобы текст был больше 200 символов, его максимальный размер в теории не ограничен. Вот код функции обучения:

# Функция обучения нейросети def train_model(TextData, max_sequence_len):     tokenizer = Tokenizer(char_level=True)     tokenizer.fit_on_texts(TextData)     total_chars = len(tokenizer.word_index) + 1      input_sequences = []     for i in range(0, len(TextData) - max_sequence_len, 1):         sequence = TextData[i:i + max_sequence_len]         input_sequences.append(sequence)      input_sequences = tokenizer.texts_to_sequences(input_sequences)     input_sequences = np.array(input_sequences)     xs, labels = input_sequences[:, :-1], input_sequences[:, -1]     ys = tf.keras.utils.to_categorical(labels, num_classes=total_chars)      model = create_model(total_chars, max_sequence_len)     epochs = 0     while True:         history = model.fit(xs, ys, epochs=1, verbose=1)         accuracy = history.history['accuracy'][0]         if accuracy > 0.7: # Настраиваемый параметр             break         epochs += 1      model.save('Путь_к_текстовому_файлу')     return model, tokenizer

Заметьте, что модель обучается до тех пор, пока показатель точности не превысит 0,7. Конечно же вы можете изменить этот показатель, если нужно.

Генерация текста получила важное обновление. Она получила использование температуры, что значит настройку разнообразия текста. Вот код:

# Функция генерации текста  def generate_text(seed_text, next_chars, model, max_sequence_len, tokenizer, temperature=0.7): # Настройте параметр температуры.     generated_text = seed_text     for _ in tqdm(range(next_chars), desc="Generating text"):         token_list = tokenizer.texts_to_sequences([seed_text])[0]         token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')          predicted_probs = model.predict(token_list, verbose=0)[0]         predicted_probs = np.log(predicted_probs) / temperature         exp_preds = np.exp(predicted_probs)         predicted_probs = exp_preds / np.sum(exp_preds)         predicted = np.random.choice(len(predicted_probs), p=predicted_probs)         output_char = tokenizer.index_word.get(predicted, "")         seed_text += output_char         generated_text += output_char      return generated_text

Использование модели сильно не изменилось. Разве что были подправлены некоторые нюансы, но это мелочи. Вот код:

# Хочет ли пользователь обучить новую модель? train_new_model = input("Хотите обучить новую модель? (да/нет)): ") if train_new_model.lower() == "да":     # Загружаем датасет     with open('Путь_к_датасету', 'r') as file:         TextData = file.read().replace('\n', ' ')     max_sequence_len = 100 # Настройте (он должен быть таким же, как снизу)     model, tokenizer = train_model(TextData, max_sequence_len) else:     # Обучнная модель     model = load_model('Путь_к_файлу_модели/text_generation_model.h5')     tokenizer = Tokenizer(char_level=True)     with open('Путь_к_датасету', 'r') as file:         TextData = file.read().replace('\n', ' ')     tokenizer.fit_on_texts(TextData)     max_sequence_len = 100 # Настройте (он должен быть таким же, как сверху)  # Генерация и вывод текста while True:     seed_text = input("Вы: ")     next_chars = 200 # Настройте длину генерируемого текста     generated_text = generate_text(seed_text, next_chars, model, max_sequence_len, tokenizer)     print("ИИ: ", generated_text)

Всё! Модель создана. Теперь у вас есть проблема для обучения и использования генераторов текста. На всякий случай высылаю вам полный код, такой, как у меня в Гугл коллабе:

import tensorflow as tf from tensorflow.keras.models import Sequential, load_model from tensorflow.keras.layers import Embedding, LSTM, Dense from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences import numpy as np from tqdm import tqdm  # Создаём модель def create_model(total_words, max_sequence_len):     model = Sequential()     model.add(Embedding(total_words, 700, input_length=max_sequence_len-1))     model.add(LSTM(700))     for _ in range(2):         model.add(Dense(700))     model.add(Dense(total_words, activation='softmax'))     model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])     return model  # Обучаем модель  def train_model(TextData, max_sequence_len):     tokenizer = Tokenizer(char_level=True)     tokenizer.fit_on_texts(TextData)     total_chars = len(tokenizer.word_index) + 1      input_sequences = []     for i in range(0, len(TextData) - max_sequence_len, 1):         sequence = TextData[i:i + max_sequence_len]         input_sequences.append(sequence)      input_sequences = tokenizer.texts_to_sequences(input_sequences)     input_sequences = np.array(input_sequences)     xs, labels = input_sequences[:, :-1], input_sequences[:, -1]     ys = tf.keras.utils.to_categorical(labels, num_classes=total_chars)      model = create_model(total_chars, max_sequence_len)     epochs = 0     while True:         history = model.fit(xs, ys, epochs=1, verbose=1)         accuracy = history.history['accuracy'][0]         if accuracy > 0.7:             break         epochs += 1      model.save('/content/drive/MyDrive/Colab Notebooks/text_generation_model.h5')     return model, tokenizer  # Генерация текста def generate_text(seed_text, next_chars, model, max_sequence_len, tokenizer, temperature=0.7):     generated_text = seed_text     for _ in tqdm(range(next_chars), desc="Generating text"):         token_list = tokenizer.texts_to_sequences([seed_text])[0]         token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')          predicted_probs = model.predict(token_list, verbose=0)[0]         predicted_probs = np.log(predicted_probs) / temperature         exp_preds = np.exp(predicted_probs)         predicted_probs = exp_preds / np.sum(exp_preds)         predicted = np.random.choice(len(predicted_probs), p=predicted_probs)         output_char = tokenizer.index_word.get(predicted, "")         seed_text += output_char         generated_text += output_char      return generated_text  # Хочет ли пользователь обучить новую модель? train_new_model = input("Хотите обучить новую модель? (да/нет)): ") if train_new_model.lower() == "да":     # загружаем датасет     with open('/content/drive/MyDrive/Colab Notebooks/TextData.txt', 'r') as file:         TextData = file.read().replace('\n', ' ')     max_sequence_len = 200     model, tokenizer = train_model(TextData, max_sequence_len) else:     # загружаем модель     model = load_model('/content/drive/MyDrive/Colab Notebooks/text_generation_model.h5')     tokenizer = Tokenizer(char_level=True)     with open('/content/drive/MyDrive/Colab Notebooks/TextData.txt', 'r') as file:         TextData = file.read().replace('\n', ' ')     tokenizer.fit_on_texts(TextData)     max_sequence_len = 200  # Используем модель while True:     seed_text = input("Вы: ")     next_chars = 200     generated_text = generate_text(seed_text, next_chars, model, max_sequence_len, tokenizer)     print("ИИ: ", generated_text)

Пример использования:

Хотите обучить новую модель? (да/нет): да 1730/1730 ━━━━━━━━━━━━━━━━━━━━ 13s 6ms/step - accuracy: 0.2180 - loss: 2.8713 1730/1730 ━━━━━━━━━━━━━━━━━━━━ 11s 7ms/step - accuracy: 0.3566 - loss: 2.2326 1730/1730 ━━━━━━━━━━━━━━━━━━━━ 12s 7ms/step - accuracy: 0.4425 - loss: 1.9001 1730/1730 ━━━━━━━━━━━━━━━━━━━━ 11s 7ms/step - accuracy: 0.5110 - loss: 1.6469 1730/1730 ━━━━━━━━━━━━━━━━━━━━ 12s 7ms/step - accuracy: 0.5526 - loss: 1.4746 1730/1730 ━━━━━━━━━━━━━━━━━━━━ 12s 7ms/step - accuracy: 0.6003 - loss: 1.3076 1730/1730 ━━━━━━━━━━━━━━━━━━━━ 12s 7ms/step - accuracy: 0.6386 - loss: 1.1710 1730/1730 ━━━━━━━━━━━━━━━━━━━━ 11s 7ms/step - accuracy: 0.6808 - loss: 1.0347 1730/1730 ━━━━━━━━━━━━━━━━━━━━ 11s 6ms/step - accuracy: 0.7113 - loss: 0.9224 1730/1730 ━━━━━━━━━━━━━━━━━━━━ 11s 7ms/step - accuracy: 0.7511 - loss: 0.7948 WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`.  Generating text: 100%|██████████| 200/200 [00:11<00:00, 16.95it/s] ИИ:  Привет! синий красты.  как решений оставило ключевы и рекомендации) и объединённая сильные эмоции овищение ответом ответить, что высокиз атаки из ключевы говорм. понельно заранием произойдет с их ключевых на Вы: ... ...  Хотите обучить новую модель? (да/нет): нет WARNING:absl:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model. Вы: Привет! Generating text: 100%|██████████| 200/200 [00:15<00:00, 13.10it/s] ИИ:  Привет! как работы системы болезной информативной обмене.  по многие напочтить атаки на предсказывает аборты нейросетей обмена имеют длину волны разрабатывает в этом ких моменту.  притворяются под количество Вы: Привет! Generating text: 100%|██████████| 200/200 [00:11<00:00, 17.00it/s] ИИ:  Привет! рителюный центр: «группа chatgpt файлы — пользователей, скрытые лицы и развитие до движения, филишибы, используемые он обучение нейросеть том, чтобы изображения нейросеть могут матьсить и позволило с ...

Рекомендую обучать программу в гугл коллаб. Там это происходит быстро и результат может быть лучше моего.

Я руководствовался инструкциями TensorFlow, ChatGPT мне помогал исправлять ошибки, чтобы я мог создать эту модель.

Я благодарен всем людям, даже тем, кто просто зашёл сюда ради копирования кода. Надеемся вам понравится эта программа и другие люди найдут ей практическое применение, либо модернизируют до полноценного чат-бота.

Всем удачи и до новых статей с кодом!

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Будете ли вы рассказать об этом друзьям?

0% Да0
100% Нет4
0% Буду обучать модель и скидывать файл model.h5 друзьям, чтобы удивлять их.0

Проголосовали 4 пользователя. Воздержался 1 пользователь.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Будете ли вы устраивать соревнования с моделью?

100% Не буду2
0% Буду устраивать соревнования по размеру датасета с текстом для модели0
0% Буду устраивать соревнования, у кого модель точнее обучится за 1 час на большом датасете.0

Проголосовали 2 пользователя. Воздержавшихся нет.

ссылка на оригинал статьи https://habr.com/ru/articles/846362/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *