我正在寻找一个好的 (有效的,最好是简单的) 方法来从可变长度/形状的序列中创建填充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。当然,其他方法也是受欢迎的。*
2条答案
按热度按时间eufgjt7s1#
我只是偶然发现了
torch.nn.utils.rnn.pad_sequence
,因为这与@iacolippo的解决方案有点不同,我在这里发布了它。它获取一个可变长度的Tensor列表,并将它们组合成一个矩阵-将所有序列填充为给定的最长序列。
代码示例:
字符串
输出填充序列:
型
torch.nn.utils.rnn.pad_sequence
:***torch.nn.utils.rnn.pad_sequence (sequences,batch_first=False,padding_value=0)
*sequences(
list[Tensor]
)-可变长度序列的列表。*batch_first(
bool
,optional)-如果为True,输出将以B x T x *
为单位,否则以T x B x *
为单位*padding_value(
float
,optional)-填充元素的值。默认值:0
。nwlls2ji2#
将可变长度序列设置为
torch.Tensor
并使用torch.nn.functional.pad
字符串
F.pad
的签名是:input
:输入Tensor,这是你的可变长度序列。pad
:m-elem元组,其中(m/2)≤输入维数,m是偶数。在一维情况下,第一个元素是序列左边有多少填充,第二个元素是序列右边有多少填充。mode
:用常量填充填充,或者通过复制边框或反映值来填充。value
:如果选择常量填充,填充值。