标签平滑的pytorch的简单实现

标签平滑的pytorch的简单实现

import torch
import torch.nn as nn
def CrossEntropyLoss_label_smooth(outputs, targets, num_classes=10, epsilon=0.1):
    N = targets.size(0)
    # torch.Size([8, 10])
    # 初始化一个矩阵, 里面的值都是epsilon / (num_classes - 1)
    smoothed_labels = torch.full(size=(N, num_classes), fill_value=epsilon / (num_classes - 1))

    targets = targets.data
    # 为矩阵中的每一行的某个index的位置赋值为1 - epsilon
    smoothed_labels.scatter_(dim=1, index=torch.unsqueeze(targets, dim=1), value=1 - epsilon)
    # 调用torch的log_softmax
    log_prob = nn.functional.log_softmax(outputs, dim=1)
    # 用之前得到的smoothed_labels来调整log_prob中每个值
    loss = - torch.sum(log_prob * smoothed_labels) / N
    return loss

if __name__ == '__main__':
    input = torch.FloatTensor(8, 10)
    label = torch.Tensor([2, 3, 4, 1, 2, 0, 9, 8]).long()
    CrossEntropyLoss_label_smooth(input, label)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值