Pytorch实现RNN实验

news2024/11/18 3:46:51

一、实验要求

        用 Pytorch 模块的 RNN 实现生成唐诗。要求给定一个字能够生成一首唐诗。

二、实验目的

  1. 理解循环神经网络(RNN)的基本原理:通过构建一个基于RNN的诗歌生成模型,学会RNN是如何处理序列数据的,以及如何在PyTorch中实现它。
  2. 掌握文本数据的预处理技巧,并学会构建一个文本生成模型
  3. 加深对循环神经网络的了解

三、实验过程

1.搭建模型

整体思路:

        先进行文本预处理,读取诗歌数据,清理文本数据,并构建词汇表,记录每个字符的出现频率。然后将清理过的文本数据转换成模型可用的数字表示形式,并将整数表示的文本数据切分为多个序列,构建训练数据集。随后,定义一个基于RNN的模型,通过训练数据集迭代训练模型来优化模型参数。模型训练完成后可利用模型生成一定长度的新诗歌文本。

1)导入库和检查GPU可用性

导入Pytorch库并检查GPU是否可用。如果GPU可用,返回“True”

0d7c31528e784a4385fd612ac838b4fa.png

导入进行数据预处理和标记所需的库

12e03ed704584408a311bca179a0cd75.png

2)定义超参数

定义了学习率、最大训练轮次、批处理大小以及是否使用GPU的标志。

a95a519588c046c89d24463dd6a09781.png

3)数据处理

引入诗歌文件,形成诗歌数据集,并通过替换换行符和中文标点符号来清理文本

f02607369439424aafdb5fd640bdea33.png

 ‘TextConverter’类负责对文本数据进行预处理和转换

 e903211fa6bb432cb08a5a6e925d0d49.png

c3a2bdc80da948c5a2fd6dcd7224606c.png 600f40d27203467299d38899cdc0337c.png

字符到整数和整数到字符的转换方法:

  1. word_to_int方法接受一个字符作为参数,返回字符在词汇表中的整数索引。如果字符不在词汇表中,则返回词汇表大小。
  2. int_to_word方法接受一个整数索引作为参数,返回该索引对应的字符。如果索引等于词汇表大小,返回中文逗号",";如果索引小于词汇表大小,则返回对应的字符;否则,抛出异常。

 a8b8ac010c4d4a49bfb093d784705c7e.png

 

文本到数组和数组到文本的转换方法:

  1. text_to_arr方法接受一个文本字符串作为参数,返回一个由文本中每个字符对应整数索引组成的NumPy数组。
  2. arr_to_text方法接受一个整数索引数组作为参数,返回由数组中每个索引对应字符组成的字符串

 57a537561c9d4856a75704602c46afaf.png

准备数据集 

d12a2aa6f726424882c41d14fc07587e.png 

定义数据集 

87e91f85726749719c0510fbb6cde7ef.png 

4)定义RNN模型

        使用PyTorch的nn.Module定义了RNN模型的结构

        通过嵌入层将字符索引映射为密集向量,然后通过RNN层处理这些向量序列。最后,通过线性层将RNN输出映射为词汇表大小的向量。

3f2a1ecae5914cdf98c83f87c55f53c9.png

 

5)模型初始化、损失和优化器

使用交叉熵损失函数(nn.CrossEntropyLoss())来度量模型输出与实际标签之间的差异。

使用Adam优化器(torch.optim.Adam)来更新模型参数,其中学习率为Learning_rate。

f6aaf40adb784438b06c8fec3635b5d4.png

6)训练循环

通过反复迭代,模型在每个Epoch中根据训练数据调整参数,逐渐提高对中文诗歌模式的学习,使得生成的文本更符合训练数据的特征

8de168c7ffe547ed989c6af34a001d46.png

 

2.对模型进行优化、改进

1)运行程序

823bae72b8d549df8d0a91bcf0583b0d.png

根据提供的训练输出结果来看,Perplexity的数值较大,而Loss较高,说明模型在训练数据上的拟合效果相对较差。通常情况下,Perplexity较低且Loss较小的模型效果更好。

分析可能导致模型效果一般的原因:

  1. 增加模型复杂性:添加更多层或增加现有层中的隐藏单元数
  2. 使用LSTM或者GRU:捕捉序列中的长期依赖关系
  1. 调整嵌入维度:尝试不同的myRNN类中的embed_dim参数值
  2. 调整学习率
  3. 增加训练次数
  4. 实现验证集:将数据集拆分为训练集和验证集。使用验证集来监控训练过程中模型的性能。在验证损失不再下降或开始上升时停止训练。

 2)修改模型结构,使用LSTM结构

 f124531b85e64938ba4987fa516502c0.png

 

并且将训练次数增加到50

输出结果为:

f9e9d5bd2f5541289e350e87388adf0f.png

调整学习率为1e-5 ,输出

fa6f66caef28446693f81094510c70fd.png

3)实现测试集:将数据集拆分为训练集和测试集

8a0154d0a87c4bde85bbeea0d7b98bc5.png

 发现多次调参,调整Embedding层,调模型结构都没调出合适的模型,输出的诗句有很多重复的字。

4)选择将原模型增加测试集进行尝试

f390c840ac774e8893bcb837067e15ee.png

af88e781be7c4073a06608730b264df6.png

8b12628f2b6649e1be2ba53b9610f459.png 

输出结果为 

21f44249761949babbafc8e56bfd2498.png

考虑到古诗上下文之间有一定的关联性

将n_step设置为30

输出结果为

0eca6277c86d41b09676fd805cdb1c72.png

 

将n_step设置为40

输出结果为

0a2224a9ede34865a74bd8369848a1a4.png

 发现这种情况是所有实验中Loss最小的一种

四、实验结果

        经过多次调参,优化模型,发现使用RNN结构,学习率为1e-4,epochs为50,n_setp为40时,得出的Loss最小。

五、实验总结

        在修改深度学习代码,特别是从RNN迁移到LSTM的过程中,我遇到了一些挑战。首先,了解LSTM与RNN的区别和工作原理对于成功修改代码至关重要。其次,我注意到LSTM层的输入格式要求与RNN不同,需要将batch_first设置为True。在调试过程中,还遇到了一些GPU不可用的问题,通过检查CUDA是否可用、GPU驱动程序和PyTorch版本等方面找到解决方案。总的来说,通过修改代码将RNN替换为LSTM,我更深入地理解了这两者之间的差异。但是,由于自己的能力有限,在修改为LSTM后并没有成功优化模型。所以,最后还是将RNN结构模型增加测试集,得出一个相对较好的结果。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计Spark+PyTorch股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

《SparkPyTorch股票预测系统》开题报告 一、研究背景与意义 随着信息技术的飞速发展和全球金融市场的日益繁荣,股票投资已成为广大投资者的重要选择之一。然而,股票市场的复杂性和不确定性使得投资者在做出投资决策时面临巨大的挑战。传统的股票分析方…

防sql注入的网站登录系统设计与实现

课程名称 网络安全 大作业名称 防sql注入的网站登录系统设计与实现 姓名 学号 班级 大 作 业 要 求 结合mysql数据库设计一个web登录页面密码需密文存放(可以采用hash方式,建议用sha1或md5加盐)采用服务器端的验证码&#…

今天推荐一个文档管理系统 Dorisoy.Pan

Dorisoy.Pan 是一个基于 .NET 8 和 WebAPI 构建的文档管理系统,它集成了 Autofac、MediatR、JWT、EF Core、MySQL 8.0 和 SQL Server 等技术,以实现一个简单、高性能、稳定且安全的解决方案。 这个系统支持多种客户端,包括网站、Android、iO…

PID控制原理:看下这三个故事,你就明白了

一、PID的故事 小明接到这样一个任务:有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸里加水。 小明接到任务后就一直守在水缸旁边,时间长就觉…

Python | Leetcode Python题解之第450题删除二叉搜索树中的节点

题目: 题解: class Solution:def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:cur, curParent root, Nonewhile cur and cur.val ! key:curParent curcur cur.left if cur.val > key else cur.rightif cur i…

Linux学习笔记(四):组与权限、任务调度、磁盘管理、网络配置、进程管理

Linux学习笔记(四):组与权限、任务调度、磁盘管理、网络配置、进程管理 1. 组与权限 1.1 文件所有者 查看文件所有者: 使用 ls -ahl 或 ll 命令可以查看文件的详细信息,其中包括文件所有者。 修改文件所有者&…

基于SSM的定制衣服系统的设计与实现(定制衣服管理平台的设计与开发、智慧服装定制系统的设计与实现、定制衣服管理系统的设计与实现(源码+定制+参考文档)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

可视化图表与源代码显示配置项及页面的动态调整功能分析

可视化图表与源代码显示配置项及页面的动态调整功能分析 文章目录 可视化图表与源代码显示配置项及页面的动态调整功能分析1.分析图表源代码2.分析源代码显示功能**完整代码参考:** 3.分析源代码显示及动态调整**完整代码参考:** 4.分析代码编辑器及运行…

第1篇:Window日志分析----应急响应之日志分析篇

0x01 Window事件日志简介 Windows系统日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。 Windows主要有以下三类日志记录系统事件:应…

一文彻底搞懂多模态 - 多模态理解+视觉大模型+多模态检索

文章目录 技术交流多模态理解一、图像描述1. 基于编码器-解码器的方法2. 基于注意力机制的方法3. 基于生成对抗网络的方法 二、视频描述三、视觉问答 视觉大模型一、通用图像理解模型二、通用图像生成模型 多模态检索一、单模态检索二、多模态检索三、跨模态检索 最近这一两周看…

ml sys

https://zhuanlan.zhihu.com/p/65242220 sys是为了ml落地:机器学习分为若干阶段:数据收集和标定,处理数据,特征工程,编写模型,训练模型,模型管理,模型部署,其实每个阶段…

【LeetCode: 1870. 准时到达的列车最小时速 | 二分】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Reality Expansion Vault:基于Vision Pro + AI的冥想应用

在当今快节奏的生活中,人们常常感到与精神原则脱节。为了帮助用户重新与深层的智慧和洞见建立联系,一款名为Reality Expansion Vault(现实扩展库)的应用应运而生。这款专为Apple Vision Pro设计的应用,通过增强现实技术将精神智慧嵌入用户的环境中,改变人们对世界的看法。…

应用于人形手机器人超小型HarmonicDrive哈默纳科减速机

人形手机器人需要高度的精准性和灵活性以完成各种复杂的任务。减速机的应用,为其提供了关键的动力传输和运动控制支持,它能够将电机的高速旋转转换为适合人形手机器人动作的低速高扭矩输出,确保机器人的动作平稳、准确。HarmonicDrive哈默纳科…

LabVIEW回转支承间隙自动化检测系统

开发了一种基于LabVIEW软件的回转支承间隙检测系统,通过高精度传感器和数据采集卡,自动化、高效地测量回转支承的轴向间隙和径向间隙,提高了检测精度和生产质量。以下是对系统的详细描述与应用案例分析,希望能为有类似需求的开发者…

房屋水电费:重新布局,重构JS代码

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>房租水电费</title><script type"…

Windows 环境安装配置 Python 保姆级教程

Python Python 是一种解释型、高级、通用的编程语言。它由 Guido van Rossum 于 1989 年底发明&#xff0c;并于 1991 年首次发布。Python 的设计哲学强调代码的可读性和简洁的语法&#xff08;尤其是使用空格缩进来表示代码块&#xff0c;而非使用大括号或关键词&#xff09;。…

利用PDLP扩展线性规划求解能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

智慧产业城智能化总体解决方案

1. 智慧产业城项目概述 智慧产业城项目位于中国武汉高新区&#xff0c;旨在打造一个集高端住宅和商业写字楼于一体的智能化区域。项目规划净用地面积广阔&#xff0c;包含多栋超高层大楼、办公楼、酒店和公寓楼&#xff0c;预计引进众多企业&#xff0c;推动区域经济发展。 2…

搭建帮助中心:8款优质工具分享【2024年最新】

在当今数字化时代&#xff0c;优秀的客户服务已成为企业成功的关键因素之一。一个高效、易用的帮助中心不仅能够提升用户体验&#xff0c;还能有效降低客服成本&#xff0c;增强品牌忠诚度。为了帮助您搭建一个功能强大、内容丰富的帮助中心&#xff0c;我们精心挑选了8款优质工…