PyTorch里的多分类损失函数

http://blog.leanote.com/post/lincent/PyTorch%E9%87%8C%E7%9A%84%E5%A4%9A%E5%88%86%E7%B1%BB%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0-2

最近大热的PyTorch即将推出1.0版,做为各类深度学习任务的最优框架之一,PyTorch提供了丰富的损失函数,而多分类任务用到最多的就是nn.CrossEntropyLossnn.NLLLoss了,不妨讨论一下。

nn.CrossEntropyLoss

CrossEntropy顾名思义就是交叉熵,概念来自香农的信息论,用于度量两个概率分布间的差异性信息,可以认为是在给定的真实分布下,使用非真实分布的策略消除系统的不确定性所需要付出的努力的大小。交叉熵越小,证明计算出的非真实分布越接近真实分布。

公式如下:

 

H(p,q)=−∑k=1N(pk∗logqk)H(p,q)=−∑k=1N(pk∗logqk)

在PyTroch的文档中明确指出它和nn.NLLLoss之间的关系,后面我们会进行测试。

This criterion combines nn.LogSoftmax() and nn.NLLLoss() in one single class.

nn.NLLLoss

全名是负对数似然损失函数(Negative Log Likelihood),在PyTorch的文档中有如下说明:

Obtaining log-probabilities in a neural network is easily achieved by adding a LogSoftmax layer in the last layer of your network. You may use CrossEntropyLoss instead, if you prefer not to add an extra layer.

简单来说,如果最后一层做了log softmax处理,那就直接使用nn.NLLLoss,我们动手试试吧。

以下演示基于0.2.1版

  1. 首先我们构造一个网络的输出做为我们的预测值,再构造一个真实分布,一起做为损失函数的输入。

    
    #预测值
    
    inputs_tensor = torch.FloatTensor( [
    [10, 0, 3,-1, 1],
    [-1,-2, 0,-3,-4],
    [-1, 1, 4, 8, 2]
    ])
    
    #真实值
    
    targets_tensor = torch.LongTensor([1,2,3])
  2. 计算预测值的log softmax,这里有先计算softmax再取log和直接调用log_softmax函数两种方式,结果相同。

    
    #分步计算log softmax
    
    softmax_result = F.softmax(inputs_variable)
    logsoftmax_result = np.log(softmax_result.data)
    
    #logsoftmax_result:
    
    
    #-0.0011 -10.0011  -7.0011 -11.0011  -9.0011
    
    
    #-1.4519  -2.4519  -0.4519  -3.4519  -4.4519
    
    
    #-9.0216  -7.0216  -4.0216  -0.0216  -6.0216
    
    
    #[torch.FloatTensor of size 3x5]
    
    
    
    #直接调用log_softmax
    
    log_softmax_result = F.log_softmax(inputs_variable)
    
    #log_softmax_result:
    
    
    #-0.0011 -10.0011  -7.0011 -11.0011  -9.0011
    
    
    #-1.4519  -2.4519  -0.4519  -3.4519  -4.4519
    
    
    #-9.0216  -7.0216  -4.0216  -0.0216  -6.0216
    
    
    #[torch.FloatTensor of size 3x5]
  3. 计算每个样本的交叉熵再求平均,得到的结果和直接调用nn.CrossEntropyLoss函数相同。

    loss = nn.CrossEntropyLoss()
    output = loss(inputs_variable, targets_variable)
    
    # 3.4915
    
    
    # [torch.FloatTensor of size 1]
  4. 将前面求出的log softmax结果直接做为nn.NLLLoss的输入,得到的结果相同。

    loss = nn.NLLLoss()
    output = loss(log_softmax_result, targets_variable)
    
    # 3.4915
    
    
    # [torch.FloatTensor of size 1]
多分类Dice损失函数是一种用于语义分割任务的损失函数。它是基于Dice系数的度量,用于衡量模型预测结果与真实标签之间的相似度。Dice损失函数可以将预测结果与真实标签进行对比,并优化模型参数以最大化Dice系数。 在多分类任务中,每个类别都有一个对应的Dice损失函数。常见的做法是使用多个Dice损失函数对每个类别进行独立的分割,然后将这些损失函数整合到一个总的损失函数中。这个总的损失函数被称为Generalized Dice损失函数。 Generalized Dice损失函数的计算方式如下: 1. 计算每个类别的Dice系数:对于每个类别i,将模型预测结果与真实标签进行相交运算并计算相交区域的像素数量,然后计算相交区域的大小与预测区域和真实区域大小之和的比值,得到Dice系数Di。 2. 计算类别权重:对于每个类别i,计算其在真实标签中的像素数量与总像素数量的比值,得到类别权重Wi。 3. 将Dice系数与类别权重相乘并求和:将每个类别的Dice系数Di与对应的类别权重Wi相乘,并将所有类别的结果求和,得到Generalized Dice损失函数L。 通过最小化Generalized Dice损失函数,模型可以更好地适应多分类语义分割任务,提高预测结果的准确性。 参考文献: - 引用: 【损失函数合集】超详细的语义分割中的Loss大盘点 - 引用: Tensorflow入门教程(四十七)——语义分割损失函数总结 - 引用: 论文地址:A survey of loss functions for semantic segmentation code地址:Semantic-Segmentation-Loss-Functions
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值