1.前言
我希望我的技术是有温度的,也许是生活已经足够冰冷。我希望赋予我的模型以生命,它们在那个虚拟世界里面的生活,又何尝不跟我们这个所谓真实的世界一样呢?所以我叫他李小白,因为我喜欢那句‘乘风破浪会有时,直挂云帆济沧海’。
2.目标
我们希望得到这样一个模型,当我输入第一个字的时候,她可以用这个字开头为我做一首诗。
3.思路
我们会让模型读上万首诗,他会从中学习到一种能力,写诗。无关意境、无关思想、只是为了好玩。我们使用LSTM循环神经网络作为隐层,基本网络结构为输入层——>LSTM——>LSTM——>输出层;
4.数据预处理
1.我们的训练数据总共有43030行,每一行代表一首诗词。格式为‘标题:内容’如下:
静夜思:床前明月光,疑是地上霜。举头望明月,低头思故乡。
2.预处理
1)将每行诗的内容(不包含标题),加入到poetrys向量中。过滤掉少于5个字的和大于79个字的诗,去掉特殊字符,每行内容添加'['、']'作为开始和结束标签。过滤完后剩下34646首诗
2)按照每行诗内容的长度,对poetrys向量进行排序
3)生成词表,按照每个字出现的次数对其进行编码,出现次数越多则编码越小
4)根据词表,将诗集poetrys转换为数字形式
5)准备训练数据,加载所有批次的数据,对于每个批次来说,x为批次数量的诗句,诗句的长度为该批次中最长的诗句长度。y为x去掉第一位重复最后一位得到的诗句。
6)使用嵌入层对每个词向量进行one-hot编码,并且编码后的向量使用隐层嵌入矩阵映射为一个稠密向量。
5.RNN网络
1.我们使用两层的LSTM网络, 隐层神经元128个。
2.优化器使用adam
3.损失函数还是选择传统的softmax,对于一个批次中的所有数据loss进行累积,然后求平均
6.训练
1.每个批次有256条数据,训练50个轮次,每隔7个轮次保存一次生成的模型。
学习率衰减为:0.002 * (0.97 ** epoch)
2.为了防止梯度爆炸和梯度消失,对于计算出来的梯度进行了截取,使用tf.clip_by_global_norm,截取率设置为5
7.预测
高阵明日自有碛,
来有纤城还惟。
谁玄骚市看情烟,
欲雨清婺纵砚山。
这个模型在GTX1050显卡上训练了20分钟,上面的例子我给出了首个字高,李小白同学就为我输出了这首诗;我自己的水平有限,不敢妄加评论。也许我们的模型没有经历过挫折与坎坷,写不出那样‘念天地之悠悠,独怆然而涕下’的诗句。但是 从本质上讲,人类通过学习知识,能出口成章,这跟模型是没有什么区别的。也许当我们真正找到自己跟模型不一样的地方的那天,我们也就找到了真正的自己吧!各位看官如果心情不好的话,看一下下面这个伟大的视频,杨超越真的超级可爱!
【火箭少女解散】杨超越告别感言太好笑了!!哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈明明是很伤心的事,看得我又哭又笑的杨超越:“我真是干啥啥不行,跟老板吵架第一名”
8.代码
1.训练代码
import collections
import numpy as np
import tensorflow as tf
# -------------------------------数据预处理---------------------------#
poetry_file = 'poetry.txt'
#poetry_file = './data/poetry.txt'
# 诗集
poetrys = []
#加载诗集到一个数组,对于特殊字符进行处理,并且对于每行诗左右添加[]
with open(poetry_file, "r", encoding='utf-8', ) as f:
for line in f:
try:
title, content = line.strip().split(':')
content = content.replace(' ', '')
if '