Генерация текста RNN - хочу написать стихи для девушки (1): обучающий текст

TensorFlow
Генерация текста RNN - хочу написать стихи для девушки (1): обучающий текст

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

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

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

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

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

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

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

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

Основной процесс

входить
генерировать
Набор данных древней поэзии
тренироваться
результаты обучения
Ключевые слова
стих

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

Железо по-прежнему необходимо для удара по железу.Для наших обучающих данных мы должны сначала иметь данные.Мои данные здесь следующие:

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

Это лишь небольшая часть, всего около 70 000 предложений, и все они хранятся в текстовом файле.

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

2.1 Подготовка данных

Любовь — это не то, что вы хотите купить, вы можете купить ее, если хотите.

Это предложение показывает, что истина мира одна и та же. Поскольку тренировки — это не то, чему вы хотите тренироваться, вы можете тренироваться, если хотите. Вы должны организовать данные в формат, требуемый фреймворком ИИ, они глупы,как числа, а TensorFlow распознает Tensor (Не пугайтесь английского, это просто ряд цифр со слоем чужих бронекорпусов).

  1. Данные обрабатываются впервые
Читать
Организация шрифтов
Преобразование текста в числа
poetry.txt
Яркий лунный свет перед кроватью, когда светит луна
',': 0, 'свет': 1, 'день': 2, 'до': 3, 'постель': 4, 'час': 5, 'мин': 6, 'месяц': 7, 'да ' ': 8
4 3 6 7 1 0 6 7 2 5 8
  1. Вторая обработка данных
внести вклад
цифровое кодирование
сделать вывод
цифровое кодирование
Яркий лунный свет перед кроватью, когда светит луна
Яркий лунный свет перед кроватью, когда яркая луна
4 3 6 7 1 0 6 7 2 5
упакован в набор данных
До яркого лунного света, когда будет яркая луна?
3 6 7 1 0 6 7 2 5 8

2.1.1 Чтение содержимого файла

import tensorflow as tf
import numpy as np
import os
import time
# 从硬盘或者网络连接读取文件存到的.keras\datasets下,这里是把数据集poetry.txt放到了C盘根目录下
path_to_file = tf.keras.utils.get_file("poetry.txt","file:///C:/poetry.txt")
# 读取文本内容
text = open(path_to_file, 'rb').read().decode(encoding='gbk')
# 打印出来
print(text) # 凭楼望北吟 诗为儒者禅 此格的惟仙 古雅如周颂 清和甚舜弦 冰生听瀑句 香发早梅篇……

2.1.2 Предварительная расстановка данных

Основная функция: Оцифровка текста.

# 列举文本中的非重复字符即字库
# 所有文本整理后,就是这么多不重复的字 ['龙', '龚', '龛', '龟'……]
vocab = sorted(set(text)) 
# 把这个字库保存到文件,以后使用直接拿,不用再去计算
np.save('vocab.npy',vocab) 
# 创建从非重复字符到索引的映射
# 一个字典 {'龙': 1, '龚': 2, '龛': 3, '龟': 4……},根据字能到数
char2idx = {u:i for i, u in enumerate(vocab)} 

# 创建从索引到非重复字符的映射
idx2char = np.array(vocab) # 一个数组 ['龙' ... '龚' '龛' '龟'],根据数能找到字
# 将训练文件内容转换为索引的数据
# 全部文本转换为数字 [1020 4914 3146 ... 4731 2945    0]
text_as_int = np.array([char2idx[c] for c in text]) 

2.1.3 Использование данных Tensor

Основная функция: разделить число на несколько частей.

# 处理一句段文本,拆分为输入和输出两段
def split_input_target(chunk):
    input_text = chunk[:-1] # 尾部去一个字
    target_text = chunk[1:] # 头部去一个字
    return input_text, target_text # 入:大江东去,出:大江东,江东去
    
# 创建训练样本,将转化为数字的诗句外面套一层壳子,原来是[x]
char_dataset = tf.data.Dataset.from_tensor_slices(text_as_int)
# 所有样本中,每24个字作为一组
sequences = char_dataset.batch(24, drop_remainder=True) # 数据当前状态:((24,x))
# 将每24个字作为一组所有样本,掐头去尾转为输入,输出结对
dataset = sequences.map(split_input_target) # 数据当前状态:((23,x), (23,x))

# 将众多输入输出对打散,并64个为一组
BATCH_SIZE = 64
# 数据当前状态:((64, 23), (64, 23))
dataset = dataset.shuffle(10000).batch(BATCH_SIZE, drop_remainder=True) 
# 获取一批训练的输入,输出
train_batch, train_labels = next(iter(dataset))

Что именно он сделал с приведенной выше обработкой кода? Объяснение смотрите ниже!

Ниже оригинальный текст

Глядя на север от здания и читая стихи конфуцианского дзэн, единственные бессмертные этого стиля причудливы и причудливы, такие как Чжоу Сунцин и Цзинь Шунь Сяньбиншэн Слушая фразу водопада, ароматную и посылая раннюю сливовую главу, Я хочу читать ее в ночи, звезды, и чутянский скот может свободно ездить под весенним ветром и моросящим дождем.Вода, небо, тени, широкие горы, высокая местность, высокая остановка Цзяке, не - долгая рыбацкая очередь, порыв ветра, барабан, волны, звезды, звезды, большой совет, птицы, затаившиеся камни, деревья, луна, пруд и прохладный ветер, дующий с горы .Говоря о перевале Дзэн, не планируйте возвращаться в город.В конце концов,это пустая трата времени здесь.Увядшие листья монастыря полны оленей.С теменных костей,растут новые волосы.На вершине пик, я достал редьку до конца земли Цзяну.На другой стороне берега было много гор и вековых деревьев, и зеленый туман был далеко.Небо было пропитано белыми волнами.

Для первого ножа разрежьте его на группы по 24 символа следующим образом (пробел также считается символом):

  • Глядя на север от здания, пение стихов - это конфуцианский дзен, этот стиль бессмертен, такой же причудливый, как Чжоу Сун.
  • Цинхэ Цзиньшуньсянь Биншэн слушает предложение водопада Ароматные волосы в начале сливовой главы
  • Вэнь Синчжао Чутянь, скот свободно скачет, весенний ветерок и морось летят по зеленым холмам и зеленой траве.

Второй нож должен зажать 24 символа от головы до хвоста, чтобы сформировать пару ввода-вывода:

  • Чтение стихов из здания, обращенного на север, — это конфуцианский дзэн, этот стиль бессмертен, такой же причудливый, как Чжоу Сун.
  • Qinghe Jinshunxian Bingsheng слушает предложение водопада Ароматные волосы ранней сливы, думает об этом в ночи
  • Вэнь Синчжао Чутянь, крупный рогатый скот может свободно ездить, весенний ветерок и моросящая муха на зеленых холмах и траве

Третий нож, используя в качестве пакета 64 пары ввода-вывода, генерирует N пакетов:

  • By... Ode:: Lou... Ode | Qing... Life:: Fragrance...
  • Even...string:::sheng...waterfall | Early...article::cheng...de

Для чего они? Это просто в ноль. Система из 70 000 древних стихов не может переварить это сразу. Разделите его на части и упакуйте в тома. Точно так же, как хранение на складе, вы можете получить его по желанию, либо в коробке, либо в упаковке, в основном для этой цели.

2.2 Построение модели

О модели — это длинная история, и мне особо нечего о ней сказать.

Ну ты сначала скопируй код и почитай комментарии.

Чтобы узнать больше о структуре модели, нажмите здесьГенерация текста RNN - хочу написать стихи для подруги (2)".

# 构建一个模型的方法
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

# 词集的长度,也就是字典的大小
vocab_size = len(vocab)
# 嵌入的维度,也就是生成的embedding的维数
embedding_dim = 256
# RNN 的单元数量
rnn_units = 1024

# 整一个模型
model = build_model(
  vocab_size = len(vocab),
  embedding_dim=embedding_dim,
  rnn_units=rnn_units,
  batch_size=BATCH_SIZE)

# 损失函数
def loss(labels, logits):
      return tf.keras.losses.sparse_categorical_crossentropy(labels, logits, from_logits=True)

# 配置优化器和损失函数
model.compile(optimizer='adam', loss=loss)

2.3 Обучение

Обучение так же просто, как кричать «огонь» и «запуск».

# 训练结果保存的目录
checkpoint_dir = './training_checkpoints'
# 文件名 ckpt_训练轮数
checkpoint_prefix = os.path.join(checkpoint_dir, "ckpt_{epoch}")
# 训练的回调
checkpoint_callback=tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_prefix, save_weights_only=True)
# 进行训练
history = model.fit(dataset, epochs=20, callbacks=[checkpoint_callback])

Это то, что происходит после начала тренировки.

Epoch 1/20
  4/565 [..............................] - ETA: 21:35 - loss: 6.7695

Советы: Поскольку эпохи = 20, нам нужно тренироваться 20 раундов. Но знаете ли вы, как появилось число 4/565?

Всего в нашем тексте 867852 символа, 24 символа в группе, 64 группы в пакете, 867852/24/64=565. То есть для обучения одной партии за раз требуется 565 партий за один раунд.

После завершения обучения будет сгенерирован файл в каталоге training_checkpoints того же уровня:

checkpoint
ckpt_1.data-00000-of-00001
ckpt_1.index
……
ckpt_20.data-00000-of-00001
ckpt_20.index

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