Pytorch实现RNN实验

一、实验要求

        用 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.xdnf.cn/news/1552870.html

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

相关文章

LabVIEW提高开发效率技巧----快速实现原型和测试

在LabVIEW开发中,DAQ助手(DAQ Assistant)和Express VI为快速构建原型和测试功能提供了极大的便利,特别适合于简单系统的开发和早期验证阶段。 DAQ助手:是一种可视化配置工具,通过图形界面轻松设置和管理数据…

HISTCITE分析进阶

不可否认histcite是一个很好的文献分析的工具,他能很好的找到最重要的那几篇文章,同时也能找到研究的发文趋势、研究机构和著名的研究学者等。但是它是一个很老的软件,因而很多东西都没能跟上下载的分析。我在使用过程中,尝试做一些改变使其更好用,同时也做一些记录。 1.…

C语言数组和指针笔试题(四)

目录 二维数组例题一例题二例题三例题四例题五例题六例题七例题八例题九例题十例题十一 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒个人主页 🥸🥸🥸C语言 🐿️…

vulnhub-Matrix 1靶机

vulnhub:https://www.vulnhub.com/entry/matrix-1,259/ 导入靶机,扫描IP 靶机在192.168.81.6,扫描端口 存在三个端口,有两个都是http服务,访问 80端口的网页没什么信息,31337的网页元素里有注释 ZWNobyAi…

加密与安全_HTOP 一次性密码生成算法

文章目录 HOTP 的基础原理HOTP 的工作流程HOTP 的应用场景HOTP 的安全性安全性增强措施Code生成HOTP可配置项校验HOTP可拓展功能计数器(counter)计数器在客户端和服务端的作用计数器的同步机制客户端和服务端中的计数器表现服务端如何处理计数器不同步计…

dubbo微服务

一.启动nacos和redis 1.虚拟机查看是否开启nacos和redis docker ps2.查看是否安装nacos和redis docker ps -a3.启动nacos和redis docker start nacos docker start redis-6379 docker ps二.创建三个idea的maven项目 1.第一个项目dubboapidemo 2.1.1向pom.xml里添加依赖 …

MES(软件)系统是什么?MES系统为何如此重要呢?

一、MES系统的定义与功能 MES系统是一套面向制造企业车间执行层的生产信息化管理系统,它涵盖了多种功能模块,包括但不限于: 订单管理:处理客户订单,确保生产需求与市场需求相匹配。生产调度:根据订单和生…

快乐数——双指针算法

题目链接 快乐数https://leetcode.cn/problems/happy-number/description/ 题目要求 样例 算法原理 根据上述的题目分析,我们可以知道,当重复执行 x 的时候,数据会陷入到⼀个”循环“之中。 而”快慢指针“有⼀个特性,就是在⼀个…

英文网站建设意义

英文网站建设是一项至关重要的任务,对于企业和个人而言都具有巨大的战略意义。一个精心设计的英文网站不仅可以提升品牌形象,还能够为用户提供良好的体验,从而增加流量、促进业务发展。在进行英文网站建设时,有几个关键方面需要特…

[MAUI]数据绑定和MVVM:MVVM的属性验证

一、MVVM的属性验证案例 Toolkit.Mvvm框架中的ObservableValidator类,提供了属性验证功能,可以使用我们熟悉的验证特性对属性的值进行验证,并将错误属性提取和反馈给UI层。以下案例实现对UI层的姓名和年龄两个输入框,进行表单提交验证。实现效果如下所示 View<ContentP…

五、Drf权限组件

五、权限组件 权限组件=[权限类,权限类,权限类…] 执行所有权限类的has_permission方法,通过返回True,不通过返回False 默认情况下,所有的权限类都通过,才返回True 5.1简单应用权限组件 #ext.per class MyPermission1(BasePermission):def has_permission(self, requ…

初识算法 · 双指针(1)

目录 前言&#xff1a; 双指针算法 题目一&#xff1a; ​编辑 题目二: 前言&#xff1a; 本文作为算法部分的第一篇文章&#xff0c;自然是少不了简单叭叭两句&#xff0c;对于算法部分&#xff0c;多刷是少不了&#xff0c;我们刷题从暴力过度到算法解法&#xff0c;自…

试试号称最好的7B模型(论文复现)

试试号称最好的7B模型&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 试试号称最好的7B模型&#xff08;论文复现&#xff09;概述论文原理部署与复现推理微调adapter 融合 概述 Mistral 7B 是一个新型的具有 7.3 万亿参数的大语言模型。…

sql-labs靶场第一关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①Order by判断列数 ②判断回显地方 ③爆库&#xff0c;查看数据库名称 ④爆表&#xff0c;查看security库的所有表 ⑤爆列&#xff0c;查看users表的所有…

IT新秀系列:Go语言的兴起

Go语言&#xff08;Golang&#xff09;由谷歌于2007年发起&#xff0c;并于2009年正式开源。它的诞生背景可以追溯到互联网技术的高速发展时期。那时&#xff0c;软件开发面临着多核计算、大规模并发处理、部署和维护效率低下等挑战。作为一种新型的编程语言&#xff0c;Go主要…

win11 升级报 0x80073713 错误

安装错误 - 0x80073713 通常是由于系统文件损坏或 Windows Update 组件异常引起的。‌ 这个问题可能阻止您的系统正常接收和安装更新&#xff0c;影响系统的稳定性和安全性。 可以尝试如下如下方法&#xff1a; 首先&#xff0c;您可以尝试使用命令提示符运行系统文件检查器…

四、Drf认证组件

四、Drf认证组件 4.1 快速使用 from django.shortcuts import render,HttpResponse from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.authentication import BaseAuthentication from rest_framework.exception…

.NET 一款支持冰蝎的免杀WebShell

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

在掌控板中加载人教版信息科技教学指南中的educore库

掌控板中加载educore库 人教信息科技数字资源平台&#xff08;https://ebook.mypep.cn/free&#xff09;中的《信息科技教学指南硬件编程代码说明》文件中提到“本程序说明主要供教学参考。需要可编程主控板须支持运行MicroPython 脚本程序。希望有更多的主控板在固件中支持ed…

uniapp 上了原生的 echarts 图表插件了 兼容性还行

插件地址&#xff1a;echarts - DCloud 插件市场 兼容性这块儿不知道后期会不会支持其他浏览器 H5 的话建议可以用原生的不用这个插件