2

有没有人知道一种为张量生成“段标签”的方法,给定一个表示张量内段边界的唯一值?

例如,给定一个 1D 输入张量,其中值1表示段边界,

x = torch.Tensor([5, 4, 1, 3, 6, 2])

生成的段标签张量应该具有相同的形状,其值代表两个段:

segment_label = torch.Tensor([1, 1, 1, 2, 2, 2])

同样,对于一批输入,例如批量大小 = 3,

x = torch.Tensor([
    [5, 4, 1, 3, 6, 2],
    [9, 4, 5, 1, 8, 10],
    [10, 1, 5, 4, 8, 9]
    ])

生成的段标签张量(1用作段分隔符)应如下所示:

segment_label = torch.Tensor([
    [1, 1, 1, 2, 2, 2],
    [1, 1, 1, 1, 2, 2],
    [1, 1, 2, 2, 2, 2]
    ])

上下文:我目前正在 PyTorch 中使用 Fairseq 的 Transformer 实现来完成 seq2seq NLP 任务。我正在寻找一种在编码器前向传递期间将类似 BERT 的片段嵌入合并到 Transformer 中的方法,而不是修改用于翻译任务的现有数据集,例如language_pair_dataset.

提前致谢!

4

1 回答 1

1

您可以使用torch.cumsum以下技巧:

mask = (x == 1).to(x)  # mask with only the boundaries
segment_label = mask.cumsum(dim=-1) - mask + 1

结果符合预期segment_label

于 2020-12-07T11:51:08.657 回答