基于 LSTM 模型的古诗词自动生成算法实现及系统实现

        近年来,研究者在利用循环神经网络(Recurrent Neural Network,RNN)进行古诗自动生成方面取得了显著的效果。但 RNN 存在梯度问题,导致处理时间跨度较长的序列时 RNN 并不具备长期记忆存储功能。随后,出现的基于长短期记忆网络(Long Short-Term Memory,LSTM)古诗自动生成方法在一定程度上解决了 RNN 的梯度问题。本文将LSTM 应用在古诗自动生成技术上,并利用sparse_categorical_crossentropy损失函数和Adam(lr=0.002)优化算法对 LSTM模型进行优化,最后利用 flask 设计web界面进行操作和查看,可以根据提示词生成不同结构的五言律诗、七言绝句及藏头诗。结表明,相对于传统的RNN模型,LSTM模型在古诗自动生成方面生成的古诗效果更好。

1. LSTM模型设计与实现

        古诗在中华传统文化中扮演着不可或缺的重要角色,其精炼的语言、和谐的音调和鲜明的节奏令人神往。古诗的创造讲究平仄声调、韵律严谨、绝句对仗、起承转合以及用词考究,还讲究意境的创造,要求意境优美;要通过简洁凝练的诗句表现出一定的意义,达到语美、音美、意美的效果 。这给没有文学功底的古诗爱好者在写作古诗时带来了一定的挑战,同时也促进了研究者利用现代技术对古诗自动生成的研究与开发。深度学习(Deep Learning,DL)主要应用于图像识别、语音识别和自然语言处理等领域 。深度学习是机器学习和神经网络更深层次的融合技术,其本质是众多成熟的神经网络算法模型,旨在利用计算机模拟人的大脑神经元学习过程,从而具有人的“思考”“推理”“规划”“判断”等能力。目前,利用深度学习神经网络实现古诗自动生成已成为了一大研究热点。

        基于深度学习的歌词和古诗自动生成系统由多个模块构成,总体可以分为服务于 LSTM 神经网络的数据预处理模块、LSTM 神经网络模块等。数据预处理模块主要是对34646首传统古诗进行预处理,转换成 One-Hot 编码,神经网络才能进行矩阵计算、学习。LSTM 神经网络模块是最核心的模块,该模块是歌词和古诗生成最关键的部分,训练参数的选择十分重要,需要通过不断进行对比、调参,记录损失值和准确率来最终确定模型参数。建立古诗生成模型,需要三个步骤:搭建、训练和保存。
        1.1 搭建模型::核心结构是两层 LSTM 神经网络,需要注意的是每次都定义一个新的BasicCell,而不是定义一个 BasicCell 之后多次调用。LSTM 神经网络在处理序列数据方面非常有效,虽然 RNN 与 CNN 都能进行序列建模,但本质上有不同。在搭建模型过程中还使用了 Embedding 层,称为嵌入层,相当于一个网络层,在模型第一层中使用,其目的是将有索引的标签映射到高密度低维向量,达到降维的作用,可以防止One-Hot 向量维度过大导致的运算速度过慢的问题,该层通常用于文本数据建模。使用 LSTM 神经网络模型还有一个必不可少的全连接层(Dense 层),它能够根据特征的组合进行分类,大大减少特征位置对分类带来的影响。

# 定义双层LSTM模型
model = Sequential()
model.add(Embedding(len(words), 128, input_length=78))
model.add(LSTM(128, return_sequences=True))
model.add(LSTM(128, return_sequences=True))
model.add(Dense(len(words), activation=' relu'))
optimizer = Adam(lr=0.002)
model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizer)

        由于数据集较大,模型使用 Embedding 层将样本映射成低维向量,达到降维提速的效果。Embedding 层的词表大小设置为数据集中不重复字符的总数大小,词嵌入维度设置为 128。全连接层(Dense)设计。将数据集的词表大小设置为 Dense 层的维度,并使用 relu 作为 Dense 层的激活函数。优化函数设计。本文使用 Adam 优化算法对模型进行优化。利用大量数据集进行文本生成时,参数的梯度往往比较大,而加快训练速度减小参数梯度是 Adam优化算法的核心所在 。

        1.2 训练模型::创建 session 会话进行训练,由于训练集比较大,所以歌词生成模型训练 30 个周期,古诗生成模型训练 100 个周期。输入每一轮的损失值,通过每轮训练后损失值的变化判断 LSTM 神经网络模型性能是否发生欠拟合,再比较 LSTM神经网络模型在训练集和测试集的正确率判断 LSTM 神经网络模型是否发生过拟合。若发生欠拟合则应该增加 LSTM 神经网络模型的深度或者增加训练的时间,若发生过拟合则应该采取正则化的方法或者 Dropout 抑制过拟合。

# 训练模型
for epoch in range(100):for batch_idx, (x_batch, y_batch) in enumerate(generate_batch(poetrys_vector, batch_size)):model.fit(x_batch, y_batch, verbose=0)if batch_idx % 50 == 1:print('Epoch:', epoch, 'Batch:', batch_idx, 'Loss:', model.evaluate(x_batch, y_batch, verbose=0))

        1.3 保存模型
        古诗生成模型保存为H5文件。Keras 框架使用 model.save() 方法保存模型。

# 保存模型
model.save('poetry_model.h5')

        其训练过程如下:

 

2.  基于LSTM 模型的古诗词自动生成系统

        结合 Flask 框架的 Web 应用设计实现一个简单的 AI 诗歌生成器。在该代码中包含数据预处理:从文件中读取古诗数据,并进行预处理,包括去除特殊符号、筛选古诗长度等。将古诗转换为向量形式,每个字对应一个数字 ID。创建一个数据集类,用于按批次提取数据。使用 TensorFlow 定义了一个基于 LSTM 的 模型,用于生成古诗。定义生成古诗的函数:gen_head_poetry() 函数用于生成藏头诗,接受藏头和诗的类型(五言或七言)作为输入。gen_poetry() 函数用于随机生成古诗。在接收到请求时,根据请求的内容进行处理:如果请求是 POST 请求,则从表单中获取藏头和诗的类型,并生成对应的藏头诗或随机古诗。如果请求是 GET 请求,则从 URL 参数中获取相同的信息。最后,将生成的诗返回给客户端。实现界面如下:

        该系统的功能包含用户选择框,让用户选择生成的诗歌类型(随机生成、藏头诗5言、藏头诗7言);一个输入框,让用户输入诗歌的名称或关键词,用于生成诗歌的内容。在用户点击生成按钮后,根据用户选择的诗歌类型和输入内容,生成的诗歌内容将在页面上展示出来,供用户阅读和分享。

藏头诗5言:

随机生成: 

藏头诗7言:

3.结语 

        本文主要采用 LSTM(长短期记忆网络)神经网络模型来实现古诗的自动生成。首先,通过设计和实现循环神经网络(LSTM)诗歌生成模型,包括模型结构的设计、参数的设置以及模型的训练过程。然后,根据用户输入的条件,调用相应的模型生成相应的诗歌内容,并结合 Flask 技术将生成的诗歌展示在前端界面上,供用户阅读。
完整代码及数据集链接:
https://download.csdn.net/download/weixin_40651515/89131450

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/616451.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C程序的编译

经过预处理后的源文件,退去一切包装,注释被删除,各种预处理命令也基本上被处理掉,剩下的就是原汁原味的C代码了。接下来的第二步,就开始进入编译阶段。编译阶段主要分两步:第一步,编译器调用一系列解析工具,去分析这些C代码,将C源文件编译为汇编文件;第二步,通过汇编…

【AcWing】蓝桥杯集训每日一题Day16|哈希|FloodFill算法|字典序最小|映射|1402.星空之夜(C++)

1402.星空之夜 1402. 星空之夜 - AcWing题库难度:中等时/空限制:1s / 64MB总通过数:3415总尝试数:7434来源:usaco training 5.1算法标签Flood Fill哈希DFSBFS 题目内容 夜空深处,闪亮的星星以星群的形式出…

智慧公厕功能与应用

智慧公厕是智慧城市建设中极为重要的组成部分,它以其先进的功能和智能化的应用,为市民提供舒适、便利、安全的卫生设施。下面将以智慧公厕源头实力厂家广州中期科技有限公司,大量精品案例项目现场实景实图实例,深入探讨智慧公厕的…

FRDM-MCXN947开发板之RGB灯

一、背景 RGB LED:通过红、绿、蓝三种颜色组合发光的LED,可以理解由三个不同发光属性的LED组成,这个是LCD平板显示原理的基础,一个LED相当于屏幕上面的一个像素 FRDM-MCXN947集成了一块RGB LED,它由三个GPIO口驱动&am…

从零开始写一个RTSP服务器(一)RTSP协议讲解

目录 前言一、什么是RTSP协议?二、RTSP协议详解2.1 RTSP数据格式2.2 RTSP请求的常用方法2.3 RTSP交互过程2.4 sdp格式 三、RTP协议3.1 RTP包格式3.2 RTP OVER TCP 四、RTCP 前言 为什么要写这个系列? 因为我自己在学习rtsp协议想自己从零写一个rtsp服务…

【hive】lateral view侧视图

文档地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManualLateralView 1.介绍2.语法3.code demo1)单重侧视图2)多重侧视图3)tips:lateral view outer 1.介绍 lateral view也叫侧视图,属…

【网站项目】农产品自主供销小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

【前端】layui table表格勾选事件,以及常见模块

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《前端》系列文章,每篇文章将以博主理解的角度展开讲解, 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 表格勾选事…

【自研网关】过滤器链设计

🌈Yu-Gateway::基于 Netty 构建的自研 API 网关,采用 Java 原生实现,整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施,承载请求路由、安全控制、流量治理等…

day9 | 栈与队列 part-1 (Go) | 232 用栈实现队列、225 用队列实现栈

今日任务 栈与队列的理论基础 (介绍:代码随想录)232 用栈实现队列(题目: . - 力扣(LeetCode))225 用队列实现栈 (题目: . - 力扣(LeetCode) ) 栈与队列的理论基础 栈 : 先进后出 队列: 后进先出 老师给的讲解:代码随想录 …

基于Pytorch实现图像分类——基于jupyter

分类任务 网络基本构建与训练方法,常用函数解torch.nn.functional模块nn.Module模块 MNIST数据集下载 from pathlib import Path import requestsDATA_PATH Path("data") PATH DATA_PATH / "mnist"PATH.mkdir(parentsTrue, exist_okTrue)U…

CSS核心样式-03-浮动+背景属性

目录 五、标准文档流 1. 微观现象 ①空白折叠现象 ②文字类的元素如果排在一行会出现一种高低不齐、底边对齐效果 ③自动换行 2. 元素等级 ①块级元素 ②行内元素 ③ 行内块元素 六、显示模式 display display四个属性值 脱离标准流 七、浮动属性(脱标…