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]
  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值