第5章 基于LSTM的唐诗生成_第1页
第5章 基于LSTM的唐诗生成_第2页
第5章 基于LSTM的唐诗生成_第3页
第5章 基于LSTM的唐诗生成_第4页
第5章 基于LSTM的唐诗生成_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于LSTM的唐诗生成1文本预处理目录目标分析2构建网络3训练网络4结果分析5文本生成目前的热度不高,主要用于文本的续写,使用领域偏娱乐向。通常在媒体上见到的“机器人写作”“人工智能写作”“自动对话生成”“机器人写古诗”等,都属于文本生成的范畴。古有曹植七步成诗,今有AI七秒成诗。AI作诗的引爆点来自于2019年的AI开发者大会上,华为的刘群老师做了一段AI作诗演示,如右图所示。背景如今机器已经能够自主学习到平仄押韵等写诗技巧,使得编出来的诗在技术层面上突飞猛进。但是对于写诗AI而言,目前输入的文本只包含唐宋诗词,尚未包含形象化的自然环境,诗人胸中的喜怒哀乐,亦或是大时代里的风云变幻。AI作诗的实际运用有两种。一种是服务缺乏创作古诗基本功的人,这类人往往没有经过平仄押韵的训练。例如,看见了壮美的大瀑布,胸中一股激情奔腾,却无法吟唱出“疑是银河落九天”那样的神来之笔,又不甘心说些人尽皆知的“口头语”。如果有作诗有AI帮忙,则可以弥补平仄押韵的不足之处。另一种是激发人的联想能力。例如,张三突然有了灵感想要作诗,一首七绝,前三句一气呵成,但是最后一句想不出来。这时通过AI作诗可以帮助打开思路,补全诗句。背景循环神经网络有很多变种,LSTM网络是众多变种中的一种。经典的循环神经网络SimpleRNN结构相对简单。对于某一时刻t,理论上SimpleRNN网络应该能够记住t时刻之前见过的信息,但实际上SimpleRNN并没有学习到t时刻之前见过的信息,即无法实现长期依赖的。其原因在于梯度消失问题(vanishinggradientproblem),随着层数的增加,网络最终会因为梯度消失或梯度爆炸而变得无法训练。本案例将基于LSTM网络实现唐诗生成。LSTM在许多任务中往往能比经典的RNN表现得更好,这是因为LSTM可以学习长期依赖关系。背景利用Python和poetry.txt文本文档,可以实现以下目标。令训练好的LSTM模型可以根据给定的训练集生成诗句。令训练好的LSTM模型根据操作者输入的四字词生成诗句。本案例的总体流程图如下图所示。分析目标本案例的总体主要包括以下4个步骤。文本预处理。包括标识文本数据中诗句结束点,去除低频词以及构建文本(word)到编码(id)映射。构建网络。包括设置配置项参数,包含网络的文件名,语料文本名字以及跨度,同时生成训练数据并构建LSTM网络。训练网络。包括查看LSTM网络的学习情况,用手动输入的词生成诗句以及训练网络。结果分析。对训练结果进行结果分析,并观察网络根据输入文字生成的诗句。分析目标本案例基于Keras2.4.3、cuda10.2、cudnn7.6.5和tensorflow-gpu2.3.0环境下运行,其中tensorflow亦可以是cpu版本。本案例用的数据是经典的诗句数据集poetry.txt,整个txt文档有43031行。项目目录包含三个文件夹,分别是code、data和tmp。如下图所示。项目工程结构所有原始数据,存放在data文件夹,如下图所示。所有的代码文件存放于code文件夹,如下图所示。输出文件存放于tmp文件夹,如下图所示。项目工程结构1文本预处理目录目标分析2构建网络3训练网络4结果分析5机器不能理解每个中文汉字代表的是什么,需要将文本转换为机器能理解的形式。本案例采用独热编码one-hot的形式,将所有的文本组成一个字典,每个字就能用该字在字典里的序号表示。例如,“我爱吃香蕉”5个字,字典形式是['我','爱','吃','香','蕉'],“我”就能用[1,0,0,0,0]表示,“香蕉”用这种形式表示是一个维度为(2,5)的向量。同理,处理当前的诗句文件即将所有的字组成一个字典,诗句中的每个字都能用向量来表示。在构建LSTM网络之前,需要标识诗句的结束点、去掉数据集中低频的字和构建word到id的映射。文本预处理在每行末尾加上“]”符号,表示这首诗已经结束。给定前6个字,生成第7个字。在后面生成训练数据的时候,会以6的跨度,1的步长截取文字,生成语料。例如,“我想要吃香蕉”,以3的跨度生成训练数据是(“我想要”“吃香蕉”)。在跨度为6的句子中,前后每个字都是有关联的,如果出现了“]”符号,说明“]”符号之前的和之后的语句是没有关联的内容,分别属于两首不同的诗。标识诗句结束点在原始数据集中出现次数过低的字将被视为异常值删除,判断标准是字的出现次数小于等于2。去掉低频的字构建文本(word)到编码id的映射,使得构建网络后能利用映射关系调用数据。构建映射1文本预处理目录目标分析2构建网络3训练网络4结果分析5本案例的网络结构如右图所示,包含一个输入层、两个LSTM层,两个丢弃层和一个全连接层,激活函数采用Softmax。设置丢弃层是为了防止过拟合,若网络最终的生成结果的效果不佳,可以通过减少丢弃层的层数从而提高网络的效果。构建网络在生成训练数据之前先设置配置项参数,包含网络的文件名,语料文本名字以及跨度。设置配置项参数生成训练数据,x表示输入,y表示输出。输入信息为前6个字段,输出信息为第7个字。例如,“我想要吃香蕉啊”,输入即为“我想要吃香蕉”,输出为“啊”。之后将文字转换成向量的形式,需要注意的是,此处的生成器是一个whileTrue的无限循环过程。当输入字段长度大于文本语料字段的长度时,下标已经超过语料的长度,因此本案例在训练网络时会限制网络学习的循环次数。生成训练数据Keras框架对各种网络层layer都做了封装,仅需设置参数即可调用运行。需要注意的是,函数build_model包含在类PoetryModel中。构建LSTM网络1文本预处理目录目标分析2构建网络3训练网络4结果分析5首先需要定义一个函数,令网络在训练过程中可以打印每次迭代学习的结果,方便观察网络训练学习的进程。然后还需要定义一个函数,令网络根据操作者输入的文字生成诗句的函数。训练网络定义一个函数,令网络训练过程中每次迭代学习的结果都打印出来,需要注意,函数sample以及函数generate_sample_result均包含在类PoetryModel中。查看学习情况在训练结束后,网络会根据输入的文字生成诗句,如果输入的文字的数量小于4,将用随机文字补全,例如,输入“好耶”,则可能会随机补全成“好耶哈哈”。需要注意的是,函数predict包含在类PoetryModel中。生成诗句self.model.fit_generator()方法中的steps_per_epoch参数的值表示在一次迭代epoch中调用多少次生成器generator生成数据。number_of_epoch的值表示有多少次迭代。需要注意的是,函数train包含在类PoetryModel中。设置完train函数之后,运行主函数即可。训练网络1文本预处理目录目标分析2构建网络3训练网络4结果分析5观察每次迭代的输出结果并分析网络的学习情况。当epoch=0时,网络的训练结果基本是噪声,此时网络还不懂如何使用标点符号,如下图所示。结果分析当epoch=10时,网络已能具有一定逻辑的使用标点符号,如下图所示。当epoch=30时,网络输出的诗句标点符号明显增多,如下图所示。结果分析当epoch=60时,网络使用标点符号更具逻辑性,并且出现了四个字为一组的对偶句。“不重夜喜。夜火不溪。何何何何。何何火不。”,可惜的是这四句都是以句号结尾。如下图所示。结果分析当epoch=90时,网络已经能生成带有一定意境的语句,如下图所示。“月森流台知。影船流花照。”,尽管使用标点符号的能力较差,但是可以看出网络依旧有提升空间,本案例网络仅仅训练了100次迭代,可以通过增加迭代次数来提升训练效果。结果分析最后,输入四字词语生成诗句,分别输入“二天一流”“赛博朋克”和“狂暴飞车”三个四字词,观察生成的结果,如图5-13、图5-14以及图5-15所示。结果分析经过100次迭代之后,网络对于标点符号的放置依旧缺乏逻辑性,无视标点的逻辑性,可以看到一些读起来不错的诗句,例如,“飞香出苍雨,车浮赤经石。”相

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论