RNN文本生成-想为女朋友写诗(一)

  • 一、亮出效果
  • 二、实现步骤
    • 基本流程
    • 2.1 准备数据
      • 2.1.1 读取文件内容
      • 2.1.2 初步整理数据
      • 2.1.3 数据往Tensor上靠
    • 2.2 构建模型
    • 2.3 训练

一、亮出效果

世界上美好的事物很多,当我们想要表达时,总是感觉文化底蕴不够。

看到大海时,心情舒畅,顿时感觉激情澎湃,想了很久,说了句:真大啊!
看到鸟巢时,心情舒畅,顿时感觉激情澎湃,想了很久,说了句:真大啊!
看到美女时,心情舒畅,顿时感觉激情澎湃,想了很久,说了句:真大啊!

是的,没有文化底蕴就是这样。

但是,你生在这个数字时代,中华五千年的文化底蕴,你触手可及!
这篇教程就是让人工智能学习大量的诗句,找到作诗的规律,然后你给他几个关键字,他给你一首诗。

看效果

输入的关键词 输出的诗句
大海,凉风 大海阔苍苍,至月空听音。筒动有歌声,凉风起萧索。
建筑,鸟巢 建筑鼓钟催,鸟巢穿梧岸。深语在高荷,栖鸟游何处。
美女 美女步寒泉,归期便不住。日夕登高看,吟轩见有情。
我,爱,美,女 我意本悠悠,爱菊花相应。美花酒恐春,女娥踏新妇。
老,板,英,明 老锁索愁春,板阁知吾事。英闽问旧游,明主佳期晚。

二、实现步骤

基本流程






































输入







生成










古诗数据集









训练









训练结果









关键词









诗句







看上面的图,我们可以了解到,基本上就是两步:训练使用

打铁还得要铁呢,我们训练数据,首先得有数据,我这里的数据是这样的:

床前明月光 疑是地上霜 举头望明月 低头思故乡 渌水明秋月 南湖采白蘋 荷花娇欲语   ……

这只是一小部分,总共大约70000句左右,都存在一个txt文档里。

训练总共分为3步:准备数据构建模型训练并保存

2.1 准备数据

爱情不是你想买,想买就能买。

这句话揭示了世间道理是相通的。因为,训练不是你想训,想训就能训。你得把数据整理成人工智能框架要求的格式,他们很笨,喜欢数字,而且TensorFlow就认Tensor(不要被英文吓到,就是一串数字外面套一层人家的装甲壳子)。














































读入







整理字库







文字转为数字







制作输入







数字编码













制作输出







数字编码
















poetry.txt









床前明月光,明月几时有









',': 0, '光': 1, '几': 2, '前': 3, '床': 4, '时': 5, '明': 6, '月': 7, '有': 8









4 3 6 7 1 0 6 7 2 5 8









床前明月光,明月几时有









床前明月光,明月几时









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)
# 创建从非重复字符到索引的映射
char2idx = {u:i for i, u in enumerate(vocab)} # 一个字典 {'龙': 1, '龚': 2, '龛': 3, '龟': 4……},根据字能到数
# 创建从索引到非重复字符的映射
idx2char = np.array(vocab) # 一个数组 ['龙' ... '龚' '龛' '龟'],根据数能找到字
# 将训练文件内容转换为索引的数据
text_as_int = np.array([char2idx[c] for c in text]) # 全部文本转换为数字 [1020 4914 3146 ... 4731 2945    0]

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
dataset = dataset.shuffle(10000).batch(BATCH_SIZE, drop_remainder=True) # 数据当前状态:((64, 23), (64, 23))
# 获取一批训练的输入,输出
train_batch, train_labels = next(iter(dataset))

以上的代码处理,他究竟做了什么操作?看下面给出解释!

下面是原始文本

凭楼望北吟 诗为儒者禅 此格的惟仙 古雅如周颂 清和甚舜弦 冰生听瀑句 香发早梅篇 想得吟成夜 文星照楚天 牛得自由骑 春风细雨飞 水涵天影阔 山拔地形高 贾客停非久 渔翁转几遭 飒然风起处 又是鼓波涛 堂开星斗边 大谏采薇还 禽隐石中树 月生池上山 凉风吹咏思 幽语隔禅关 莫拟归城计 终妨此地闲 远庵枯叶满 群鹿亦相随 顶骨生新发 庭松长旧枝 禅高太白月 行出祖师碑 乱后潜来此 南人总不知 路自中峰上 盘回出薜萝 到江吴地尽 隔岸越山多 古木丛青霭 遥天浸白波 下方城郭近

第一刀,将它24个字符为1组切成如下(空格也算一个字符):

凭楼望北吟 诗为儒者禅 此格的惟仙 古雅如周颂
清和甚舜弦 冰生听瀑句 香发早梅篇 想得吟成夜
文星照楚天 牛得自由骑 春风细雨飞 青山青草里

第二刀,将24个字符掐头去尾形成输入输出对:

凭楼望北吟 诗为儒者禅 此格的惟仙 古雅如周颂::楼望北吟 诗为儒者禅 此格的惟仙 古雅如周颂
清和甚舜弦 冰生听瀑句 香发早梅篇 想得吟成夜::和甚舜弦 冰生听瀑句 香发早梅篇 想得吟成夜
文星照楚天 牛得自由骑 春风细雨飞 青山青草里::星照楚天 牛得自由骑 春风细雨飞 青山青草里

第三刀,将64个输入输出对作为一个批次,产生N个批次:

凭……颂::楼……颂 | 清……生::香……篇 | 夜……和::舜……冰
甚……弦::生……瀑 | 早……篇::成……得 | 发……瀑::得……细

做这些是为了什么?
就是化整为零。
70000句古诗系统一下消化不了。拆分成一首首,打包成一册册。就跟存入仓库一样,随便调取,一箱也行,一包也行,主要是这个目的。

2.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/204/565 [..............................] - ETA: 21:35 - loss: 6.7695

tips:因为epochs=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

保存好这些,这都是辛苦训练来的,你要像工资一样珍惜它,因为后边会有用。

RNN文本生成-想为女朋友写诗(一)相关推荐

  1. 利用莎士比亚数据集进行RNN文本生成的训练

    利用莎士比亚数据集进行RNN文本生成的训练 import tensorflow as tf import numpy as np from tensorflow import keras import ...

  2. 无需训练RNN或生成模型,我写了一个AI来讲故事

    作者 | Andre Ye 译者 | 弯月 出品 | AI科技大本营(ID:rgznai100) 这段日子里,我们都被隔离了,就特别想听故事.然而,我们并非对所有故事都感兴趣,有些人喜欢浪漫的故事,他 ...

  3. TensorFlow 17——ch12-Char RNN 文本生成(莎士比亚/诗词)

    代码:https://github.com/MONI-JUAN/Tensorflow_Study/15-17--RNN-LSTM-生成文本 先行知识点: TensorFlow 15--ch12-RNN ...

  4. pytorch rnn文本生成 生成小说 AI写小说1

    目录结构 Creat_novel 和Model 为空目录 Creat_novel 生成小说保存目录 Model 训路练后模型保存目录 Chinese_characters_3500.txt 是字典文件 ...

  5. 基于RNN文本生成 自动写诗歌 附代码 详细教程

    一.亮出效果 世界上美好的事物很多,当我们想要表达时,总是感觉文化底蕴不够. 看到大海时,心情舒畅,顿时感觉激情澎湃,想了很久,说了句:真大啊! 看到鸟巢时,心情舒畅,顿时感觉激情澎湃,想了很久,说了 ...

  6. 基于RNN文本生成 为男朋友写诗歌 附代码 详细教程

    一.亮出效果 世界上美好的事物很多,当我们想要表达时,总是感觉文化底蕴不够. 看到大海时,心情舒畅,顿时感觉激情澎湃,想了很久,说了句:真大啊! 看到鸟巢时,心情舒畅,顿时感觉激情澎湃,想了很久,说了 ...

  7. PaperWeekly 第二十三期 --- 机器写诗

    引言 什么是艺术? 机器的作品能否叫艺术? 机器能否取代艺术家? 这些问题,相信不同的人,会有不同的答案.很多人认为机器生成的作品只是简单的模仿人类,没有创造性可言,但是人类艺术家,不也是从模仿和学习 ...

  8. 以ChatGPT写诗为例,教你如何用AI软件创新性提问?

    想用AI软件创作出动人的诗篇吗? ChatGPT 是一款人工智能软件,可以帮助你创作鼓舞人心的诗歌.它为您提供了一个强大的平台来探索您的创意方面.通过一组简单的问题,您只需点击几下就可以生成令人惊叹的 ...

  9. TensorFlow文本生成(AI 写诗)

    俗话说的好,"熟读唐诗三百首,不会作诗也会吟".吟诗作对我是做不到的,那就训练一个模型,让它去"背书"吧,背完了再看看它学的怎么样. 当然这里的写诗肯定不会照搬 ...

最新文章

  1. MQTT的学习研究(五) MQTT moquette 的 Blocking API 发布消息服务端使用
  2. SDM管理路由器要进行的相应配置
  3. 线性代数---线性方程组
  4. Python bytes 函数 - Python零基础入门教程
  5. 13-mysql-子查询
  6. html溢出部分纵向滚动,html - 无法滚动到溢出包含的flex项目的顶部
  7. 清华大学迎来中国首位原创AI虚拟学生;百度造车:定价20万元以上;亚马逊面临 7.5 万项仲裁|极客头条...
  8. 系统学习机器学习之神经网络(五) --ART
  9. BP神经网络数据预测(excel)
  10. 我72岁开始学习python,花了一个星期--参加R语言会议有感
  11. ubuntu 20 解决软件商店不可用问题
  12. STM32L051测试 (三、I2C协议设备的添加测试)
  13. rear和length表示的循环队列
  14. 什么是预付卡及预付卡发展前景
  15. java 过滤bom头_去除bom头.java
  16. Nginx 訪问日志增长暴增出现尖刀的具体分析
  17. 开源材料数据库Materials Project
  18. 阅读笔记——软件工程的瀑布、教堂和集市
  19. java闲鱼支付系统_闲鱼: 多状态多操作的交易链路架构演进
  20. 怎么压缩多张图片?如何快速批量压缩图片?

热门文章

  1. 论文翻译与总结:Relational modeling for robust and efficient pulmonary lobe segmentation in CT scans
  2. python批量改名微信视频软件,python利用文件时间批量重命名照片和视频
  3. 获取显卡名称、显存大小 代码
  4. Android系统top指令cpu占用分析
  5. 将进酒、凉州词(两个版本)、 回乡偶书
  6. Java super关键字:super调用父类的构造方法、利用super访问父类成员
  7. 通过串口的启动信息反推VBIOS的内容
  8. win10 链接oracle11g,win10系统PLSQLDeveloper无法连接Oracle11g的解决方法
  9. px、em、rem、vh、pt 分别是什么
  10. Java-商品录入系统