手写Cross Entropy Loss Function
手写交叉熵Cross Entropy Loss Function,针对分割任务,2D-Tensor
最近准备在cross entropy的基础上自定义loss function, 但是看pytorch的源码Python部分没有写loss function的实现,看实现过程还得去翻它的c代码,比较复杂。写这个帖子的另一个原因是,网络上大多数Cross Entropy Loss 的实现是针对于一维信号,或者是分类任务的,没找到关于分割任务的。因此,准备手写一个Cross Entropy Loss Function,也供大家参考。
先介绍两种Pytorch的Cross Entropy loss function的写法
一. Pytorch 比较常用的CrossEntropyLoss
import torch
ce_loss = torch.nn.CrossEntropyLoss(ignore_index=255, reduction='mean', size_average = True)
cross_entropy1 = ce_loss(yHat, y)
yHat 就是模型的输出,y就是了label。
二. 使用Pytorch里面的torch.nn.NLLLoss
import torch
import torch.nn.functional as F
nll_loss = torch.nn.NLLLoss()
cross_entropy = nll_loss(F.log_softmax(yHat, dim=1), y)
“Note that this case is equivalent to the combination of LogSoftmax and NLLLoss.” Pytorch 官方说:CrossEntropyLoss 就是NLLLoss 和LogSoftmax的一个结合。所以用哪个都一样,这两种结果我测试过了,算出的loss数值精确到小数点后六位都是一样的。
手写Cross Entropy Loss Function
这里手写的Cross Entropy Loss Function只实现了Cross Entropy的基本功能,对于Pytorch里面一些ignore_index, weight 等参数没有考虑。
完整loss function代码如下
class ESPL_CE(nn.Module):def __init__(self,num_classes):super(ESPL_CE, self).__init__()self.num_classes = num_classesdef forward(self, yHat, y):P_i = torch.nn.functional.log_softmax(yHat, dim=1)y = torch.nn.functional.one_hot(y,num_classes=self.num_classes)y = y.permute(0, 3, 1, 2)loss = y*(P_i + 0.000000000001)loss = torch.sum(loss, dim=1)loss = torch.mean(loss, dim=(0,1,2))hand_cross_entropy = -1*lossreturn hand_cross_entropy
使用方法:
hand_ce_loss = ESPL_CE(number_class)
yHat = model(x)
loss = hand_ce_loss(yHat, y)
x 是模型的输出,y是label。
我测试过这三种loss function写法的结果,loss小数点后六位都是一致的。希望对大家有用!完整代码下载。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
