开发者

Pytorch损失函数torch.nn.NLLLoss()的使用

目录
  • Pytorch损失函数torch.nn.NLLLoss()
    • 交叉熵计算公式
    • nn.NLLLoss
    • 计算公式
    • log_softmax
    • nn.NLLLoss
    • nn.CrossEntropyLoss
  • 总结

    Pytorch损失函数torch.nn.NLLLoss()

    在各种深度学习框架中,我们最常用的损失函数就是交叉熵(torch.nn.CrossEntropyLoss),熵是用来描述一个系统的混乱程度,通过交叉熵我们就能够确定预测数据与真是数据之间的相近程度。

    交叉熵越小,表示数据越接近真实样本。

    交叉熵计算公式

    Pytorch损失函数torch.nn.NLLLoss()的使用

    就是我们预测的概率的对数与标签的乘积,当qk->1的时候,它的损失接近零。

    nn.NLLLoss

    官方文档中介绍称:

    nn.NLLLoss输入是一个对数概率向量和一个目标标签,它与nn.CrossEntropyLoss的关系可以描述为:softmax(x)+log(x)+nn.NLLLoss====>nn.CrossEntropyLoss

    CrossEntropyLoss()=log_softmax() + NLLLoss() 

    其中softmax函数又称为归一化指数函数,它可以把一个多维向量压缩在(0,1)之间,javascript并且它们的开发者_JAVA学习和为1.

    计算公式

    Pytorch损失函数torch.nn.NLLLoss()的使用

     

    示例代码:

    import math
    z = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0,js 3.0]
    z_exp = [math.exp(i) for i in z]  
    print(z_exp)  # Result: [2.72, 7.39, 20.09, 54.6, 2.72, 7.39, 20.09] 
    sum_z_exp = sum(z_exp)  
    print(sum_z_exp)  # Result: 114.98 
    softmax = [round(i / sum_z_exjavascriptp, 3) for i in z_exp]
    print(softmax)  # Result: [0.024, 0.064, 0.175, 0.475, 0.024, 0.064, 0.175]
    

    log_softmax

    log_softmax是指在softmax函数的基础上,再进行一次log运算,此时结果有正有负,log函数的值域是负无穷到正无穷,当x在0—1之间的时候,log(x)值在负无穷到0之间。

    nn.NLLLoss

    此时,nn.NLLLoss的结果就是把上面的输出与Label对应的那个值拿出来,再去掉负号,再求均值。

    代码示例:

    import torch
    input=torch.randn(3,3)
    soft_input = torch.nn.Softmax(dim=0)
    soft_input(input)
    Out[20]: 
    tensor([[0.7284, 0.7364, 0.3343],
            [0.1565, 0.0365, 0.04javascript08],
            [0.1150, 0.2270, 0.6250]])
    
    #对softmax结果取log
    torch.log(soft_input(input))
    Out[21]: 
    tensor([[-0.3168, -0.3059, -1.0958],
            [-1.8546, -3.3093, -3.1995],
            [-2.1625, -1.4827, -0.4701]])
    

    假设标签是[0,1,2],第一行取第0个元素,第二行取第1个,第三行取第2个,去掉负号,即[0.3168,3.3093,0.4701],求平均值,就可以得到损失值。

    (0.3168+3.3093+0.4701)/3
    Out[22]: 1.3654000000000002
    
    #验证一下
    
    loss=torch.nn.NLLLoss()
    target=torch.tensor([0,1,2])
    loss(input,target)
    Out[26]: tensor(0.1365)
    

    nn.CrossEntropyLoss

    loss=torch.nn.NLLLoss()
    target=torch.tensor([0,1,2])
    loss(input,target)
    Out[26]: tensor(-0.1399)
    loss =torch.nn.CrossEntropyLoss()
    input = torch.tensor([[ 1.1879,  1.0780,  0.5312],
            [-0.3499, -1.9253, -1.5725],
       javascript     [-0.6578, -0.0987,  1.1570]])
    target = torch.tensor([0,1,2])
    loss(input,target)
    Out[30]: tensor(0.1365)
    
    以上为全部实验验证两个loss函数之间的关系!!!
    

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜