Pytorch实现RNN实验
一、实验要求
用 Pytorch 模块的 RNN 实现生成唐诗。要求给定一个字能够生成一首唐诗。
二、实验目的
- 理解循环神经网络(RNN)的基本原理:通过构建一个基于RNN的诗歌生成模型,学会RNN是如何处理序列数据的,以及如何在PyTorch中实现它。
- 掌握文本数据的预处理技巧,并学会构建一个文本生成模型
- 加深对循环神经网络的了解
三、实验过程
1.搭建模型
整体思路:
先进行文本预处理,读取诗歌数据,清理文本数据,并构建词汇表,记录每个字符的出现频率。然后将清理过的文本数据转换成模型可用的数字表示形式,并将整数表示的文本数据切分为多个序列,构建训练数据集。随后,定义一个基于RNN的模型,通过训练数据集迭代训练模型来优化模型参数。模型训练完成后可利用模型生成一定长度的新诗歌文本。
1)导入库和检查GPU可用性
导入Pytorch库并检查GPU是否可用。如果GPU可用,返回“True”

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

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

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

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


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

文本到数组和数组到文本的转换方法:
- text_to_arr方法接受一个文本字符串作为参数,返回一个由文本中每个字符对应整数索引组成的NumPy数组。
- arr_to_text方法接受一个整数索引数组作为参数,返回由数组中每个索引对应字符组成的字符串

准备数据集
定义数据集
4)定义RNN模型
使用PyTorch的nn.Module定义了RNN模型的结构
通过嵌入层将字符索引映射为密集向量,然后通过RNN层处理这些向量序列。最后,通过线性层将RNN输出映射为词汇表大小的向量。

5)模型初始化、损失和优化器
使用交叉熵损失函数(nn.CrossEntropyLoss())来度量模型输出与实际标签之间的差异。
使用Adam优化器(torch.optim.Adam)来更新模型参数,其中学习率为Learning_rate。

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

2.对模型进行优化、改进
1)运行程序

根据提供的训练输出结果来看,Perplexity的数值较大,而Loss较高,说明模型在训练数据上的拟合效果相对较差。通常情况下,Perplexity较低且Loss较小的模型效果更好。
分析可能导致模型效果一般的原因:
- 增加模型复杂性:添加更多层或增加现有层中的隐藏单元数
- 使用LSTM或者GRU:捕捉序列中的长期依赖关系
- 调整嵌入维度:尝试不同的myRNN类中的embed_dim参数值
- 调整学习率
- 增加训练次数
- 实现验证集:将数据集拆分为训练集和验证集。使用验证集来监控训练过程中模型的性能。在验证损失不再下降或开始上升时停止训练。
2)修改模型结构,使用LSTM结构

并且将训练次数增加到50
输出结果为:

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

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

发现多次调参,调整Embedding层,调模型结构都没调出合适的模型,输出的诗句有很多重复的字。
4)选择将原模型增加测试集进行尝试


输出结果为

考虑到古诗上下文之间有一定的关联性
将n_step设置为30
输出结果为

将n_step设置为40
输出结果为

发现这种情况是所有实验中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结构模型增加测试集,得出一个相对较好的结果。
相关文章:
Pytorch实现RNN实验
一、实验要求 用 Pytorch 模块的 RNN 实现生成唐诗。要求给定一个字能够生成一首唐诗。 二、实验目的 理解循环神经网络(RNN)的基本原理:通过构建一个基于RNN的诗歌生成模型,学会RNN是如何处理序列数据的,以及如何在…...
四、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…...
C++:静态成员
静态成员涉及到的关键字尾static 静态成员变量要在类外初始化 去掉static关键字类型类名::变量名 静态成员变量不属于任何对象 所有对象共享一份 静态成员可以不通过对象直接访问 类名::成员名 静态成员依旧受访问修饰符的约束 …...
28 Vue3之搭建公司级项目规范
可以看到保存的时候ref这行被提到了最前面的一行 要求内置库放在组件的前面称为auto fix,数组new arry改成了字面量,这就是我们配置的规范 js规范使用的是airbnb规范模块使用的是antfu 组合prettier&eslint airbnb规范: https://github…...
【pytorch】张量求导3
再接上文,补一下作者未补完的矩阵运算的坑。 首先贴一下原作者的图,将其转化为如下代码: import torch import torch.nn as nn import torch.optim as optim# 定义一个简单的两层神经网络 class TwoLayerNet(nn.Module):def __init__(self):super(TwoLayerNet, self).__in…...
Servlet——springMvc底层原理
我们也先了解一下什么的动态资源,什么是静态资源。 静态资源:无需程序运行就可以获取的资源(照片、html、css、js等) 动态资源:需要通关程序运行才可以获得的资源。 (其实动态、静态的资源都与Servlet有…...
Json 在线可视化工具,分享几个
文章目录 1.json.cn2.json4u.cn3.jsonvisual.com4.jsoncrack5.altearius.github.io6.json.wanvb.com 前序:本文是对多种 Json 在线可视化工具 的介绍、分享。Json官网 https://www.json.org/json-en.html 个人比较中意第四款: https://jsoncrack.com/ed…...
LLM | llama.cpp 安装使用(支持CPU、Metal及CUDA的单卡/多卡推理)
1. 详细步骤 1.1 安装 cuda 等 nvidia 依赖(非CUDA环境运行可跳过) # 以 CUDA Toolkit 12.4: Ubuntu-22.04/24.04(x86_64) 为例,注意区分 WSL 和 Ubuntu,详见 https://developer.nvidia.com/cuda-12-4-1-download-archive?targ…...
矩阵求解复数(aniwoth求解串扰)
所以这种求解串扰的格式是因为,有串扰的共轭项在方程组中 复数共轭项的作用,但是这是二次方程,...
Redis: Sentinel哨兵监控架构及环境搭建
概述 在主从模式下,我们通过从节点只读模式提高了系统的并发能力并发不断增加,只需要扩展从节点即可,只要主从服务器之间,网络连接正常主服务器就会将写入自己的数据同步更新给从服务器,从而保证主从服务器的数据相同…...
C++ 语言特性30 - 模板介绍
目录 一:C11 之前的模板特性 1. 函数模板: 2. 类模板: 3. 模板特化: 4. 模板参数: 5. 模板元编程: 二:C11的模板特性 1. 变长模板(Variadic Templates)ÿ…...
算法笔记(七)——哈希表
文章目录 两数之和判定是否互为字符重排存在重复元素存在重复元素 II字母异位词分组 哈希表:一种存储数据的容器; 可以快速查找某个元素,时间复杂度O(1); 当频繁查找某一个数时,我们可以使用哈希表 创建一个容器&#…...
【基础算法总结】链表篇
目录 一, 链表常用技巧和操作总结二,算法原理和代码实现2.两数相加24.两两交换链表中的节点143.重排链表23.合并k个升序链表25.k个一组翻转链表 三,算法总结 一, 链表常用技巧和操作总结 有关链表的算法题也是一类常见并且经典的题…...
探索路由器静态IP的获取方式
在网络配置中,路由器静态IP是一个重要的概念。对于家庭网络或办公室网络而言,正确配置静态IP地址是确保网络稳定性和管理的关键步骤之一。但是,很多人对于静态IP地址的获取方式可能感到困惑。在本文中,我们将探讨它的获取途径&…...
Vivado - JTAG to AXI Master (GPIO、IIC、HLS_IP)
目录 1. 简介 2. JTAG to AXI Master 2.1 添加 IP Core 2.2 基本TCL命令 2.2.1 复位 JTAG-to-AXI Master 2.2.2 创建并运行写入传输事务 2.2.3 创建并运行读取传输事务 2.2.4 命令列表 2.3 帮助信息 2.4 创建TCL读写程序 2.4.1 Read proc 2.4.2 Write proc 2.4.3 …...
Java中JWT(JSON Web Token)的运用
目录 1. JWT的结构2. JWT的优点3. JWT的流转过程4.具体案例一、项目结构二、依赖配置三、用户模型四、JWT工具类五、JWT请求过滤器六、安全配置七、身份验证控制器八、测试JWT JWT(JSON Web Token)是一种开放标准(RFC 7519)&#…...
CSS3练习--电商web
免责声明:本文仅做分享! 目录 小练--小兔鲜儿 目录构建 SEO 三大标签 Favicon 图标 布局网页 版心 快捷导航(shortcut) 头部(header) logo 导航 搜索 购物车 底部(footer࿰…...
Linux 默认内核版本更改
随笔记录 目录 1. 背景介绍 2. 解决方法 2.1 查看所有可用版本 2.2 安装指定版本内核 2.3 检查当前内核列表 2.4 检查当前默认内核 2.5 设置新的默认内核 2.6 确认内核是否成功加载 2.7 重启 2.8 删除其他版本内核 1. 背景介绍 linux 一般安装多个内核版本&…...
【ubuntu】修改用户名、主机名、主文件夹名、登录名、密码
目录 1.他们是什么 2.修改方法 2.1 修改用户密码 2.2 修改主机名 2.2.1 切换到root用户 2.2.2 修改名称 2.3 修改用户名 主文件夹名 登录名 2.2.1 sudoers 2.2.2 passwd 2.2.3 shadow 2.2.4 group 2.2.5 修改主文件夹名 3.重启 1.他们是什么 (1…...
深入理解JavaScript 的原型继承
JavaScript 的原型链继承机制和 Java 的类继承机制有明显的区别,虽然它们都用于实现对象之间的继承,但它们的实现方式、概念以及运行机制都不同。 1. JavaScript 的原型继承 JavaScript 是基于原型链的继承,主要依赖对象的 __proto__ 属性或…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
