PyTorch - 从可变长度的序列创建填充张量

问题描述 投票:0回答:2

我正在寻找一种好的(高效且最好是简单的)方法来从可变长度/形状的序列创建填充张量。到目前为止,我能想到的最好的方法是像这样的天真的方法:

import torch
seq = [1,2,3]      # seq of variable length
max_len = 5        # maximum length of seq
t = torch.zeros(5) # padding value
for i, e in enumerate(seq):
    t[i] = e
print(t)

输出:

tensor([ 1.,  2.,  3.,  0.,  0.])

有更好的方法吗?

我还没找到什么,但我想一定有更好的。

我正在考虑一些函数来将序列张量扩展到具有所需填充的所需形状。或者直接从序列创建填充张量。但当然也欢迎其他方法。

python pytorch
2个回答
17
投票

作为@iacolippo已经给出的答案的补充:

我只是偶然发现了

torch.nn.utils.rnn.pad_sequence
,因为这与@iacolippo 的解决方案有点不同,我将其发布在这里。

它采用可变长度的张量列表并将它们组合成一个矩阵 - 将所有序列填充到最长的给定序列。

代码示例:

import torch

a = torch.tensor([1,2,3])
b = torch.tensor([1,2])
c = torch.tensor([1])
torch.nn.utils.rnn.pad_sequence((a,b,c), batch_first=True)

输出 - 填充序列:

tensor([[ 1,  2,  3],
        [ 1,  2,  0],
        [ 1,  0,  0]])

torch.nn.utils.rnn.pad_sequence
签名:

torch.nn.utils.rnn.pad_sequence (序列,batch_first=False,padding_value=0)

  • sequences (
    list[Tensor]
    ) – 可变长度序列列表。
  • batch_first
    bool
    可选) – 如果为 True,输出将在
    B x T x *
    中,否则在
    T x B x *
  • padding_value (
    float
    , 可选) – 填充元素的值。默认:
    0

15
投票

将可变长度序列设为

torch.Tensor
并使用
torch.nn.functional.pad

import torch
import torch.nn.functional as F

seq = torch.Tensor([1,2,3])      # seq of variable length
print(F.pad(seq, pad=(0, 2), mode='constant', value=0))
 1
 2
 3
 0
 0
[torch.FloatTensor of size 5]

F.pad
的签名是:

  • input
    :输入张量,即可变长度序列。
  • pad
    :m-elem 元组,其中 (m/2) ≤ 输入维度且 m 为偶数。在一维情况下,第一个元素是序列左侧的填充量,第二个元素是序列右侧的填充量。
  • mode
    :用常量或通过复制边框或反映值来填充填充。
  • value
    :如果选择恒定填充,则填充值。
© www.soinside.com 2019 - 2024. All rights reserved.