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

交叉熵计算公式:

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

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

CrossEntropyLoss()=log_softmax() + NLLLoss()

其中softmax函数又称为归一化指数函数,它可以把一个多维向量压缩在(0,1)之间,并且它们的和为1.
计算公式:

示例代码

import math
z = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 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_exp, 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.0408],[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],[-0.6578, -0.0987,  1.1570]])
target = torch.tensor([0,1,2])
loss(input,target)
Out[30]: tensor(0.1365)以上为全部实验验证两个loss函数之间的关系!!!

torch.nn.NLLLoss()相关推荐

  1. 深入理解Pytorch负对数似然函数(torch.nn.NLLLoss)和交叉熵损失函数(torch.nn.CrossEntropyLoss)

    在看Pytorch的交叉熵损失函数torch.nn.CrossEntropyLoss官方文档介绍中,给出的表达式如下.不免有点疑惑为何交叉熵损失的表达式是这个样子的 loss ⁡ ( y , clas ...

  2. Pytorch损失函数torch.nn.NLLLoss()详解

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

  3. torch.nn、(二)

    参考 torch.nn.(二) - 云+社区 - 腾讯云 目录 Recurrent layers RNN LSTM GRU RNNCell LSTMCell GRUCell Transformer l ...

  4. [Pytorch系列-28]:神经网络基础 - torch.nn模块功能列表

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  5. torch.nn里的损失函数:MSE、BCE、BCEWithLogits、NLLLoss、CrossEntropyLoss的用法

    1. nn.MSELoss() 模型的预测值与标签的L2距离.一般用于回归问题.之所以不用于分类问题,可能原因为:使用sigmoid之后,函数形式不是凸函数 ,不容易求解 ,容易进入局部最优. los ...

  6. [深度学习] Pytorch nn.CrossEntropyLoss()和nn.NLLLoss() 区别

    nn.NLLLoss()的参数是经过logsoftmax加工的,而CrossEntropyLoss的是原始输出数据 target = torch.tensor([1, 2]) entropy_out ...

  7. PyTorch之torch.nn.CrossEntropyLoss()

    简介 信息熵: 按照真实分布p来衡量识别一个样本所需的编码长度的期望,即平均编码长度 交叉熵: 使用拟合分布q来表示来自真实分布p的编码长度的期望,即平均编码长度 多分类任务中的交叉熵损失函数 代码 ...

  8. Pytorch踩坑记之交叉熵(nn.CrossEntropy,nn.NLLLoss,nn.BCELoss的区别和使用)

    目录 nn.Softmax和nn.LogSoftmax nn.NLLLoss nn.CrossEntropy nn.BCELoss 总结 在Pytorch中的交叉熵函数的血泪史要从nn.CrossEn ...

  9. torch.nn、(一)

    参考 torch.nn.(一) - 云+社区 - 腾讯云 目录 torch.nn Parameters Containers Module Sequential ModuleList ModuleDi ...

  10. KLD Loss( tf.nn.softmax, torch.nn.functional.softmax, log_softmax, kl_div) 计算技巧(一)

    最近在比较不同模型的性能,发现虽然文献中使用的相同的指标,比如KLD.但是数据的处理方式却存在着差异,这会导致最后的数据并不具有直接可比性. 这里记录下,其中的一些值得记住的细节.主要涉及的API包括 ...

最新文章

  1. 如何制作python代码_如何使用50行Python代码制作一个计算器
  2. ECMAScript5 Object的新属性方法
  3. 入门第十一课 Python语句的嵌套
  4. 一文掌握Python集合的语法与应用
  5. Docker学习总结(18)——阿里超大规模Docker化之路
  6. UVA12439 February 29【日期计算】
  7. 解决position:fixed抖动的问题
  8. 2019CVPR论文以及源码 awesome-object-proposals
  9. 基于UNITY引擎开发的游戏源码修改方法
  10. python 自动换ip_python实现自动更换ip的方法
  11. extern小结(转)
  12. 404 找不到页面_找不到404页面设计,如何创建较大的错误页面
  13. Curator的使用
  14. 什么是运维?运维开发需要做哪些事情?
  15. 数据库常用命令及关键字
  16. 坚持一年背英语单词的总结
  17. 版本动态 | Apache Linkis(Incubating) 计算中间件1.1.2 版本发布
  18. 出现身份验证错误。 要求的函数不受支持, 远程计算机 这可能是由于CredSSP加密数据库修正
  19. 别被漫画骗了..棋魂真正的结局是....
  20. xshell打开多个窗口_打开软件太多,窗口用起来一团糟?让它来帮你管理:Groupy...

热门文章

  1. java 与 c# 3des 加解密
  2. 老外写的比较好用的splitter控件
  3. 去掉内容中的所有全部html标签。
  4. 04.spring boot配置文件--yml
  5. [2018.10.31 T3] 玩
  6. BZOJ3994[SDOI2015] 约数个数和
  7. vue : 无法加载文件 D:\Program Files\nodejs\vue.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsof t.com/fwlin
  8. 华为平板m5鸿蒙,华为平板M5系列发布:搭载麒麟960 售价2088元起
  9. 不同平台安装python的方式一样吗_Python软件的正确安装方式
  10. python3.7安装opencv4.1_VS2019+python3.7+opencv4.1+tensorflow1.13配置详解