我正在寻找一种好的(高效且最好是简单的)方法来从可变长度/形状的序列创建填充张量。到目前为止,我能想到的最好的方法是像这样的天真的方法:
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.])
有更好的方法吗?
我还没找到什么,但我想一定有更好的。
我正在考虑一些函数来将序列张量扩展到具有所需填充的所需形状。或者直接从序列创建填充张量。但当然也欢迎其他方法。
作为@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(
,可选) – 如果为 True,输出将在bool
中,否则在B x T x *
中T x B x *
- padding_value (
, 可选) – 填充元素的值。默认:float
。0
将可变长度序列设为
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
:如果选择恒定填充,则填充值。