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

blu*_*nox 4 python pytorch

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

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)
Run Code Online (Sandbox Code Playgroud)

输出:

tensor([ 1.,  2.,  3.,  0.,  0.])
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

我还没有找到一些东西,但我想一定有更好的东西.

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

iac*_*ppo 11

使您的可变长度序列a 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]
Run Code Online (Sandbox Code Playgroud)

签名F.pad是:

  • input:输入张量是您的可变长度序列.
  • pad:m-elem元组,其中(m/2)≤输入尺寸,m是偶数.在1D情况下,第一个元素是向左和第二个元素填充多少填充到序列右侧的填充量.
  • mode:使用常量填充填充或通过复制边框或反映值.
  • value:如果选择常量填充,则为填充值.


blu*_*nox 11

作为@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)
Run Code Online (Sandbox Code Playgroud)

输出-填充序列:

tensor([[ 1,  2,  3],
        [ 1,  2,  0],
        [ 1,  0,  0]])
Run Code Online (Sandbox Code Playgroud)

签名torch.nn.utils.rnn.pad_sequence

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

  • sequencelist[Tensor])–可变长度序列的列表。
  • batch_firstbool可选) -输出将是B x T x *,如果真,或T x B x *以其他方式
  • padding_valuefloat可选)–填充元素的值。默认值:0