代码拉取完成,页面将自动刷新
import torch
import torch.nn as nn
class label_smoothing_loss(nn.Module):
def __init__(self, ignore_index, epsilon=0.1):
super(label_smoothing_loss, self).__init__()
self.ignore_idx = ignore_index
self.epsilon = epsilon
def forward(self, input, target):
input = input.transpose(1, 2) # [batch_size, seq_len, word_num]
input = torch.log_softmax(input, dim=2)
k = input.size(2)
target_prob = torch.ones_like(input).type_as(input) * self.epsilon * 1 / k
mask = torch.arange(k).unsqueeze(0).unsqueeze(0).expand(target.size(0), target.size(1), -1).type_as(target)
mask = torch.eq(mask, target.unsqueeze(-1).expand(-1, -1, k))
target_prob.masked_fill_(mask, 1 - self.epsilon + (self.epsilon * 1 / k))
loss = - torch.mul(target_prob, input)
loss = loss.sum(2)
# mask ignore_idx
mask = (target != self.ignore_idx).type_as(input)
loss = (torch.mul(loss, mask).sum() / mask.sum()).mean()
return loss
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。