首页 > 解决方案 > 如何为 torch.nn.utils.rnn.pack_sequence 转换 2D 和索引张量

问题描述

我有以下形式的序列集合:

sequences = torch.tensor([[2,1],[5,6],[3,0])
indexes = torch.tensor([1,0,1])

也就是说,序列0是由 just 组成的[5,6],而序列1是由 组成的[2,1] , [3,0]。数学上sequence[i] = { sequences[j] such that i = indexes[j] }

我需要将这些序列输入LSTM。由于这些是可变长度序列,pytorch 文档声明使用类似torch.nn.utils.rnn.pack_sequence.

可悲的是,这种方法及其类似方法需要一个张量列表作为输入,其中每个张量都是 a L x *, L 是单个序列的长度。

如何构建可以输入 pytorch LSTM 的东西?

Ps 在整个代码中,我使用这些张量scattergather功能,但我找不到使用它们来实现这个目标的方法。

标签: pythonnumpymachine-learningpytorchlstm

解决方案


首先,您需要分离序列。Pack_sequence 接受张量列表,每个张量的形状为 L x *。所有序列的其他维度必须始终相同,但 L 或序列长度可以变化。例如,您的序列 0 和 1 可以打包为:

sequences = [torch.tensor([[5,6]]), torch.tensor([[2,1],[3,0]])]
packed_seq = torch.nn.utils.rnn.pack_sequence(sequences, enforce_sorted=False)

这里,在序列中,sequence[0] 的形状为 (1,2),而序列[1] 的形状为 (2,2)。第一个维度表示它们的长度,分别为 1 和 2。

您可以通过以下方式分隔序列:

sequences = torch.tensor([[2,1],[5,6],[3,0]])
indexes = torch.tensor([1,0,1])
num_seq = np.unique(indexes)
sequences = [sequences[indexes==seq_id] for seq_id in num_seq]

这会创建sequences=[torch.tensor([[5,6]]), torch.tensor([[2,1],[3,0]])].


推荐阅读