循环神经网络系列(六)基于LSTM的唐诗生成

2024-03-30 00:08

本文主要是介绍循环神经网络系列(六)基于LSTM的唐诗生成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


1. 思路

这个示例在很多地方都出现过,对于学习理解LSTM的原理极有帮助,因此我们下面就来一步一步地弄清楚其中的奥秘所在!

对于循环神经网络来说,我们首先需要做的仍旧是找到一种将数据序列化的方法。当然,对于古诗词来说,每个字的出现顺序就是天然的一个序列,因此我们就可以直接按照这个序列来处理。并且一首古诗词可以看成是一个样本(为了叙述方便,我们下面仅以一首诗的第一句为例子),例如[[床前明月光],[小时不识月]]为两个样本。

1.1 网络训练模型

现在暂时假设我们的训练集中只有两个样本x=[[床前明月光],[小时不识月]],那么想想此时对应的标签应该是什么?回想一下,我们的目的是利用循环网络来写诗,也就是说当我们把模型训练好了之后,直接喂给模型第一个字,它就能写出一句(或一首)诗了;既然如此,那么我们的训练过程就应该是学习每首古诗中,所有字的一个出现顺序。所以,对于床前明月光这个样本来说,其对应的标签值就应该是前明月光光。由此可知,我们的网络模型就应该大致长这样:

接下来,为了能更清晰的叙述网络结构而不被其它因素影响,我们在这个小节中就直接用一个汉字来表示一个维度(实际中要将一个汉字转为n维的词向量)。此时,训练样本的维度就应该是shape=[2,5,1]。在这个示例中,我们采用了两层的LSTM网络外加一个softmax的全连接层,并且LSTM网络的输出维度output_size=32,于是我们就可以画出下面这个网络示意图:

从图中可以看到,第一步:我们是将shape = [2,5,1]的训练集喂给LSTM网络,然后从网络得到shape=[2,5,32]的输出;第二步:我们将LSTM网络得到的输出reshape成[10,32]的矩阵;第三步:再将上一步的结果喂给最后一个softmax全连接网络,这样就能完成对于每个字的分类任务了。

对于第二步为什么要reshape然后喂给第三部的全连接网络,我们可以这样想:假如是一个样本的话,那么LSTM的输出大小就为[1,5,32],也就是说第一步喂进去的每一个字通过LSTM这个网络处理之后都变成一个[1,32]的向量化表示方式,只是第2个字保留了第一个字里面的信息,第3个字保留了跟前面的信息等等。这也就有点类似于卷积网络中先用卷积层对图片进行特征提取,然后再做一个分类处理。于是乎我们就可以发现,其实LSTM网络的本质也是在做一个特征提取的工作,区别于卷积网络的就是:卷积网络提取的是基于空间上的特征,而循环网络提取的是基于时间序列上的特征。至于最后以层,该分类就分类处理,该回归就回归处理。

1.2 网络预测模型

当网络经过训练完成后就可以拿来预测了,只不过在预测的时候我们喂给网络的就只是一个字了;然后用当前预测得到的字作为下一个字;如下图所示:

1.3 数据处理

经过上面的讲解,我们大致明白了基于LSTM网络古诗生成原理:先用LSTM做特征提取,然后分类。既然最后我们要完成的是一个分类任务,那么我们不得不做的就是将所有的类别给整理处理,也就是所有的数据集中一共包含了多少个不同的字,因为我们来做的就是根据上一个字预测下一个字。

同时由于我们处理的是文本信息,因此我们需要将每个字都采用词(字)向量的形式表示,由于没有现成的词向量,所有我们要再LSTM的前面假加入一个词嵌入层。

最后,为了避免最终的分类数过于庞大,可以选择去掉出现频率较小的字,比如可以去掉只出现过一次的字。

总结一下数据预处理的步骤:

  • 1.统计出所有不同的字,并做成一个字典;
  • 2.对于每首诗,将每个字、标点都转换为字典中对应的编号,构成X;
  • 3.将X整体左移动以为构成Y

2. 代码讲解

在此首先感谢Github上的jinfagang,hzy46这两位作者,因为整体代码都是参照的他们的,加了一点点自己的元素。

2.1 数据预处理

先来看看原始的数据集长什么样:

首春:寒随穷律变,春逐鸟声开。初风飘带柳,晚雪间花梅。碧林青旧竹,绿沼翠新苔。芝田初雁去,绮树巧莺来。
初晴落景:晚霞聊自怡,初晴弥可喜。日晃百花色,风动千林翠。池鱼跃不同,园鸟声还异。寄言博通者,知予物外志。

而我们需要得到的是类似于这样的:

X:
[[1,4,6,3,2,5,3,0,0,0],[5,6,4,3,9,1,0,0,0,0]]Y:
[[4,6,3,2,5,3,0,0,0,0],[6,4,3,9,1,0,0,0,0,0]]

其中的0表示,我设定了一首诗的最大长度,如果不足就补0(因为每首诗的长度不一样);而其它的数字则表示诗中每个字以及标点在字典中的索引。同时,为了后面的生成诗时候的转换,我们还需要得到字典。

而这只需要tensorflow中的几行代码就能搞定(友情提示:在统计词频使用Counter()这个类时,对于同一词频的词在字典中的排列顺序window平台和linux平台的处理结果不一样)。以下只是部分代码,完整参见源码中的data_helper.py模块

    vocab_processor = VocabularyProcessor(max_document_length

这篇关于循环神经网络系列(六)基于LSTM的唐诗生成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/860013

相关文章

Django HTTPResponse响应体中返回openpyxl生成的文件过程

《DjangoHTTPResponse响应体中返回openpyxl生成的文件过程》Django返回文件流时需通过Content-Disposition头指定编码后的文件名,使用openpyxl的sa... 目录Django返回文件流时使用指定文件名Django HTTPResponse响应体中返回openp

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到