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

作者:Jeremy_lf 时间:2021-02-07 16:08:57 

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)之间,并且它们的和为1.

计算公式

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

示例代码:

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函数之间的关系!!!

来源:https://blog.csdn.net/Jeremy_lf/article/details/102725285

标签:Pytorch,损失函数,torch.nn.NLLLoss()
0
投稿

猜你喜欢

  • Python实现8种常用抽样方法

    2023-02-01 18:03:19
  • python 识别图片中的文字信息方法

    2022-06-06 15:32:05
  • Systemd 入门实战教程

    2022-10-29 15:52:44
  • Elasticsearch的删除映射类型操作示例

    2022-05-03 09:46:50
  • 网易网站设计(思想)

    2009-03-27 17:51:00
  • Linux下远程连接Jupyter+pyspark部署教程

    2021-03-31 18:35:59
  • 运行asp.net时出现 http错误404-文件或目录未找到

    2023-07-24 01:53:36
  • Mysql中日期和时间函数介绍

    2008-05-24 08:16:00
  • Golang中HttpRouter路由的使用详解

    2024-04-30 10:04:23
  • 关于python实现requests接口测试的问题

    2023-08-27 10:09:18
  • 基于FlashPaper实现JSP在线阅读代码示例

    2023-06-14 21:02:31
  • JavaScript实现同步于本地时间的动态时间显示方法

    2024-05-11 09:33:19
  • ASP.NET Core中的Options选项模式

    2024-05-13 09:16:59
  • Python3中条件控制、循环与函数的简易教程

    2021-06-09 18:22:54
  • Django中select_related和prefetch_related的用法与区别详解

    2023-10-08 12:38:08
  • Asp实现伪静态的方法

    2007-09-29 21:27:00
  • Python练习之操作SQLite数据库

    2024-01-22 03:23:39
  • Golang操作excel的方法

    2024-04-25 15:29:50
  • python使用正则表达式分析网页中的图片并进行替换的方法

    2022-04-12 02:32:40
  • PHP的mysqli_stmt_init()函数讲解

    2023-06-08 05:04:51
  • asp之家 网络编程 m.aspxhome.com