基于 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java的新闻发布及管理系统的设计与实现(内附设计LW + PPT+ 源码下载)

Java新闻发布及管理系统的设计与实现 项目名称: Java新闻发布及管理系统的设计与实现 项目技术栈 该项目采用了以下核心技术栈: 后端框架/库: JSP (Java Server Pages)数据库: MySQL前端技术: B/S体系结构开发工具…

selenum操作cookie进行免登陆【爬虫必修课1】

Selenium 操作 Cookie 进行免登录 使用 Selenium 自动化登录网站是一个常见的需求。但是直接输入用户名和密码登录非常不安全,同时每次登录都需要重复这个操作也很麻烦。一个更好的方式是使用 Cookie 进行免登录。 这篇博客就来介绍如何使用 Selenium 实现 Instagram 的免登录…

Qt基本使用

0. 基本对话框 dialog.cpp #include "dialog.h" #include "ui_dialog.h"#include <QFileDialog> #include <QColorDialog> #include <QFontDialog> #include <QInputDialog>Dialog::Dialog(QWidget *parent): QDialog(parent), u…

C++ queue priority_queuestack 详解及模拟实现

1. stack的介绍和使用 1.1 stack的介绍 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容…

03攻防世界-unserialize3

根据题目可以看出&#xff0c;这是个反序列化的题目 打开网址观察题目可以看到这里是php的代码&#xff0c;那么也就是php的反序列化 本题需要利用反序列化字符串来进行解题&#xff0c;根据源码提示我们需要构造code。 序列化的意思是&#xff1a;是将变量转换为可保存或传输…

Java中的容器,线程安全和线程不安全

Java中的容器主要指Java集合框架中的一系列类&#xff0c;它们提供了存储和操作对象的能力。在讨论容器的线程安全性时&#xff0c;我们可以将其分为两大类&#xff1a; 线程安全的容器&#xff1a; Vector: 这是ArrayList的线程安全版本&#xff0c;所有方法都被同步以确保在…

小白必看的Ubuntu20.04安装教程(图文讲解)

总的来说&#xff0c;安装Ubantu包含以下三个步骤&#xff1a; 一、安装虚拟机 二、Ubuntu镜像下载 三、虚拟机配置 一、安装虚拟机 选择安装VMware Workstation&#xff0c;登录其官网下载安装包&#xff0c;安装点这里。 下载后运行安装向导&#xff0c;一直Next即可。最…

OpenCV基本图像处理操作(九)——特征匹配

Brute-Force蛮力匹配 Brute-Force蛮力匹配是一种简单直接的模式识别方法&#xff0c;经常用于计算机视觉和数字图像处理领域中的特征匹配。该方法通过逐一比较目标图像中的所有特征点与源图像中的特征点来寻找最佳匹配。这种方法的主要步骤包括&#xff1a; 特征提取&#xff…

嵌入式驱动学习第七周——pinctrl子系统

前言 pinctrl子系统用来控制每个端口的复用功能和电气属性&#xff0c;这篇博客来介绍一下pinctrl子系统。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xff0c;一起讨…

过孔的种类对比以及设计注意事项

过孔&#xff08;via&#xff09;是多层PCB的重要组成部分之一&#xff0c;一般来说&#xff0c;钻孔的费用通常占PCB制板费用的30%到40%&#xff0c;想不到吧&#xff01; 过孔的作用是将电气相连、固定和元件定位。一个过孔由三部分组成&#xff1a;孔、孔周围的焊盘区、POW…

js用发布订阅模式实现事件绑定和once 方法只订阅一次

不掌握发布定于模式的前端不是合格的前端 class EventBus {constructor() {// 缓存列表&#xff0c;用来存放注册的事件与回调this.cache {};}// 订阅事件on(name, cb) {// 如果当前事件没有订阅过&#xff0c;就给事件创建一个队列if (!this.cache[name]) {this.cache[name]…

重定向原理和缓冲区

文章目录 重定向缓冲区 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 重定向 内核中为了管理被打开的文件&#xff0c;一定会存在描述一…

蓝牙技术在智能硬件中应用火热,你的蓝牙适配测试如何解决?

蓝牙技术在物联网中的应用非常广泛&#xff0c;可以为人们的生活和工作带来更多的便利和智能化体验&#xff0c;主要五大核心应用场景&#xff0c;具体如下&#xff1a; 1、智能家居 通过蓝牙连接智能家居设备&#xff0c;如智能灯泡、智能插座、智能恒温器等&#xff0c;可以…

9【原型模式】复制一个已存在的对象来创建新的对象

你好&#xff0c;我是程序员雪球。 今天我们来学习23种设计模式之原型模式&#xff0c;在平时开发过程中比较少见。我带你了解什么是原型模式&#xff0c;使用场景有哪些&#xff1f;有什么注意事项&#xff1f;深拷贝与浅拷贝的区别&#xff0c;最后用代码实现一个简单的示例…

全球半导体排行:台积电登顶,中芯国际第24位

最新发布的《麦克莱恩报告》4月更新揭示了2023年全球前50大半导体供应商的最终排名情况&#xff0c;其中前25强名单尤为引人注目。台积电&#xff08;TSMC&#xff09;凭借强劲的市场表现和业务增长&#xff0c;成功超越其他竞争对手&#xff0c;跃居全球半导体供应商首位。与此…

C# danbooru Stable Diffusion 提示词反推 OpenVINO Demo

C# danbooru Stable Diffusion 提示词反推 OpenVINO Demo 目录 说明 效果 模型信息 项目 代码 下载 说明 模型下载地址&#xff1a;https://huggingface.co/deepghs/ml-danbooru-onnx 效果 模型信息 OVVersion { BuildNumber 2023.1.0-12185-9e6b00e51cd-releases/20…

干货!微信小程序通过NodeJs连接MySQL数据库

在前后端数据库架构的思维中&#xff0c;微信小程序的生态地位是充当前端&#xff0c;后端和数据库还需开发者另外准备。微信开放社区提供强悍的云函数、云数据库、CMS内容管理&#xff0c;无疑为开发小程序的功能提供了不少便捷。 当我们在开发PC端的系统时&#xff0c;常见的…

新闻媒体行业邮件推广:精准推送,创造价值

在当今信息爆炸的时代&#xff0c;新闻行业如何在竞争激烈的市场中脱颖而出&#xff0c;吸引读者的目光&#xff0c;成为了每个新闻机构都需要认真思考的问题。许可式邮件营销成为了一种强大的工具&#xff0c;不仅能够向订阅者发送新闻期刊&#xff0c;还能够向广告商发送宣传…

【Spring进阶系列丨第十篇】基于注解的面向切面编程(AOP)详解

文章目录 一、基于注解的AOP1、配置Spring环境2、在beans.xml文件中定义AOP约束3、定义记录日志的类【切面】4、定义Bean5、在主配置文件中配置扫描的包6、在主配置文件中去开启AOP的注解支持7、测试8、优化改进9、总结 一、基于注解的AOP 1、配置Spring环境 <dependencie…

雨伞-浅色脚本

渲染参考&#xff1a;明亮/干净/高级 静帧参考 解说 镜头时长 效果参考 中景画面展示3把竖着的浅色的伞 1s / 特写展示伞把手 1s 中景展示雨伞全貌 2s 微观镜头 缝线动画 3s 镜头旋转至伞面微观材质镜头&#xff0c;展现其多层结构 10s 微观镜头 水珠滑动在伞…