Pytorch深度学习实践:循环神经网络(RNN)基础篇

2024-02-29 12:59

本文主要是介绍Pytorch深度学习实践:循环神经网络(RNN)基础篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一、基础部分
    • 1. 简单例子引入RNN
    • 2. RNN流程示意图
      • 2.1 RNN流程示意图含义说明
        • 2.1.1 xt 含义
        • 2.1.2 RNN Cell 含义
        • 2.1.3 ht 含义
        • 2.1.4 h0 含义
        • 2.1.5 红色箭头上方 h1 和 h2 含义
      • 2.2 RNN流程示意图伪代码
    • 3. RNN计算示意图说明
      • 3.1 xt 矩阵,Wih 矩阵和 bih 矩阵
      • 3.2 ht-1 矩阵,Whh 矩阵和 bhh 矩阵
      • 3.3 tanh( ) 激活函数
      • 3.4 ht 矩阵
  • 二、具体代码部分
    • 4. RNN 构造方法1 (使用RNNCell)
      • 4.1 初始化不同参数及解释
        • 4.1.1 batchSize
        • 4.1.2 seqLen
        • 4.1.3 InputSize
        • 4.1.4 hiddenSize
      • 4.2 构造线性层并计算每一层的输出 ht
      • 4.3 完整代码
    • 5. RNN 构造方法2 (使用RNN)
      • 5.1 初始化不同参数及解释
        • 5.1.1 numLayers
      • 5.2 构造线性层并计算每一层的输出 ht 和最终的一个输出 hN
      • 5.3 完整代码

一、基础部分

1. 简单例子引入RNN

温度 (°C)气压 (百帕)天气状况
第1天251013晴天
第2天221005雨天
第3天211002雨天

在这个表格中,我们可以看到连续三天的不同气象数据。可以注意到的是,对于每一天来说,都有三个不同的特征。假如我们假定第1天为x1,第2天为x2,第3天为x3。同时,每天里面都包含三个特征(即温度,气压和天气状况)。因此,x1,x2和x3都分别可以看作是一个3维列向量。然后,我们再根据这三个向量去预测第4天的气象数据。

实际上,表格中都是带有时间序列模式的数据,而RNN专门处理的就是这种类别的数据。下图是一个简单的示意图。在这个图中可以看到,我们不仅要考虑x1,x2和x3之间的连接关系,还要考虑到它们具有先后的时间序列关系。换句话说,后一天的天气状况都要依赖于前一天的天气状况。
在这里插入图片描述

除了天气状况的数据外,类似的数据还有自然语言等。下面我们将以一个具体的语句解释一下RNN在自然语言处理中的应用。

在这里插入图片描述
对于这么一句话来说,它是有先后顺序的。正常说出的顺序就是我,爱,北京,天安门。但是如果打乱了这句话的顺序,我们可能就无法理解这句话是什么意思了,例如北京,爱,天安门,我的这种顺序。所以,这里就需要RNN来确定自然语言的正确排列顺序。


2. RNN流程示意图

在这里插入图片描述

若上图不理解,请移步b站上的一个相关视频,视频链接如下:
【循环神经网络】5分钟搞懂RNN,3D动画深入浅出

2.1 RNN流程示意图含义说明

2.1.1 xt 含义

xt 指的是,时间序列中时刻 t 的输入数据。同时,xt 是一个有维度(即特征数量)的向量,我们把这个维度称为输入维度。例如在前文的气象数据的例子中,xt 就是一个维度为3的列向量。

2.1.2 RNN Cell 含义

RNN Cell 本质上就是一个线性层,它可以将某一个维度映射到另一个维度的空间。例如上图中,RNN Cell 就把一个输入维度为3的向量 xt 映射到了一个输出维度为5的向量 ht。同时,RNN Cell 这个线性层是共享的(即图中右半部分的所有 RNN Cell 都是同一个线性层,且这个线性层的权重会参与到所有的运算流程里)。

2.1.3 ht 含义

ht 是输入向量 xt 经过 RNN Cell 处理得到的输出向量,我们也把输出向量 ht 叫做隐藏层(hidden)。

2.1.4 h0 含义

对于 h1 来说,我们需要输入一个 h0 参与到 RNN Cell 的运算过程中。例如,我们想根据图像生成文本,我们可以根据卷积神经网络和全连接层来生成 h0(先验知识),再把 h0 送到下一次 h1 的运算过程中,这样就能完成图像到文本的转换。
如果没有先验知识作为输入,我们就可以把 h0 设置为和 h1、h2 等输出向量维度相同,且全为0的列向量。例如,图中h1、h2 等输出向量维度为5,那么 h0 也是一个维度为5的全0列向量。

2.1.5 红色箭头上方 h1 和 h2 含义

我们不仅输出了 h1,还把 h1 送到了下一次 h2 的 RNN Cell 的运算过程中。h2 的含义同理。

2.2 RNN流程示意图伪代码

# 初始化 h0 为一个0向量
h0 = 0# 定义一个线性层 linear
linear = Linear()# 循环遍历 x, 经过线性层的运算, 计算出每一次的 h
for x in X:h = linear(x, h)# 对 h = linear(x, h) 的具体解释
h1 = linear(x1, h0)
h2 = linear(x2, h1)
h3 = linear(x3, h2)

3. RNN计算示意图说明

在这里插入图片描述

3.1 xt 矩阵,Wih 矩阵和 bih 矩阵

我们在这里把之前向量的说法换成矩阵的说法。则 xt 是一个形状为 input_size * 1 的矩阵,Wih 是一个形状为 hidden_size * input_size 的权重矩阵,bih 是一个形状为 hidden_size * 1 的偏置矩阵。这里 Wih 符号如果换成 Whi 符号会有助于理解。

3.2 ht-1 矩阵,Whh 矩阵和 bhh 矩阵

ht-1 是一个形状为 hidden_size * 1 的矩阵,作为当前这一层的输入。Whh 是一个形状为 hidden_size * hidden_size 的权重矩阵,bhh 是一个形状为 hidden_size * 1 的偏置矩阵。

3.3 tanh( ) 激活函数

将前面 3.1 和 3.2 两步计算得到的结果相加,即 Wih * xt + bih + Whh * ht-1 + bhh,再将其放入 tanh( ) 中做一个激活。在 RNN 中,tanh( ) 用的最普遍,其取值范围是 [-1,1]。

3.4 ht 矩阵

经过 3.3 一步的计算过程后,得到的结果就是 ht 矩阵,即当前这一层的隐藏层的输出。

二、具体代码部分

4. RNN 构造方法1 (使用RNNCell)

4.1 初始化不同参数及解释

在这里插入图片描述

4.1.1 batchSize

气象数据举例:有1组天气变化的时间序列的训练数据
自然语言举例:有多少个句子,即同时处理多少个句子的同一个位置的字

4.1.2 seqLen

气象数据举例:这1组训练数据中,一共共有3天
自然语言举例:每个句子中有多少个字

4.1.3 InputSize

气象数据举例:3天的时间序列中,每天的有3个不同的天气特征
自然语言举例:每个句子中,每个字的词嵌入向量维度

4.1.4 hiddenSize

气象数据举例:hidden 层中都是2维的向量
自然语言举例:自己定义 hidden 层中向量维度

4.2 构造线性层并计算每一层的输出 ht

在这里插入图片描述

4.3 完整代码

import torch# 初始化参数
batch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2# 构建 RNNCell 的线性层
# 单个 RNN,即循环神经网络的单个部分
cell = torch.nn.RNNCell(input_size=input_size, hidden_size=hidden_size)# 生成(3,1,4)的标准正态分布的的随机数, 张量
dataset = torch.randn(seq_len, batch_size, input_size)
# 生成为(1,2)的全为0.的数, 张量
hidden = torch.zeros(batch_size, hidden_size)# 用 enumerate 函数来遍历数据集, 并返回每次迭代的索引值(idx)和对应的元素(input)
for idx, input in enumerate(dataset):print('=' * 20, idx, '=' * 20)print(f'Input size: {input.shape}')# 计算每一层的输出 hthidden = cell(input, hidden)print(f'Output size: {hidden.shape}')print(hidden)
# 输出结果
==================== 0 ====================
Input size: torch.Size([1, 4])
Output size: torch.Size([1, 2])
tensor([[-0.5207,  0.7236]], grad_fn=<TanhBackward0>)
==================== 1 ====================
Input size: torch.Size([1, 4])
Output size: torch.Size([1, 2])
tensor([[-0.8958,  0.8798]], grad_fn=<TanhBackward0>)
==================== 2 ====================
Input size: torch.Size([1, 4])
Output size: torch.Size([1, 2])
tensor([[-0.9120,  0.8529]], grad_fn=<TanhBackward0>)

5. RNN 构造方法2 (使用RNN)

5.1 初始化不同参数及解释

在这里插入图片描述

5.1.1 numLayers

RNN 的层数,天气状况的例子中,RNN 只有1层。

5.2 构造线性层并计算每一层的输出 ht 和最终的一个输出 hN

在这里插入图片描述

在这里插入图片描述

5.3 完整代码

import torch# 初始化参数
batch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2
num_layers = 1# 构建 RNN 的线性层
cell = torch.nn.RNN(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers)# 生成(3, 1, 4)的标准正态分布的的随机数, 张量
inputs = torch.randn(seq_len, batch_size, input_size)
# 生成为(1, 1, 2)的全为0.的数, 张量
hidden = torch.zeros(num_layers, batch_size, hidden_size)# 输出最后一个隐藏层, 还有最后的 hN
out, hidden = cell(inputs, hidden)print(f'Output size: {out.shape}')
print(f'Output: {out}')
print(f'Hidden size: {hidden.shape}')
print(f'Hidden: {hidden}')
# 输出结果
Output size: torch.Size([3, 1, 2])
Output: tensor([[[ 0.9128, -0.2513]],[[ 0.3892,  0.6347]],[[ 0.8947,  0.6750]]], grad_fn=<StackBackward0>)
Hidden size: torch.Size([1, 1, 2])
Hidden: tensor([[[0.8947, 0.6750]]], grad_fn=<StackBackward0>)

这篇关于Pytorch深度学习实践:循环神经网络(RNN)基础篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/758902

相关文章

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

pytest+allure环境搭建+自动化实践过程

《pytest+allure环境搭建+自动化实践过程》:本文主要介绍pytest+allure环境搭建+自动化实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、pytest下载安装1.1、安装pytest1.2、检测是否安装成功二、allure下载安装2.

使用vscode搭建pywebview集成vue项目实践

《使用vscode搭建pywebview集成vue项目实践》:本文主要介绍使用vscode搭建pywebview集成vue项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录环境准备项目源码下载项目说明调试与生成可执行文件核心代码说明总结本节我们使用pythonpywebv

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL