跟着刘二大人学pytorch(第---13---节课之RNN高级篇)

文章目录

  • 0 前言
    • 0.1 课程视频链接:
    • 0.2 课件下载地址:
  • 1 本节课任务描述
    • 模型的处理过程
      • 训练循环
        • 初始化分类器
        • 是否使用GPU
        • 构造损失函数和优化器
        • 每个epoch所要花费的时间
        • 遍历每个epoch时进行训练和测试
        • 记录每次测试的准确率加入到列表中
  • 具体实现(经典的4步)
    • 1、准备数据
      • 1.1 输入数据的处理
      • 1.2 输出数据的处理
        • 1.2.1 编写数据集类
        • 1.2.2 实例化数据集类并加载DataLoader
    • 2、设计模型
      • Bi-direction RNN/LSTM/GRU的实现
        • 将name转换为tensor
        • 实现-测试
          • 实现-训练模型的结果展示
          • 练习13-1 电影评论的情感分析
  • 本系列的总结

0 前言

0.1 课程视频链接:

《PyTorch深度学习实践》完结合集
大佬的笔记:大佬的笔记
pytorch=0.4

0.2 课件下载地址:

链接:https://pan.baidu.com/s/1_J1f5VSyYl-Jj2qIuc1pXw
提取码:wyhu

1 本节课任务描述

本节将构建一个RNN来做分类
在这里插入图片描述
具体是名字的分类
在这里插入图片描述
复习RNN
嵌入层负责将词的one-hot表示(高维稀疏)映射到一个低维稠密的向量中
隐层的h不一定和输出一致,因此需要添加一个线性层,把输出映射成和要求一致的
在这里插入图片描述
有些任务是不需要对所有的隐层状态h都做线性映射的,比如本节的目标是让RNN最后的输出是一个分类,对o1,o2,o3,o4是没有要求的,
实际上可以让网络简化为下面(分类结果只与最后一个隐藏状态相关):
在这里插入图片描述
具体如下:
在这里插入图片描述
每个名字中的字母就是序列中的x1,x2,。。。
序列有的长有的短,之后还要解决序列长度不一的情况

模型的处理过程

在这里插入图片描述

训练循环

初始化分类器

在这里插入图片描述
RNNClassifier是自己定义的分类模型
N_CHARS:字符的数量
HIDDEN_SIZE:GRU输出的维度
N_COUNTRY:国籍的类别数量
N_LAYER:GRU的层数

是否使用GPU

在这里插入图片描述

构造损失函数和优化器

在这里插入图片描述分类问题使用交叉熵损失函数

每个epoch所要花费的时间

elapsed:消逝
在这里插入图片描述
这里定义的time_since函数将当前时间减去since时间,再转换成分钟

遍历每个epoch时进行训练和测试

在这里插入图片描述

记录每次测试的准确率加入到列表中

在这里插入图片描述
记录到列表中后便于之后画图查看准确率变化情况

具体实现(经典的4步)

1、准备数据

1.1 输入数据的处理

在这里插入图片描述
77是M的ASCII值,M的one-hot表示则为索引为77的那一位为1,其余值为0的向量
长短不一:使用padding进行扩充
RNN的输入需要保证是张量,不进行padding的话不是矩阵
填充的长度为一个batch中最长的那个单词的字符数
在这里插入图片描述

1.2 输出数据的处理

1.2.1 编写数据集类

将所有的国家名字做成一个词典,给每个国家一个索引值,字典的格式为键为国家名,值为索引值
在这里插入图片描述
is_train_set=True:判断文件是否是训练集
使用了gzip和csv这两个包进行读取数据集,如果数据集的文件格式是pickle或者是HD5格式,此时需要用相应的包进行读取,需随机应变
在这里插入图片描述
rows是一个列表,这个列表中每一个元素都是元组(name,name所归属的国家)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时name是一个字符串,国家是一个索引值
len:返回数据集的长度
在这里插入图片描述
在这里插入图片描述
函数getCountryDict()可以将国家与国家对应的索引值做出来,其中国家名为键,索引为值
其他的工具函数:
idx2country():给一个索引需要将国家这个字符串拿出来
在这里插入图片描述
getCountriesNum():返回国家的数量
在这里插入图片描述

1.2.2 实例化数据集类并加载DataLoader

在这里插入图片描述
在这里插入图片描述
参数配置:
在这里插入图片描述

2、设计模型

隐藏层的维度设置
在这里插入图片描述
Embedding层的维度设置
在这里插入图片描述
GRU的输入维度是hidden_size,输出维度也是hidden_size
在这里插入图片描述
bidirectional是设置这个GRU网络是否是双向的,如果为True则为双向,如果为False则为单向
在这里插入图片描述
设置n_directions值,如果bidirectional值为True则n_directions=2,否则n_directions=1
在这里插入图片描述

Bi-direction RNN/LSTM/GRU的实现

x_N-1只包含了前面的词的影响,也应该考虑后面的词的影响

下面的图中h0f中的f意思是序列的前向处理,h0b中的b就是序列的反向处理,将正向和反向的信息进行拼接

双向的GRU的输出信息包含两种内容:output和hidden
out包含h0,h1,…,hN
在这里插入图片描述
hidden只包含hNb和hNf
在这里插入图片描述
这里的hidden_size*self.n_directions是指隐藏层h维度是拼接起来的,所以需要乘以一个层数
在这里插入图片描述
_init_hidden是隐层的初始化,初始设置为一个全是0的张量
n_directions是指方向的个数,如果值为2,则为双向,如果值为1则为单项
n_linear是指网络的层数
.t():是张量的转置
在这里插入图片描述
转置之后的结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对序列长度不一的数据进行padding0的操作,0在实际计算的时候其实不需要参与计算,不计算的话可以提高神经网络的运算速度
在pytorch中的一个函数是pack_padded_sequence(),这个函数就可以实现上面的功能,它需要Embedding和序列长度seq_lengths,这个函数的工作原理如下:

在这里插入图片描述
左侧的每个字都会变成一个向量,如上红色画出的部分,像padding的0都是映射为同一个向量,如下图右侧深色部分,如果显示不是0.11开头,那是up主写错了,所以他在图中标识出来了
在这里插入图片描述
Embeddin函数会将左边的图片变成右边的方块(seqLen,batchsize,hiddensize),如下
在这里插入图片描述
pack_padded_sequence()会返回一个打包的对象,
在这里插入图片描述
这个对象的文档解释:
在这里插入图片描述
看不懂的话看下面:
在这里插入图片描述

在处理长短不一的情况下,需要将0对应的词向量拿出去不参与计算,把非0的词向量给依次的堆叠在一起,等于说是一个这样的筛选工作,如果没有按照非0词的个数进行排列的话,pack_padded_sequence是不能work的

但是pack_padded_sequence这个函数要求按照非0个数进行排列,人话讲就是按照句子中词的多少来排序这个词向量,见下图:
首先需要按照序列长度进行排序
在这里插入图片描述
排序映射为向量:
在这里插入图片描述
之后按照下面的排序顺序进行排列,中间省去了两个满的,下面的10,10,10,9,6,表示左边那个图一横行有多少个非padding0的词向量,应该是up主写错了,应该写成9,9,9,8,5,数错了应该是
在这里插入图片描述
pack_padded_sequence将上图中的dataseq_length两个数据进行打包,其中seq_length会变成batch_sizes,即data和batch_sizes将作为gru的输入,gru会根据batch_sizes中存储的数字来每次从data中取出来多少的向量

通过上面的操作得到了下面gru的输入:gru_input
在这里插入图片描述
之后将gru_input作为输入得到最终的hidden,如果是双向GRU的话hidden如下:
hidden[-1]:GRU的最后一个隐藏层状态
hidden[-2]:GRU的倒数第二个隐藏层状态,
之后再将hidden放进全连接层,转换为想要的那种维度
在这里插入图片描述
不懂可以再看下单层的GRU结构:
在这里插入图片描述
双向的GRU的hidden如下操作:
在这里插入图片描述
如果使用的是双向的GRU,则需要将前向和后向的hidden进行拼接
在这里插入图片描述
最后使用一个全连接网络
在这里插入图片描述

将name转换为tensor

这个过程的最终结果需要得出3个值,一个batch的大小B,一个每个name的向量长度S,一个是每个name的向量表示中非0元素的个数,
在这里插入图片描述
过程:
字符串—>字符—>ASCII码—>填充—>转置—>排序
字符串—>字符—>ASCII码:
在这里插入图片描述
ASCII码—>填充:
在这里插入图片描述
填充—>转置:
在这里插入图片描述
转置—>排序:
在这里插入图片描述
name2list将名字name中的每个字符转成ASCII值
在这里插入图片描述
在这里插入图片描述
序列长度装成longtensor:
在这里插入图片描述
padding0的操作:先创造一个全是0的张量,然后将非0的张量给贴到0张量上
在这里插入图片描述
排序
在这里插入图片描述
将这三个都转为张量
在这里插入图片描述
一个epoch上进行训练训练
在这里插入图片描述
经典5步骤:
在这里插入图片描述
打印输出:
在这里插入图片描述

实现-测试

在这里插入图片描述
测试时不需要求梯度,因此使用with torch.no_grad():
在这里插入图片描述
计算输出:
在这里插入图片描述

output.max()这里是计算预测对了多少
在这里插入图片描述

实现-训练模型的结果展示

大概20个epoch之后模型在测试集上的效果表现最好,此时可以将模型保存下来
在这里插入图片描述

练习13-1 电影评论的情感分析

在这里插入图片描述
数据集下载地址:kaggle
在这里插入图片描述
数据示例展示
最后一列的数字表示这句话的情感分类
在这里插入图片描述

本系列的总结

1、通读pytorch文档
2、多读新的文献
3、多动手写代码

文章看不懂或者视频看不懂的可以参考以下优秀的博文:

1、【Pytorch深度学习实践】B站up刘二大人课程笔记——目录与索引(已完结)(该博主的博文建议多看看)
2、玩一玩 Typora
3、刘二大人《PyTorch深度学习实践》循环神经网络RNN高级篇

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

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

相关文章

0基础可以直接学python自动化测试吗?

可以直接学习Python自动化测试,即使没有编程基础。Python是一种易于学习和上手的编程语言,也是自动化测试领域中最受欢迎的语言之一。下面是一篇超详细和规范的文章,将从零开始介绍Python自动化测试的基础知识。 1. 安装Python和开发环境 首…

项目进度和成本管理

1.如何正确标识出软件项目活动? 正确标识软件项目活动是项目管理中的一个重要步骤,它有助于确保项目的顺利进行和成功完成。以下是一些标识软件项目活动的步骤和建议: 项目范围定义:首先明确项目的目标和范围,这将帮助…

初识前端开发

目的 :开发一个网站 -前端开发:html 、css、javaScript -web框架:接收请求处理 -mysql数据库:存储数据的地方 快速上手: 基于Flask web框架让你快速搭建一个网站出来 学习: 基于Django框架 初识HTML …

刷代码随想录有感(106):动态规划——分割等和子集(01背包问题)

题干&#xff1a; 代码&#xff1a; class Solution { public:bool canPartition(vector<int>& nums) {int sum 0;for(int i : nums){sum i;}if(sum % 2 ! 0)return false;int target sum / 2;vector<int>dp(10001, 0);for(int i 0; i < nums.size(); …

Windows11和Ubuntu22双系统安装指南

一、需求描述 台式机电脑&#xff0c;已有Windows11操作系统&#xff0c;想要安装Ubuntu22系统&#xff08;版本任意&#xff09;。其中Windows安装在Nvme固态上&#xff0c;Ubuntu安装在Sata固态上&#xff0c;双盘双系统。开机时使用Grub控制进入哪个系统&#xff0c;效果图…

Python进阶:从函数到文件的编程艺术!!!

第二章&#xff1a;Python进阶 模块概述 函数是一段可重复使用的代码块&#xff0c;它接受输入参数并返回一个结果。函数可以用于执行特定的任务、计算结果、修改数据等&#xff0c;使得代码更具模块化和可重用性。 模块是一组相关函数、类和变量的集合&#xff0c;它们被封…

第 2 章:Spring Framework 中的 IoC 容器

控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;与 面向切面编程&#xff08;Aspect Oriented Programming&#xff0c;AOP&#xff09;是 Spring Framework 中最重要的两个概念&#xff0c;本章会着重介绍前者&#xff0c;内容包括 IoC 容器以及容器中 …

Yum安装LAMP

查看当前80端口是否被占用 ss -tulanp | grep 80查询httpd是否在yum源中 yum info httpd安装httpd yum -y install httpd启动httpd服务&#xff0c;设置开机自启 systemctl enable httpd --now systemctl start httpd查看当前进程 ps aux | grep httpd查看当前IP&#xff…

自动化技术如何影响企业数据分析的发展

当今时代&#xff0c;企业普遍面临着转型的压力&#xff0c;这些挑战主要源于在科技和市场的双重压力下如何实现增长。当前&#xff0c;企业发展的趋势是紧追自动化的浪潮&#xff0c;并通过优化预算管理流程&#xff0c;推进系统和数据分析的现代化。在这一过程中&#xff0c;…

LoRA用于高效微调的基本原理

Using LoRA for efficient fine-tuning: Fundamental principles — ROCm Blogs (amd.com) 大型语言模型的低秩适配&#xff08;LoRA&#xff09;用于解决微调大型语言模型&#xff08;LLMs&#xff09;的挑战。GPT和Llama等拥有数十亿参数的模型&#xff0c;特定任务或领域的微…

怎样搭建serveru ftp个人服务器

首先说说什么是ftp&#xff1f; FTP协议是专门针对在两个系统之间传输大的文件这种应用开发出来的&#xff0c;它是TCP/IP协议的一部分。FTP的意思就是文件传输协议&#xff0c;用来管理TCP/IP网络上大型文件的快速传输。FTP早也是在Unix上开发出来的&#xff0c;并且很长一段…

Vue54-浏览器的本地存储webStorage

一、本地存储localStorage的作用 二、本地存储的代码实现 2-1、存储数据 注意&#xff1a; localStorage是window上的函数&#xff0c;所以&#xff0c;可以把window.localStorage直接写成localStorage&#xff08;直接调用&#xff01;&#xff09; 默认调了p.toString()方…

中小企业使用CRM系统的优势有哪些

中小企业如何在竞争激烈的市场中脱颖而出&#xff1f;除了优秀的产品和服务&#xff0c;一个高效的管理工具也是必不可少的。而客户关系管理&#xff08;CRM&#xff09;系统正是这样一个能帮助企业提升客户体验、优化内部管理流程的重要工具。接下来&#xff0c;让我们一起探讨…

主流框架选择:React、Angular、Vue的详细比较

目前前端小伙伴经常使用三种广泛使用的开发框架&#xff1a;React、Angular、Vue - 来设计网站 Reactjs&#xff1a;效率和多功能性而闻名 Angularjs&#xff1a;创建复杂的应用程序提供了完整的解决方案&#xff0c;紧凑且易于使用的框架 Vuejs&#xff1a;注重灵活性和可重用…

Prometheus之图形化界面grafana与服务发现

前言 上一篇文章中我们介绍了Prometheus的组件&#xff0c;监控作用&#xff0c;部署方式&#xff0c;以及如何通过在客户机安装exporter再添加监控项的操作。 但是不免会发现原生的Prometheus的图像化界面对于监控数据并不能其他很好的展示效果。所以本次我们将介绍一…

Cookie-SameSite属性 前端请求不带cookie的问题解决方案

最近遇到了前端请求后端不带cookie的问题&#xff0c; 请求时header里面就是没有cookie 查看响应应该是这个问题 SameSite是一个cookie属性&#xff0c;用于控制浏览器是否在跨站点请求中发送cookie。它有三个可能的值&#xff1a; 1. Strict&#xff08;严格模式&#xff09…

浙大版PTA Python程序设计 题目与知识点整理(综合版)

目录 第一章 一、高级语言程序的执行方式 二、变量赋值与内存地址 三、字符编码 3.1 Unicode 3.2 ASCII&#xff08;American Standard Code for Information Interchange&#xff09; 四、编程语言分类按照编程范式分类 4.1 面向过程语言 4.2 面向对象语言 五、原码…

第零篇——数学到底应该怎么学?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 宏观讲解数学定位&#xff0c;数学学习方式方法&#xff0c;再次详细学习…

Synctv安装过程中遇到的docker镜像国内无法pull的问题

0x01 docker无法直接拉取对应镜像文件的问题 docker目前国内网络环境无法直接拉去小众而且稍微前沿的docker镜像产品&#xff0c;这对很多折腾玩家及其不友好&#xff0c;我首先想到了替换成国内的docker镜像站&#xff0c;但是对于SyncTV这个产品的docker镜像文件还是无法拉去…

代码随想录——分割回文串(Leetcode 131)

题目链接 回溯 class Solution {List<List<String>> res new ArrayList<List<String>>();List<String> list new ArrayList<String>();public List<List<String>> partition(String s) {backtracking(s, 0);return res;}p…