pytorch笔记:PackedSequence对象送入RNN

这篇具有很好参考价值的文章主要介绍了pytorch笔记:PackedSequence对象送入RNN。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

pytorch 笔记:PAD_PACKED_SEQUENCE 和PACK_PADDED_SEQUENCE-CSDN博客 

  • 当使用pack_padded_sequence得到一个PackedSequence对象并将其送入RNN(如LSTM或GRU)时,RNN内部会进行特定的操作来处理这种特殊的输入形式。
  • 使用PackedSequence的主要好处是提高效率和计算速度。因为通过跳过填充部分,RNN不需要在这些部分进行无用的计算。这特别对于处理长度差异很大的批量序列时很有帮助。

1 PackedSequence对象

  • PackedSequence是一个命名元组,其中主要的两个属性是databatch_sizes
    • data是一个1D张量,包含所有非零长度序列的元素,按照其在批次中的顺序排列。
    • batch_sizes是一个1D张量,表示每个时间步的批次大小
  • PackedSequence(data=tensor([6, 5, 1, 8, 7, 9]),
                    batch_sizes=tensor([3, 2, 1]), 
                    sorted_indices=None, 
                    unsorted_indices=None)

 2 处理PackedSequence

  • 当RNN遇到PackedSequence作为输入时,它会按照batch_sizes中指定的方式对data进行迭代
  • 举例来说,上面例子中batch_sizes[3,2,1],那么RNN首先处理前3个元素,然后是接下来的2个元素,最后是最后一个元素。
  • 这允许RNN仅处理有效的序列部分,而跳过填充

3 输出

  • 当RNN完成对PackedSequence的处理后,它的输出同样是一个PackedSequence对象
  • 可以使用pad_packed_sequence将其转换回常规的填充张量格式,以进行后续操作或损失计算
  • 隐藏状态和单元状态(对于LSTM)也会被返回,这些状态与未打包的序列的处理方式相同

4  举例

  • 假设我们有以下3个句子,我们想要用RNN进行处理:
I love AI
Hello
PyTorch is great
  • 为了送入RNN,我们首先需要将这些句子转换为整数形式,并进行填充以保证它们在同一个批次中有相同的长度。
{
    'PAD': 0,
    'I': 1,
    'love': 2,
    'AI': 3,
    'Hello': 4,
    'PyTorch': 5,
    'is': 6,
    'great': 7
}
  • 句子转换为整数后(id):
  1. I love AI -> [1, 2, 3]
  2. Hello -> [4]
  3. PyTorch is great -> [5, 6, 7]
  • 为了将它们放入同一个批次,我们进行填充:
[1, 2, 3]
[4, 0, 0]
[5, 6, 7]
  • 假设每个单词的id 对应的embedding就是自己:
[[1], [2], [3]]
[[4], [0], [0]]
[[5], [6], [7]]
  • 使用pack_padded_sequence进行处理
import torch
from torch.nn.utils.rnn import pack_padded_sequence

# 输入序列
input_seq = torch.tensor([[1,2,3], [4, 0, 0], [5,6,7]])
input_seq=input_seq.reshape(data.shape[0],input_seq.shape[1],1)
#每个单词id的embedding就是他自己
input_seq=input_seq.float()
#变成float是为了喂入RNN所需

# 序列的实际长度
lengths = [3, 1, 3]

# 使用pack_padded_sequence
packed = pack_padded_sequence(input_seq, lengths, batch_first=True,enforce_sorted=False)

packed
'''
PackedSequence(data=tensor([[1.],
        [5.],
        [4.],
        [2.],
        [6.],
        [3.],
        [7.]]), batch_sizes=tensor([3, 2, 2]), sorted_indices=tensor([0, 2, 1]), unsorted_indices=tensor([0, 2, 1]))
'''
  • 现在,当我们将此PackedSequence送入RNN时,RNN首先处理前3个元素,因为batch_sizes的第一个元素是3。然后,它处理接下来的2个元素,最后处理剩下的2个元素。
    • 具体来说,RNN会如下处理:文章来源地址https://www.toymoban.com/news/detail-739580.html

      • 时间步1:根据batch_sizes[0] = 3,RNN同时处理三个句子的第一个元素。具体地说,它处理句子1的"I",句子2的"PyTorch",和句子3的"Hello"。
      • 时间步2:根据batch_sizes[1] = 2,RNN处理接下来两个句子的第二个元素,即句子1的"love"和句子2的"is"。
      • 时间步3:根据batch_sizes[2] = 2,RNN处理接下来两个句子的第三个元素,即句子1的"AI"和句子2的"great"。
  • 喂入RNN
import torch.nn as nn

class SimpleRNN(nn.Module):
    def __init__(self,input_size,hidden_size,num_layer=1):
        super(SimpleRNN,self).__init__()
        self.rnn=nn.RNN(input_size,
                       hidden_size,
                       num_layer,
                       batch_first=True)
    
    def forward(self,x,hidden=None):
        packed_output,h_n=self.rnn(x,hidden)
        return packed_output,h_n
#单层的RNN

Srnn=SimpleRNN(1,3)
Srnn(packed_data) 
'''
(PackedSequence(data=tensor([[-0.1207, -0.0247,  0.4188],
         [-0.3173, -0.0499,  0.6838],
         [-0.4900, -0.0751,  0.8415],
         [-0.7051, -0.1611,  0.9610],
         [-0.7497, -0.2117,  0.9829],
         [-0.3361, -0.1660,  0.9329],
         [ 0.4608, -0.0492,  0.1138]], grad_fn=<CatBackward0>), batch_sizes=tensor([3, 2, 2]), sorted_indices=None, unsorted_indices=None),
 tensor([[[-0.3361, -0.1660,  0.9329],
          [ 0.4608, -0.0492,  0.1138],
          [-0.4900, -0.0751,  0.8415]]], grad_fn=<StackBackward0>))
'''
  • 得到的RNN输出是pack的,hidden state没有变化
    • Srnn=SimpleRNN(1,3)
      Srnn(packed_data) 
      '''
      (PackedSequence(data=tensor([[-0.1207, -0.0247,  0.4188],
               [-0.3173, -0.0499,  0.6838],
               [-0.4900, -0.0751,  0.8415],
               [-0.7051, -0.1611,  0.9610],
               [-0.7497, -0.2117,  0.9829],
               [-0.3361, -0.1660,  0.9329],
               [ 0.4608, -0.0492,  0.1138]], grad_fn=<CatBackward0>), batch_sizes=tensor([3, 2, 2]), sorted_indices=None, unsorted_indices=None),
       tensor([[[-0.3361, -0.1660,  0.9329],
                [ 0.4608, -0.0492,  0.1138],
                [-0.4900, -0.0751,  0.8415]]], grad_fn=<StackBackward0>))
      '''
      
      pad_packed_sequence(Srnn(packed_data)[0],batch_first=True)
      '''
      (tensor([[[-0.1207, -0.0247,  0.4188],
                [-0.7051, -0.1611,  0.9610],
                [-0.3361, -0.1660,  0.9329]],
       
               [[-0.3173, -0.0499,  0.6838],
                [-0.7497, -0.2117,  0.9829],
                [ 0.4608, -0.0492,  0.1138]],
       
               [[-0.4900, -0.0751,  0.8415],
                [ 0.0000,  0.0000,  0.0000],
                [ 0.0000,  0.0000,  0.0000]]], grad_fn=<TransposeBackward0>),
       tensor([3, 3, 1]))
      '''

到了这里,关于pytorch笔记:PackedSequence对象送入RNN的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • NLP学习笔记五-simple RNN

    我这个学习笔记,感兴趣的小伙伴,看的时候尽量从头开始看,这样更好理解,也更有收获。 simple RNN的单元结构图如下: 其中A就是我们需要学习的参数矩阵, h t − 1 h_{t-1} h t − 1 ​ 是我们上个单元得到的向量, x t x_{t} x t ​ 是当前单元输入的词向量,当前词向量 x t x_

    2024年02月09日
    浏览(38)
  • 机器学习笔记:RNN值Teacher Forcing

    Teacher forcing是一种在训练循环神经网络(RNN)时使用的技术,尤其是在 序列生成 任务中,如机器翻译、文本生成或语音合成。 这种方法的目的是更有效地训练网络预测下一个输出,给定一系列先前的观察结果。 当训练一个用于序列生成的RNN时,通常会让网络预测序列中的下

    2024年02月05日
    浏览(37)
  • 李宏毅机器学习笔记:RNN循环神经网络

    例如情景补充的情况,根据词汇预测该词汇所属的类别。这个时候的 Taipi 则属于目的地。但是,在订票系统中, Taipi 也可能会属于出发地。到底属于目的地,还是出发地,如果不结合上下文,则很难做出判断。因此,使用传统的深度神经网络解决不了问题,必须引入RNN。 如

    2024年02月10日
    浏览(52)
  • Python深度学习026:基于Pytorch的典型循环神经网络模型RNN、LSTM、GRU的公式及简洁案例实现(官方)

    循环神经网络(也有翻译为递归神经网络)最典型的三种网络结构是: RNN(Recurrent Neural Network,循环神经网络) LSTM(Long Short-Term Memory,长短期记忆网络) GRU(Gate Recurrent Unit,门控循环单元) 理解参数的含义非常重要,否则,你不知道准备什么维度的输入数据送入模型 先

    2023年04月22日
    浏览(40)
  • NLP 学习笔记十-simple RNN+attention(注意力机制)

    感兴趣的伙伴,看这个笔记,最好从头开始看哈,而且我的笔记,其实不面向零基础,最好有过一些实践经历的来看最好。 紧接上一回,我们谈到seq2seq模型解决用于机器翻译的问题。其中seq其实是采用lstm作为自己的基础记忆网络实现的,当然也可以用RNN实现实现seq2seq模型。

    2024年02月09日
    浏览(62)
  • 神经网络学习笔记10——RNN、ELMo、Transformer、GPT、BERT

    参考博客1 参考博客2 一、NLP(自然语言处理)是什么 自然语言处理(Natural Language Processing,简称NLP)是用计算机来处理、理解以及运用人类语言(如字符、中文、英文等),它属于人工智能的一个分支,是计算机科学与语言学的交叉学科,又常被称为计算语言学。人类语言是抽

    2024年04月09日
    浏览(43)
  • 【深度学习笔记】6_2 循环神经网络RNN(recurrent neural network)

    注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 上一节介绍的 n n n 元语法中,时间步 t t t 的词 w t w_t w t ​ 基于前面所有词的条件概率只考虑了最近时间步的 n − 1 n-1 n − 1 个词。如果要考虑比 t − ( n − 1 ) t-(n-1) t −

    2024年03月12日
    浏览(69)
  • pytorch 实现rnn

    rnn实现预测字符

    2024年02月12日
    浏览(35)
  • [PyTorch][chapter 44][RNN]

    简介             循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network) [1]  。             对循环神经网络的研究始于二十世纪80-

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包