Генерация текста RNN - хочу написать стихи для подруги (2): проверить результаты обучения

TensorFlow
Генерация текста RNN - хочу написать стихи для подруги (2): проверить результаты обучения

1. Покажите эффект

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

  • Когда я увидел море, у меня было хорошее настроение, и вдруг меня охватила страсть, долго думая, я сказал: оно действительно большое!
  • Когда я увидел птичье гнездо, у меня было хорошее настроение, и я почувствовал много страсти, долго думая об этом, я сказал: оно действительно большое!
  • Когда я увидел красивую женщину, у меня было хорошее настроение, и меня сразу же захлестнула страсть, и, долго думая, сказал: «Она действительно большая!»

Да, это так без культурного наследия.

Однако вы родились в эпоху цифровых технологий, и культурное наследие Китая на протяжении 5000 лет находится в пределах вашей досягаемости! Этот туториал состоит в том, чтобы дать искусственному интеллекту выучить большое количество стихов, найти правила поэзии, а затем вы дадите ему несколько ключевых слов, и он даст вам стихотворение.

увидеть эффект:

Введенные ключевые слова выходной стих
море, прохладный ветер Море огромно, и вы можете услышать звук в лунном небе. В барабанном движении звучит пение, и прохладный ветер уныл.
здание, птичье гнездо Строительные барабаны и колокольчики напоминают, птичье гнездо носит берег Ву. Глубокий язык находится в Гаохэ, где плавают птицы.
Красота Красавица гуляет холодной весной, и не будет жить, когда вернется. Поднимаясь каждый день высоко и наблюдая, Иньсюань видит любовь.
я, любовь, красота, женщина Мое намерение долгое, и я соответственно люблю хризантемы. Красивое цветочное вино боится весны, и самка е наступает на невесту.
босс, доска, ин, мин Лаосуо Суочончунь, Бангэ знает о моих делах. Ин и Фуцзянь спросили о старом туре, и хороший сезон Минчжу опоздал.

2. Этапы реализации

Предыдущий"Генерация текста RNN - хочу написать стихи для девушки (1), мы говорили о том, как обучать данные.

В этой статье давайте попробуем использовать обученные данные.

2.1 Модель восстановления

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

from numpy.core.records import array
import tensorflow as tf
import numpy as np
import os
import time
import random

# 读取字典
vocab = np.load('vocab.npy')
# 创建从非重复字符到索引的映射
char2idx = {u:i for i, u in enumerate(vocab)}
# 创建从数字到字符的映射
idx2char = np.array(vocab)
# 词集的长度,也就是字典的大小
vocab_size = len(vocab)
# 嵌入的维度,也就是生成的embedding的维数
embedding_dim = 256
# RNN 的单元数量
rnn_units = 1024

def build_model(vocab_size, embedding_dim, rnn_units, batch_size):
    model = tf.keras.Sequential([
    tf.keras.layers.Embedding(vocab_size, embedding_dim,
                              batch_input_shape=[batch_size, None]),
    tf.keras.layers.GRU(rnn_units,
                        return_sequences=True,
                        stateful=True,
                        recurrent_initializer='glorot_uniform'),
    tf.keras.layers.Dense(vocab_size)])
    return model

# 读取保存的训练结果
checkpoint_dir = './training_checkpoints'
tf.train.latest_checkpoint(checkpoint_dir)
model = build_model(vocab_size, embedding_dim, 
                    rnn_units, batch_size=1)
# 当初只保存了权重,现在只加载权重
model.load_weights(tf.train.latest_checkpoint(checkpoint_dir))
# 从历史结果构建起一个model
model.build(tf.TensorShape([1, None]))

Конечным результатом является модель, которая содержит такую ​​информацию, как входная структура, структура нейрона, выходной формат и т. д. Самое главное, что она также загружает эти веса, Эти веса сначала случайны, но после предварительного обучения они все стать способным предсказать действующее значение результата, если его вызватьmodel.summary()model.summary()Распечатайте его, это следующая структура:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_1 (Embedding)      (1, None, 256)            1377280   
_________________________________________________________________
gru_1 (GRU)                  (1, None, 1024)           3938304   
_________________________________________________________________
dense_1 (Dense)              (1, None, 5380)           5514500   
=================================================================
Total params: 10,830,084
Trainable params: 10,830,084
Non-trainable params: 0
_________________________________________________________________

О модели

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

Встраиваемый слой
Рекуператор закрытого типа ГРУ
Полностью связанный слой Плотный
Ввод текста: Мин
Месяц: 30%
День: 20%
Черепаха: 0,5%
...
Кролик: 1%

2.1.1 Слой внедрения

придать эмоцию тексту

Слова эмоциональны. Например, когда мы видим опавшие листья, нам становится грустно. Увидев Ся Юхэ, он во сне позвал императора.

Однако машину он не знает, он знает только 10101010. Компьютер реально убогий!

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

Посмотрите, как цвета представлены числами

цвет Численная величина
красный [255,0,0]
зеленый [0,255,0]
синий [0,0,255]
желтый [255,255,0]
белый [255,255,255]

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

Приходите, почитайте со мной: красный + зеленый = желтый.

В цифрах это: [255,0,0]+[0,255,0] = [255,255,0]

Это сложно? Вроде ничего сложного, пока цифры хорошие, скамейка может бегать ногами.

Когда дело доходит до текста, то же самое верно и для встроенного слоя.

Цвет выше представлен 3 измерениями, а слой внедрения имеет больше измерений.В нашем коде слой внедрения имеет размерность 256.

Каждое слово имеет 256 измерений для его представления. Например, представление слов «айтишник» и «ИТ-специалист».

IT мужчина
ИТ-индустрия: 100%
Мужчина: 100%
Клетчатая рубашка: 20%
...
Будет флиртовать: 0,01%
IT-практики
ИТ-индустрия: 100%
Мужчины: 35,1%
Плед: 30%
...
Будет флиртовать: 5%

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

Видите ли, таким образом компьютер понимает взаимосвязь между словами.

Это вклад встраиваемого слоя.

Когда мы вводим текст, благодаря предыдущему обучению, эти тексты имеют эти размеры.

С размером слова нейронная сеть может условно делать выводы для прогнозов.

2.1.2 Рекуператор закрытого типа ГРУ

Его девушка всегда помнит вещи, которые раздражали его на протяжении многих лет, и детали ясны.

Заполняющий вопрос: Я сидел на обочине и курил сигарету.Вдалеке мужчина достал сигарету, ловко взял одну в рот, коснулся кармана куртки, похлопал по карману брюк.Он покачал головой и сказал мне Когда он пришел, он сказал: Брат, _____.

Что заполнить пробел, пожалуйста?

Подойди и кричи со мной:Одолжите огонь.

Зачем? Вы когда-нибудь спрашивали себя, почему вы можете ответить на него.

Если вопрос: Он покачал головой и подошел ко мне, он сказал: Брат, _____.

Вы можете сделать это правильно? Вы точно знаете, как ответить? Почему это?

Это из-за памяти. Передняя и задняя часть текста связаны. Мы называем это контекстом. Вы видели это в коде, называемом контекстом.

Вы сначала понимаете текст, а еще у вас есть память, поэтому вы можете предсказать, что будет дальше.

Мы решили проблему понимания машины выше, но она также должна иметь память, как и мы.

Этот слой GRU имеет дело с памятью.

Его обработка относительно продвинута, и он сохраняет только память, относящуюся к результату, и игнорирует все нерелевантные слова.

После обучения и обработки предполагаемая проблема становится такой:

Заполните пропуск: Я курил, мужчина вынул сигарету и сунул в рот, покачал головой, сказал: Брат, _____. Ответ: одолжить огонь.

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

2.1.3 Плотный полносвязный слой

Слабая вода три тысячи, только одну ложку возьми.

Здесь это фактически классификатор.

Когда мы его создадим, код будет выглядеть такDense(5380)Dense(5380).

Структура его сетевого слоя в последовательности следующая:

dense_1 (Dense)              (1, None, 5380)           5514500   

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

Например, распознавание цифр 0–9, у меня есть 500 нейронов, участвующих в оценке, но конечный результат — 10 каналов (0, 1, 2, 3, 4, 5, 6, 7, 8, 9).

Опознавательные буквы 26 каналов.

Текст, который мы здесь тренируем, более 70 000 предложений, всего 5380 типов символов, то есть 5380 каналов. При входных данных выходом является вероятность каждого слова.

следующее слово будет
следующее слово будет
следующее слово будет
следующее слово будет
следующее слово будет
яркий
Месяц: 30%
День: 20%
Черепаха: 0,5%
...
Кролик: 1%

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

2.2 Прогнозные данные

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

Ниже приведен пример предсказания следующего слова из одного слова.

start_string = "大"
# 将起始字符串转换为数字
input_eval = [char2idx[s] for s in start_string]
print(input_eval) # [1808]
# 训练模型结构一般是多套输入多套输出,要升维
input_eval = tf.expand_dims(input_eval, 0)
print(input_eval) # Tensor([[1808]])

# 获得预测结果,结果是多维的
predictions = model(input_eval)
print(predictions) 
'''
输出的是预测结果,总共输入'明'一个字,输出分别对应的下一个字的概率,总共有5380个字
shape=(1, 1, 5380)
tf.Tensor(
[[[ -3.3992984    2.3124864   -2.7357426  ... -10.154563 ]]])
'''

# 预测结果,删除批次的维度[[xx]]变为[xx]
predictions1 = tf.squeeze(predictions, 0)
# 用分类分布预测模型返回的字符,从5380个字中根据概率找出num_samples个字
predicted_ids = tf.random.categorical(predictions1, num_samples=1).numpy()
print(idx2char[predicted_ids])  # [['名']]

Ниже приведен пример создания тибетского стихотворения.

# 根据一段文本,预测下一段文本
def generate_text(model, start_string, num_generate=6):

  # 将起始字符串转换为数字(向量化)
  input_eval = [char2idx[s] for s in start_string]
  # 上面结果是[2,3,4,5]

  # 训练模型结构一般是多套输入多套输出,要升维
  input_eval = tf.expand_dims(input_eval, 0)
  # 上结果变为[[2,3,4,5]]

  # 空字符串用于存储结果
  text_generated = []

  model.reset_states()
  for i in range(num_generate):
      # 获得预测结果,结果是多维的
      predictions = model(input_eval)
      # 预测结果,删除批次的维度[[xx,xx]]变为[xx,xx]
      predictions = tf.squeeze(predictions, 0)
      # 用分类分布预测模型返回的字符
      predicted_id = tf.random.categorical(predictions, num_samples=1)[-1,0].numpy()
      # 把预测字符和前面的隐藏状态一起传递给模型作为下一个输入
      input_eval = tf.expand_dims([predicted_id], 0)
      # 将预测的字符存起来
      text_generated.append(idx2char[predicted_id])

  # 最终返回结果
  return start_string+''.join(text_generated)

#%%
s = "掘金不止"
array_keys = list(s)
all_string = ""
for word in array_keys:
  all_string = all_string +" "+ word
  next_len = 5-len(word)
  print("input:",all_string)
  all_string = generate_text(model, start_string=all_string, num_generate = next_len)
  print("out:",all_string)

print("最终输出:"+all_string)
# %%

'''
input:  掘
out:  掘隼曳骏迟
input:  掘隼曳骏迟 金
out:  掘隼曳骏迟 金马徒自举
input:  掘隼曳骏迟 金马徒自举 不
out:  掘隼曳骏迟 金马徒自举 不言巧言何
input:  掘隼曳骏迟 金马徒自举 不言巧言何 止
out:  掘隼曳骏迟 金马徒自举 不言巧言何 止足知必趣
最终输出: 掘隼曳骏迟 金马徒自举 不言巧言何 止足知必趣

'''

В приведенном выше примере демонстрируется стихотворение со скрытой головой «Бесконечные золотые самородки»:

Больше, чем Nuggets·Modern·TF Boy
копатьХаябуки Джунчи
золотоНачальная загрузка всадника
НетЧто сказать
конецЗнания должны быть интересны