代码之家  ›  专栏  ›  技术社区  ›  MBT Nina Golyandina

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

  •  2
  • MBT Nina Golyandina  · 技术社区  · 6 年前

    我在找一份好工作

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

    我还没找到什么,但我想一定有更好的。

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

    2 回复  |  直到 6 年前
        1
  •  13
  •   MBT Nina Golyandina    6 年前

    使可变长度序列 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
    • mode :用常量或复制边框或反映值来填充填充。
    • value :如果选择常量填充,则填充值。
        2
  •  13
  •   MBT Nina Golyandina    6 年前

    作为@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]])
    

    签字人 :

    火炬.nn.utils.rnn.pad\U序列 (序列,批\u first=False,padding\u value=0)

    • 序列 list[Tensor]
    • 第一批 bool , )输出将在 B x T x * T x B x * 否则
    • 填充\u值 ( float )填充元素的值。违约: 0 .