1. Покажите эффект
В мире много прекрасного, и когда мы хотим выразить, мы всегда чувствуем, что культурного наследия недостаточно.
- Когда я увидел море, у меня было хорошее настроение, и вдруг меня охватила страсть, долго думая, я сказал: оно действительно большое!
- Когда я увидел птичье гнездо, у меня было хорошее настроение, и я почувствовал много страсти, долго думая об этом, я сказал: оно действительно большое!
- Когда я увидел красивую женщину, у меня было хорошее настроение, и меня сразу же захлестнула страсть, и, долго думая, сказал: «Она действительно большая!»
Да, это так без культурного наследия.
Однако вы родились в эпоху цифровых технологий, и культурное наследие Китая на протяжении 5000 лет находится в пределах вашей досягаемости! Этот туториал состоит в том, чтобы дать искусственному интеллекту выучить большое количество стихов, найти правила поэзии, а затем вы дадите ему несколько ключевых слов, и он даст вам стихотворение.
увидеть эффект:
Введенные ключевые слова | выходной стих |
---|---|
море, прохладный ветер | Море огромно, и вы можете услышать звук в лунном небе. В барабанном движении звучит пение, и прохладный ветер уныл. |
здание, птичье гнездо | Строительные барабаны и колокольчики напоминают, птичье гнездо носит берег Ву. Глубокий язык находится в Гаохэ, где плавают птицы. |
Красота | Красавица гуляет холодной весной, и не будет жить, когда вернется. Поднимаясь каждый день высоко и наблюдая, Иньсюань видит любовь. |
я, любовь, красота, женщина | Мое намерение долгое, и я соответственно люблю хризантемы. Красивое цветочное вино боится весны, и самка е наступает на невесту. |
босс, доска, ин, мин | Лаосуо Суочончунь, Бангэ знает о моих делах. Ин и Фуцзянь спросили о старом туре, и хороший сезон Минчжу опоздал. |
2. Этапы реализации
Основной процесс
Глядя на изображение выше, мы видим, что в основном есть два шага:тренироватьсяииспользовать.
Железо по-прежнему необходимо для удара по железу.Для наших обучающих данных мы должны сначала иметь данные.Мои данные здесь следующие:
Яркий лунный свет перед кроватью подозревается в изморози на земле, я поднимаю голову, чтобы посмотреть на яркую луну, склоняю голову и думаю о родном городе.
Это лишь небольшая часть, всего около 70 000 предложений, и все они хранятся в текстовом файле.
Обучение разделено на 3 этапа:Подготовить данные,Построить модель,тренируйся и экономь.
2.1 Подготовка данных
Любовь — это не то, что вы хотите купить, вы можете купить ее, если хотите.
Это предложение показывает, что истина мира одна и та же. Поскольку тренировки — это не то, чему вы хотите тренироваться, вы можете тренироваться, если хотите. Вы должны организовать данные в формат, требуемый фреймворком ИИ, они глупы,как числа, а TensorFlow распознает Tensor (Не пугайтесь английского, это просто ряд цифр со слоем чужих бронекорпусов).
- Данные обрабатываются впервые
- Вторая обработка данных
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
Сохраните это, это все тяжелая тренировка, вы должны дорожить ею, как своей зарплатой, потому что она пригодится потом.