Pytorch中的RNN之pack_padded_sequence()和pad_packed_sequence()

torch.nn.utils.rnn.pack_padded_sequence()

这里的pack,理解成压紧比较好。 将一个 填充过的变长序列 压紧。(填充时候,会有冗余,所以压紧一下)

其中pack的过程为:(注意pack的形式,不是按行压,而是按列压)

(下面方框内为PackedSequence对象,由data和batch_sizes组成)

输入的形状可以是(T×B×* )。T是最长序列长度,Bbatch size*代表任意维度(可以是0)。如果batch_first=True的话,那么相应的 input size 就是 (B×T×*)

Variable中保存的序列,应该按序列长度的长短排序,长的在前,短的在后。即input[:,0]代表的是最长的序列,input[:, B-1]保存的是最短的序列。

NOTE: 只要是维度大于等于2的input都可以作为这个函数的参数。你可以用它来打包labels,然后用RNN的输出和打包后的labels来计算loss。通过PackedSequence对象的.data属性可以获取 Variable

参数说明:

  • input (Variable) – 变长序列 被填充后的 batch
  • lengths (list[int]) – Variable 中 每个序列的长度。
  • batch_first (bool, optional) – 如果是True,input的形状应该是B*T*size

返回值:

一个PackedSequence 对象。

torch.nn.utils.rnn.pad_packed_sequence()

填充packed_sequence

上面提到的函数的功能是将一个填充后的变长序列压紧。 这个操作和pack_padded_sequence()是相反的。把压紧的序列再填充回来。

返回的Varaible的值的size是 T×B×*T 是最长序列的长度,B 是 batch_size,如果 batch_first=True,那么返回值是B×T×*

Batch中的元素将会以它们长度的逆序排列。

参数说明:

  • sequence (PackedSequence) – 将要被填充的 batch
  • batch_first (bool, optional) – 如果为True,返回的数据的格式为 B×T×*

返回值: 一个tuple,包含被填充后的序列,和batch中序列的长度列表

一个例子:

输出:

此时PackedSequence对象输入RNN后,输出RNN的还是PackedSequence对象

参考:

https://www.cnblogs.com/lindaxin/p/8052043.html

https://pytorch.org/docs/stable/nn.html?highlight=pack_padded_sequence#torch.nn.utils.rnn.pack_padded_sequence

原文地址:https://www.cnblogs.com/sbj123456789/p/9834018.html

时间: 2024-10-08 16:45:06

Pytorch中的RNN之pack_padded_sequence()和pad_packed_sequence()的相关文章

pytorch中如何处理RNN输入变长序列padding

一.为什么RNN需要处理变长输入 假设我们有情感分析的例子,对每句话进行一个感情级别的分类,主体流程大概是下图所示: 思路比较简单,但是当我们进行batch个训练数据一起计算的时候,我们会遇到多个训练样例长度不同的情况,这样我们就会很自然的进行padding,将短句子padding为跟最长的句子一样. 比如向下图这样: 但是这会有一个问题,什么问题呢?比如上图,句子“Yes”只有一个单词,但是padding了5的pad符号,这样会导致LSTM对它的表示通过了非常多无用的字符,这样得到的句子表示就

Pytorch基础——使用 RNN 生成简单序列

一.介绍 内容 使用 RNN 进行序列预测 今天我们就从一个基本的使用 RNN 生成简单序列的例子中,来窥探神经网络生成符号序列的秘密. 我们首先让神经网络模型学习形如 0^n 1^n 形式的上下文无关语法.然后再让模型尝试去生成这样的字符串.在流程中将演示 RNN 及 LSTM 相关函数的使用方法. 实验知识点 什么是上下文无关文法 使用 RNN 或 LSTM 模型生成简单序列的方法 探究 RNN 记忆功能的内部原理 二.什么是上下文无关语法 上下文无关语法 首先让我们观察以下序列: 01 0

(原)CNN中的卷积、1x1卷积及在pytorch中的验证

转载请注明处处: http://www.cnblogs.com/darkknightzh/p/9017854.html 参考网址: https://pytorch.org/docs/stable/nn.html?highlight=conv2d#torch.nn.Conv2d https://www.cnblogs.com/chuantingSDU/p/8120065.html https://blog.csdn.net/chaolei3/article/details/79374563 1x1

[PyTorch]PyTorch中反卷积的用法

文章来源:https://www.jianshu.com/p/01577e86e506 pytorch中的 2D 卷积层 和 2D 反卷积层 函数分别如下: class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, groups=1, bias=True) class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_si

[Pytorch]Pytorch中tensor常用语法

原文地址:https://zhuanlan.zhihu.com/p/31494491 上次我总结了在PyTorch中建立随机数Tensor的多种方法的区别. 这次我把常用的Tensor的数学运算总结到这里,以防自己在使用PyTorch做实验时,忘记这些方法应该传什么参数. 总结的方法包括: Tensor求和以及按索引求和:torch.sum() torch.Tensor.indexadd() Tensor元素乘积:torch.prod(input) 对Tensor求均值.方差.极值: torch

Pytorch 中的 dim

Pytorch 中对 tensor 的很多操作如 sum.argmax.unsqueeze 等都可以设置 dim 参数用来指定操作在哪一维进行.Pytorch 中的 dim 类似于 numpy 中的 axis,这篇文章来总结一下 Pytorch 中的 dim 操作. dim 与方括号的关系 创建一个矩阵 a = torch.tensor([[1, 2], [3, 4]]) print(a) 输出 tensor([[1, 2], [3, 4]]) 因为a是一个矩阵,所以a的左边有 2 个括号 括号

关于Pytorch中accuracy和loss的计算

这几天关于accuracy和loss的计算有一些疑惑,原来是自己还没有弄清楚. 给出实例 def train(train_loader, model, criteon, optimizer, epoch): train_loss = 0 train_acc = 0 num_correct= 0 for step, (x,y) in enumerate(train_loader): # x: [b, 3, 224, 224], y: [b] x, y = x.to(device), y.to(de

PyTorch中scatter和gather的用法

PyTorch中scatter和gather的用法 闲扯 许久没有更新博客了,2019年总体上看是荒废的,没有做出什么东西,明年春天就要开始准备实习了,虽然不找算法岗的工作,但是还是准备在2019年的最后一个半月认真整理一下自己学习的机器学习和深度学习的知识. scatter的用法 scatter中文翻译为散射,首先看一个例子来直观感受一下这个API的功能,使用pytorch官网提供的例子. import torch import torch.nn as nn x = torch.rand(2,

Pytorch中的自编码(autoencoder)

Pytorch中的自编码(autoencoder) 本文资料来源:https://www.bilibili.com/video/av15997678/?p=25 什么是自编码 先压缩原数据.提取出最有代表性的信息.然后处理后再进行解压.减少处理压力 通过对比白色X和黑色X的区别(cost函数),从而不断提升自编码模型的能力(也就是还原的准确度) 由于这里只是使用了数据本身,没有使用label,所以可以说autoencoder是一种无监督学习模型. 实际在使用中,我们先训练好一个autoencod