如何在Pytorch中填充3维张量?

时间:2019-07-19 17:06:18

标签: python pytorch tensor

我试图使用内置的填充功能,但是出于某种原因,它并没有为我填充内容。这是我的可复制代码:

import torch

def padding_batched_embedding_seq():
    ## 3 sequences with embedding of size 300
    a = torch.ones(1, 4, 5) # 25 seq len (so 25 tokens)
    b = torch.ones(1, 3, 5) # 22 seq len (so 22 tokens)
    c = torch.ones(1, 2, 5) # 15 seq len (so 15 tokens)
    ##
    sequences = [a, b, c]
    batch = torch.nn.utils.rnn.pad_sequence(sequences)

if __name__ == '__main__':
    padding_batched_embedding_seq()

错误消息:

Traceback (most recent call last):
  File "padding.py", line 51, in <module>
    padding_batched_embedding_seq()
  File "padding.py", line 40, in padding_batched_embedding_seq
    batch = torch.nn.utils.rnn.pad_sequence(sequences)
  File "/Users/rene/miniconda3/envs/automl/lib/python3.7/site-packages/torch/nn/utils/rnn.py", line 376, in pad_sequence
    out_tensor[:length, i, ...] = tensor
RuntimeError: The expanded size of the tensor (4) must match the existing size (3) at non-singleton dimension 1.  Target sizes: [1, 4, 5].  Tensor sizes: [3, 5]

有什么主意吗?


交叉发布:https://discuss.pytorch.org/t/how-does-one-padd-a-tensor-of-3-dimensions/51097

1 个答案:

答案 0 :(得分:0)

您将拥有torch.ones(2,5)或torch.ones(2,...),其中...对于每个样本都是相同的尺寸。 RuntimeError:张量(4)的扩展大小必须与非单维度1上的现有大小(3)相匹配。目标大小:[1、4、5]。张量大小:[3,5] 表示它期望除第一个〜dim == 0以外的所有尺寸都相同,因为第一个是可变的seq长度,而其他则是相同的输入项。

文档https://pytorch.org/docs/stable/_modules/torch/nn/utils/rnn.html中的示例为:

 >>> from torch.nn.utils.rnn import pad_sequence
    >>> a = torch.ones(25, 300)
    >>> b = torch.ones(22, 300)
    >>> c = torch.ones(15, 300)
    >>> pad_sequence([a, b, c]).size()

输出:      torch.Size([25,3,300])

形状为:(max_sequence len,batch_size,single_input)因为batch_first = False 默认情况下,但我更喜欢batch_first = True形状为torch.Size([3,25,300])。

Pad仅表示填充零,直到它匹配最大序列len。作为RNN中的输入,您可能更喜欢不包含零输入的打包序列。

因此,在您的示例中,如果输入具有更多的暗淡效果,则就像

 a = torch.ones(4, 5, 10) # 5*10 2d input,  sequence of length 4 for them
    b = torch.ones(3, 5, 10) 
    c = torch.ones(2, 5, 10)