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

biswetbf  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(137)

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

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.])

有没有更好的办法?

  • 我还没找到但我想一定有更好的 *
  • 我正在考虑使用一些函数来将序列Tensor扩展为具有所需填充的所需形状。或者直接从序列创建填充Tensor。当然,其他方法也是受欢迎的。*
eufgjt7s

eufgjt7s1#

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

我只是偶然发现了torch.nn.utils.rnn.pad_sequence,因为这与@iacolippo的解决方案有点不同,我在这里发布了它。
它获取一个可变长度的Tensor列表,并将它们组合成一个矩阵-将所有序列填充为给定的最长序列。

代码示例:

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 (sequences,batch_first=False,padding_value=0)
    *sequenceslist[Tensor])-可变长度序列的列表。
    *batch_firstbooloptional)-如果为True,输出将以B x T x *为单位,否则以T x B x *为单位
    *padding_valuefloatoptional)-填充元素的值。默认值:0
nwlls2ji

nwlls2ji2#

将可变长度序列设置为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:输入Tensor,这是你的可变长度序列。
  • pad:m-elem元组,其中(m/2)≤输入维数,m是偶数。在一维情况下,第一个元素是序列左边有多少填充,第二个元素是序列右边有多少填充。
  • mode:用常量填充填充,或者通过复制边框或反映值来填充。
  • value:如果选择常量填充,填充值。

相关问题