Pytorch的packed_sequence / pad_sequence垂直填充张量以获得张量列表

时间:2019-06-02 06:52:37

标签: python pytorch lstm

我正在尝试填充张量序列以进行LSTM迷你批处理,其中序列中的每个时间步都包含张量的子列表(在单个时间步中代表多个特征)。

例如,序列1将具有3个时间步长,并且在每个时间步长内都有2个特征。下面是一个示例:

序列1 = [[1,2],[2,2],[3,3],[3,2],[3,2]]

序列2 = [[4,2],[5,1],[4,4]]

序列3 = [[6,9]]

我运行pytorch的pad_sequence函数(这也适用于pack_sequence),如下所示:

import torch
import torch.nn.utils.rnn as rnn_utils

a = torch.tensor([[1,2],[2,2],[3,3],[3,2],[3,2]])
b = torch.tensor([[4,2],[5,1],[4,4]])
c = torch.tensor([[6,9]])
result = rnn_utils.pad_sequence([a, b, c])

我的预期输出如下:

序列1 = [[1,2],[2,2],[3,3],[3,2],[3,2]]

序列2 = [[4,2],[5,1],[4,4],[0,0],[0,0]]

序列3 = [[6,9],[0,0],[0,0],[0,0],[0,0]]

但是,我得到的输出如下:

tensor([[[1, 2],
         [4, 2],
         [6, 9]],

        [[2, 2],
         [5, 1],
         [0, 0]],

        [[3, 3],
         [4, 4],
         [0, 0]],

        [[3, 2],
         [0, 0],
         [0, 0]],

        [[3, 2],
         [0, 0],
         [0, 0]]])

填充似乎是垂直的,而不是我期望的。我该如何获得所需的正确填充?

1 个答案:

答案 0 :(得分:0)

只需更改

result = rnn_utils.pad_sequence([a, b, c])

result = rnn_utils.pad_sequence([a, b, c], batch_first=True)
seq1 = result[0]
seq2 = result[1]
seq3 = result[2]

默认情况下,batch_first为False。如果为True,则输出将在B x T x *中;否则,将在T x B x *中输出

B是批量大小。它等于sequences中的元素数,

T是最长序列的长度,并且

*是任意数量的尾随尺寸,包括无。

输出:

tensor([[1, 2],
        [2, 2],
        [3, 3],
        [3, 2],
        [3, 2]]) # sequence 1
tensor([[4, 2],
        [5, 1],
        [4, 4],
        [0, 0],
        [0, 0]]) # sequence 2
tensor([[6, 9],
        [0, 0],
        [0, 0],
        [0, 0],
        [0, 0]]) # sequence 3