8-й сезон Игры престолов действительно разочаровал, и казалось, что режиссеры не смогли изучить закономерности из предыдущих сезонов, но не волнуйтесь, LSTM никогда не пропускают шаблон и помогут вам создать лучший сценарий, сценарий, созданный ИИ.

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

Концептуальный LSTM

Сеть LSTM - это рекуррентная нейронная сеть, которая имеет блоки ячеек LSTM вместо наших обычных слоев нейронной сети. Эти ячейки имеют разные сегменты, называемые входным вентилем, вентилем забывания и выходным вентилем, как показано на изображении ниже.

На приведенном ниже изображении показано, как работают ворота, и математические уравнения, задействованные в каждом из ворот, что делает их функции важными и выполнимыми.

Реализация и код

В ней мы создадим РНС для персонажей, обученную на Анне Карениной, которая будет заменена объединенными сценариями 3-го и 4-го сезонов Игры престолов после завершения обучения и тестирования первого. После этого он сможет сгенерировать новый текст на основе текста из сценариев сезона.

import time
from collections import namedtuple
import numpy as np
import tensorflow as tf

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

with open('anna.txt', 'r') as f:
    text=f.read()
vocab = sorted(set(text))
vocab_to_int = {c: i for i, c in enumerate(vocab)}
int_to_vocab = dict(enumerate(vocab))
encoded = np.array([vocab_to_int[c] for c in text], dtype=np.int32)

После того, как мы закончим этот шаг, мы перейдем к генерации мини-пакетов для процесса обучения, и мы будем кодировать следующим образом:

Изготовление партий для обучения-

Примечание -

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

После определения функции, которая будет генерировать наши мини-пакеты, мы теперь создадим наши наборы данных с размером пакета из 10 и 50 шагов последовательности.

batches = get_batches(encoded, 10, 50)
x, y = next(batches)

Теперь это та часть, с которой мы начнем строить сеть, и для упрощения процесса мы разделим ее на части, чтобы было удобнее проектировать и понимать каждый бит. Позже мы можем объединить их во всю сеть.

Создание входов

Мы начнем с создания входных заполнителей для обучающих данных и целей, а также заполнителя для выпадающих слоев.

Ячейка LSTM

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

Выход

Мы почти закончили, и нам просто нужно объединить выход ячеек RNN с полностью подключенным слоем с выходом softmax. Вывод softmax предоставляет нам распределение вероятностей, которое мы можем использовать для предсказания следующего персонажа.

Потери и оптимизатор

Использование Cross-Entropy Loss и Adam Optimizer на этапе обучения.

def build_loss(logits, targets, lstm_size, num_classes):
    
    y_one_hot = tf.one_hot(targets, num_classes)
    y_reshaped = tf.reshape(y_one_hot, logits.get_shape())
    
    loss = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_reshaped)
    loss = tf.reduce_mean(loss)
    return loss
def build_optimizer(loss, learning_rate, grad_clip):
    
    tvars = tf.trainable_variables()
    grads, _ = tf.clip_by_global_norm(tf.gradients(loss, tvars), grad_clip)
    train_op = tf.train.AdamOptimizer(learning_rate)
    optimizer = train_op.apply_gradients(zip(grads, tvars))
    
    return optimizer

После того, как мы закодировали весь вышеперечисленный материал, пришло время объединить их все для нашей последней части -

Обучение сети

Вот обычный обучающий код, который дает входные данные и цели в сеть при запуске оптимизатора. Сюда получаем терминальную позицию LSTM для мини-партии. Затем мы передаем эту позицию обратно в сеть, чтобы следующий пакет мог сохранить позицию из более раннего пакета.

Результат-

checkpoint = tf.train.latest_checkpoint('checkpoints')
samp = sample(checkpoint, 10000, lstm_size, len(vocab), prime="Far")
print(samp)

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



Игра престолов NewScript Time

Теперь, когда вы узнали, как использовать LSTM для создания новой книги, просто загрузите субтитры каждого эпизода и скрепите их вместе, чтобы сформировать сезон.

Как только вы это сделаете, замените anna.text в моем репозитории на свой собственный текстовый файл эпизода / эпизодов / сезона / сезонов.

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

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