gpt4 book ai didi

indexing - 从打包序列中获取每个序列的最后一项

转载 作者:行者123 更新时间:2023-12-02 20:03:08 24 4
gpt4 key购买 nike

我试图通过 GRU 放置打包和填充的序列,并检索每个序列最后一项的输出。当然,我指的不是 -1 项,而是实际的最后一个、未填充的项。我们预先知道序列的长度,因此应该很容易为每个序列提取 length-1 项。

我尝试了以下方法

import torch
from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence

# Data
input = torch.Tensor([[[0., 0., 0.],
[1., 0., 1.],
[1., 1., 0.],
[1., 0., 1.],
[1., 0., 1.],
[1., 1., 0.]],

[[1., 1., 0.],
[0., 1., 0.],
[0., 0., 0.],
[0., 1., 0.],
[0., 0., 0.],
[0., 0., 0.]],

[[0., 0., 0.],
[1., 0., 0.],
[1., 1., 1.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]],

[[1., 1., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]]])

lengths = [6, 4, 3, 1]
p = pack_padded_sequence(input, lengths, batch_first=True)

# Forward
gru = torch.nn.GRU(3, 12, batch_first=True)
packed_output, gru_h = gru(p)

# Unpack
output, input_sizes = pad_packed_sequence(packed_output, batch_first=True)

last_seq_idxs = torch.LongTensor([x-1 for x in input_sizes])

last_seq_items = torch.index_select(output, 1, last_seq_idxs)

print(last_seq_items.size())
# torch.Size([4, 4, 12])

但是形状不是我所期望的。我原本期望得到4x12,即每个单独序列x隐藏的最后一项。`

我可以遍历整个过程,并构建一个包含我需要的项目的新张量,但我希望有一种利用一些智能数学的内置方法。我担心手动循环和构建会导致性能非常差。

最佳答案

您可以只执行 last_seq_items=output[torch.arange(4), input_sizes-1],而不是最后两个操作 last_seq_idxslast_seq_items >。

我认为 index_select 做得不对。它将选择您传递的索引处的整个批处理,因此您的输出大小为 [4,4,12]。

关于indexing - 从打包序列中获取每个序列的最后一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55399115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com