我正在寻找一种好的(有效的,最好是简单的)方法来从可变长度/形状的序列创建填充张量.到目前为止,我能想象的最好的方法是这样一个天真的方法:
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)
- sequence(
list[Tensor])–可变长度序列的列表。- batch_first(
bool,可选) -输出将是B x T x *,如果真,或T x B x *以其他方式- padding_value(
float,可选)–填充元素的值。默认值:0。
| 归档时间: |
|
| 查看次数: |
3258 次 |
| 最近记录: |