源代码是:
#@save
class MaskedSoftmaxCELoss(nn.CrossEntropyLoss):
“”“带遮蔽的softmax交叉熵损失函数”“”
def forward(self, pred, label, valid_len):
weights = torch.ones_like(label)
weights = sequence_mask(weights, valid_len)
self.reduction=‘none’
unweighted_loss = super(MaskedSoftmaxCELoss, self).forward(
pred.permute(0, 2, 1), label)
weighted_loss = (unweighted_loss * weights).mean(dim=1)
return weighted_loss
但是我觉得这里不应该是直接平均,应该是除以对应的有效长度大小,
从后面的loss = MaskedSoftmaxCELoss()
loss(torch.ones(3, 4, 10), torch.ones((3, 4), dtype=torch.long),
torch.tensor([4, 2, 0]))这个例子可以看出来,有效长度减半后,损失也直接减半了,因为他直接把后面的损失变成0,但是还是除以了4