Nlp 如何在PyTorch中将句子长度批量转换为掩码?

Nlp 如何在PyTorch中将句子长度批量转换为掩码?,nlp,pytorch,Nlp,Pytorch,例如,从 lens = [3, 5, 4] 我们想得到 mask = [[1, 1, 1, 0, 0], [1, 1, 1, 1, 1], [1, 1, 1, 1, 0]] 这两种都是torch.LongTensors.我发现的一种方法是: torch.arange(max_len).expand(len(lens), max_len) < lens.unsqueeze(1) torch.arange(max_len).展开(len(lens),max

例如,从

lens = [3, 5, 4]
我们想得到

mask = [[1, 1, 1, 0, 0],
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 0]]

这两种都是torch.LongTensors.

我发现的一种方法是:

torch.arange(max_len).expand(len(lens), max_len) < lens.unsqueeze(1)
torch.arange(max_len).展开(len(lens),max_len)

如果有更好的方法,请分享

torch.arange(max_len)[None,:]
只是对@ypc的答案做一点解释(由于缺乏声誉,无法发表评论):

torch.arange(max_len)[None,:]

总之,答案使用
广播
机制来隐式地
扩展
张量,就像在接受的答案中所做的那样。逐步:

  • torch.arange(max_len)为您提供
    [0,1,2,3,4]

  • 添加
    [None,:]
    将第0维附加到张量,使其形状
    (1,5)
    ,从而提供
    [[0,1,2,3,4]

  • 类似地,
    lens[:,None]
    向张量
    lens
    附加第一维度,使其形状
    (3,1)
    ,即
    [[3],[5],[4]

  • 通过比较(或做类似+,-,*,/,等等的事情)
    (1,5)
    (3,1)
    的张量,遵循
    广播的规则,得到的张量将是
    (3,5)
    ,结果值将是
    结果[i,j]=(j


  • 试着描述一下你的答案。它将帮助其他人轻松捕获您的代码。请参阅