我正在尝试填充张量序列以进行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]]])
填充似乎是垂直的,而不是我期望的。我该如何获得所需的正确填充?
答案 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