python - 如何为 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 在整个代码中,我使用这些张量scatter
和gather
功能,但我找不到使用它们来实现这个目标的方法。
解决方案
首先,您需要分离序列。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]])]
.
推荐阅读
- c# - string.Split() 与单个字符与一个长度的字符数组之间有区别吗?
- python - 如何更新 Postgres JSON 字段中对象数组中存在的对象的特定值
- ide - AHK-Studio 卡在下载中
- c# - 从简单的 sql 表填充树视图树
- cosmos - 运行 starport 脚手架命令时,如何修复“不再支持此版本的 Cosmos SDK”的错误消息?
- azure-functions - 使用 Azure Function 读取文件
- javascript - 如何从另一个数组中的 JSON 对象中提取值?
- python - Years Pandas 按问题分组
- php - 为什么我在 laravel 控制器中排序的数据未在视图中显示为已排序
- c++ - 安装 cuda 工具包后 glfwCreateWindow() 失败