pytorch对可变长度序列的处理方法详解

 更新时间:2018年12月08日 12:14:35   作者:深度学习1  
今天小编就为大家分享一篇pytorch对可变长度序列的处理方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

主要是用函数torch.nn.utils.rnn.PackedSequence()和torch.nn.utils.rnn.pack_padded_sequence()以及torch.nn.utils.rnn.pad_packed_sequence()来进行的,分别来看看这三个函数的用法。

1、torch.nn.utils.rnn.PackedSequence()

NOTE: 这个类的实例不能手动创建。它们只能被 pack_padded_sequence() 实例化。

PackedSequence对象包括:

一个data对象:一个torch.Variable(令牌的总数,每个令牌的维度),在这个简单的例子中有五个令牌序列(用整数表示):(18,1)

一个batch_sizes对象:每个时间步长的令牌数列表,在这个例子中为:[6,5,2,4,1]

用pack_padded_sequence函数来构造这个对象非常的简单:

pytorch对可变长度序列的处理

如何构造一个PackedSequence对象(batch_first = True)

PackedSequence对象有一个很不错的特性,就是我们无需对序列解包(这一步操作非常慢)即可直接在PackedSequence数据变量上执行许多操作。特别是我们可以对令牌执行任何操作(即对令牌的顺序/上下文不敏感)。当然,我们也可以使用接受PackedSequence作为输入的任何一个pyTorch模块(pyTorch 0.2)。

2、torch.nn.utils.rnn.pack_padded_sequence()

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

输入的形状可以是(T×B×* )。T是最长序列长度,B是batch 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 对象。

3、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中序列的长度列表。

例子:

import torch
import torch.nn as nn
from torch.autograd import Variable
from torch.nn import utils as nn_utils
batch_size = 2
max_length = 3
hidden_size = 2
n_layers =1
 
tensor_in = torch.FloatTensor([[1, 2, 3], [1, 0, 0]]).resize_(2,3,1)
tensor_in = Variable( tensor_in ) #[batch, seq, feature], [2, 3, 1]
seq_lengths = [3,1] # list of integers holding information about the batch size at each sequence step
 
# pack it
pack = nn_utils.rnn.pack_padded_sequence(tensor_in, seq_lengths, batch_first=True)
 
# initialize
rnn = nn.RNN(1, hidden_size, n_layers, batch_first=True)
h0 = Variable(torch.randn(n_layers, batch_size, hidden_size))
 
#forward
out, _ = rnn(pack, h0)
 
# unpack
unpacked = nn_utils.rnn.pad_packed_sequence(out)
print('111',unpacked)

输出:

111 (Variable containing:
(0 ,.,.) =
 0.5406 0.3584
 -0.1403 0.0308
 
(1 ,.,.) =
 -0.6855 -0.9307
 0.0000 0.0000
[torch.FloatTensor of size 2x2x2]
, [2, 1])

以上这篇pytorch对可变长度序列的处理方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python mock测试的示例

    python mock测试的示例

    这篇文章主要介绍了python mock测试的示例,帮助大家利用python进行模拟接口测试,感兴趣的朋友可以了解下
    2020-10-10
  • pycharm配置Anaconda虚拟环境全过程

    pycharm配置Anaconda虚拟环境全过程

    这篇文章主要介绍了pycharm配置Anaconda虚拟环境全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Python之多线程退出与停止的一种实现思路

    Python之多线程退出与停止的一种实现思路

    这篇文章主要介绍了Python之多线程退出与停止的一种实现思路,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • python装饰器底层原理详解

    python装饰器底层原理详解

    这篇文章主要介绍了python装饰器底层原理讲解,被装饰对象加上装饰器,被装饰对象获得了更强大的功能,更多相关内容,需要的朋友可以参考一下
    2022-07-07
  • python  dataclass 快速创建数据类的方法

    python  dataclass 快速创建数据类的方法

    在Python中,dataclass是一种用于快速创建数据类的装饰器和工具,本文实例代码中我们定义了一个Person数据类,并使用fields()函数遍历其字段,打印出每个字段的名称、类型、默认值和元数据,对python  dataclass 数据类相关知识感兴趣的朋友一起看看吧
    2024-03-03
  • Python内建类型int源码学习

    Python内建类型int源码学习

    这篇文章主要为大家介绍了Python内建类型int源码学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python+numpy实现一个蜘蛛纸牌游戏

    Python+numpy实现一个蜘蛛纸牌游戏

    蜘蛛纸牌大家玩过没有?之前的电脑上自带的游戏,用他来摸鱼过的举个手。但是现在的电脑上已经没有蜘蛛纸牌了。所以本文就来用Python做一个吧,需要的可以参考一下
    2022-12-12
  • 详解Python如何利用Pandas与NumPy进行数据清洗

    详解Python如何利用Pandas与NumPy进行数据清洗

    许多数据科学家认为获取和清理数据的初始步骤占工作的 80%,花费大量时间来清理数据集并将它们归结为可以使用的形式。本文将利用 Python 的 Pandas和 NumPy 库来清理数据,需要的可以参考一下
    2022-04-04
  • Python3实现汉语转换为汉语拼音

    Python3实现汉语转换为汉语拼音

    这篇文章主要为大家详细介绍了Python3实现汉语转换为汉语拼音,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Python ConfigParser模块的使用示例

    Python ConfigParser模块的使用示例

    这篇文章主要介绍了Python ConfigParser模块的使用示例,帮助大家更好的理解和学习Python ConfigParser模块的用法,感兴趣的朋友可以了解下
    2020-10-10

最新评论