Pytorch 通过Pytork中具有线性输出层的RNN发送的填充批次的掩蔽和计算损失

Pytorch 通过Pytork中具有线性输出层的RNN发送的填充批次的掩蔽和计算损失,pytorch,mini-batch,Pytorch,Mini Batch,虽然这是一个典型的用例,但我找不到一个简单而清晰的指南,说明在pytorch中,当通过RNN发送时,计算填充小批量的损失的标准方法是什么 我认为规范管道可以是: 1) pytorch RNN需要一个填充的批次张量形状:(最大顺序长度、批次大小、emb大小) 2) 我们给出了一个嵌入层,例如这个张量: tensor([[1, 1], [2, 2], [3, 9]]) 9是填充索引。批量大小为2。嵌入层将使其成形(最大顺序长度、批量大小、emb大小)。批次中的顺序是

虽然这是一个典型的用例,但我找不到一个简单而清晰的指南,说明在pytorch中,当通过RNN发送时,计算填充小批量的损失的标准方法是什么

我认为规范管道可以是:

1) pytorch RNN需要一个填充的批次张量形状:(最大顺序长度、批次大小、emb大小)

2) 我们给出了一个嵌入层,例如这个张量:

tensor([[1, 1],
        [2, 2],
        [3, 9]])
9是填充索引。批量大小为2。嵌入层将使其成形(最大顺序长度、批量大小、emb大小)。批次中的顺序是降序的,所以我们可以打包

3) 我们应用填充序列,我们应用RNN,最后我们应用填充序列。此时我们有(最大顺序长度、批量大小、隐藏大小)

4) 现在我们在结果上应用线性输出层,比如log_softmax。最后我们有一个张量,表示一批形状的分数:(max_seq_len,batch_size,linear_out_size)

我应该如何从这里计算损失,屏蔽填充部分(使用任意目标)?谢谢

我想这可能对你有指导意义

基本上,计算有效输出值的掩码(填充无效),并使用该掩码仅计算这些值的损失

请参见教程页面上的
outputVar
masknlloss
方法。为了方便起见,我在这里复制了代码,但您确实需要在所有代码的上下文中查看它

# Returns padded target sequence tensor, padding mask, and max target length
def outputVar(l, voc):
    indexes_batch = [indexesFromSentence(voc, sentence) for sentence in l]
    max_target_len = max([len(indexes) for indexes in indexes_batch])
    padList = zeroPadding(indexes_batch)
    mask = binaryMatrix(padList)
    mask = torch.BoolTensor(mask)
    padVar = torch.LongTensor(padList)
    return padVar, mask, max_target_len
def maskNLLLoss(inp, target, mask):
    nTotal = mask.sum()
    crossEntropy = -torch.log(torch.gather(inp, 1, target.view(-1, 1)).squeeze(1))
    loss = crossEntropy.masked_select(mask).mean()
    loss = loss.to(device)
    return loss, nTotal.item()