加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
label_smoothing_loss.py 1.03 KB
一键复制 编辑 原始数据 按行查看 历史
yixinL7 提交于 2022-03-30 00:53 . major changes
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
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化