Poly1CrossEntropyLoss的pytorch实现

代码改自github

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np


class Poly1CrossEntropyLoss(nn.Module):
    def __init__(self,
                 num_classes: int,
                 epsilon: float = 1.0,
                 reduction: str = "none"):
        """
        Create instance of Poly1CrossEntropyLoss
        :param num_classes:
        :param epsilon:
        :param reduction: one of none|sum|mean, apply reduction to final loss tensor
        """
        super(Poly1CrossEntropyLoss, self).__init__()
        self.num_classes = num_classes
        self.epsilon = epsilon
        self.reduction = reduction
        return

    def forward(self, output, labels):
        """
        Forward pass
        :param output: tensor of shape [N, num_classes]
        :param labels: tensor of shape [N] or [N, num_classes]
        :return: poly cross-entropy loss
        """
        #timm如果有使用cutmix或者mixup,那么就会得到的labels是[batchsize,classnums]维度的矩阵,因为获取的label不是hard label,但也不算是smooth label,是每个数据对应的label类似于这种[0,0,0.65,0,0,0.35,0,...]
        if labels.ndim == 1:
        	labels_onehot = F.one_hot(labels, num_classes=self.num_classes).to(device=output.device,dtype=output.dtype)
        else:
        	labels=labels.to(device=output.device)
        pt = torch.sum(labels * F.softmax(output, dim=-1), dim=-1)#64,1
        CE = F.cross_entropy(input=output, target=labels, reduction='none')
        # print(CE.shape)#64
        poly1 = CE + self.epsilon * (1 - pt)
        if self.reduction == "mean":
            poly1 = poly1.mean()
        elif self.reduction == "sum":
            poly1 = poly1.sum()
        #加上这个平均操作是为了获取每个数据平均的loss,如果不加就是长度为batchsize的一维矩阵,分别存放每个数据对应的loss
        #poly1 = poly1.mean()
        return poly1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值