我有一组序列,格式如下:
sequences = torch.tensor([[2,1],[5,6],[3,0]])indexes = torch.tensor([1,0,1])
也就是说,序列0
仅由[5,6]
组成,而序列1
由[2,1], [3,0]
组成。从数学上讲,sequence[i] = { sequences[j] 只要 i = indexes[j] }
我需要将这些序列输入到LSTM中。由于这些是变长序列,PyTorch文档建议使用类似torch.nn.utils.rnn.pack_sequence
的方法。
遗憾的是,这种方法及其类似方法需要输入一个张量列表,每个张量都是L x *
形式,其中L是单个序列的长度。
如何构建可以输入PyTorch LSTM的数据结构?
附注:在整个代码中,我使用scatter
和gather
功能处理这些张量,但找不到使用它们来实现这一目标的方法。
回答:
我找到了一个替代且更高效的分离序列的方法:
sequences = torch.tensor([[2,1],[5,6],[3,0]])indexes = torch.tensor([1,0,1])sorted_src = src[indexes.argsort()]indexes_count = torch.unique(indexes, return_counts=True)[1]splitted = torch.split(sorted_src, indexes_count.tolist(), dim=0)
这种方法比@***提出的方法快近三倍。
使用
timeit
模块测量,序列为(5000,256)的张量,索引为(1500)的张量