1.torch.nn.Softmax

做什么的:将Softmax函数应用于n维输入张量,重新缩放它们,以便n维输出张量的元素位于[0,1]范围内,并且总和为1。

注意事项:需要指定按照行和为1还是列和为1,参数设置dim=1表示行和为1,dim=0表示列和为1。

计算公式:

难点:看到公式,手动该如何计算?假设需要进行softmax操作的张量是:[[1,2,3],[1,2,4]]是一个2*3规模的张量,经过softmax后,希望行和为1,手动计算过程(把公式列举出来,计算可以使用百度帮忙计算):

根据计算公式,把算式列出来,通过百度计算出结果。

    

手动计算结果出来了,接着写段代码来验证一下,看看是否和计算结果一致。

代码:

import torch
import torch.nn as nn
m = nn.Softmax(dim=1)
input = torch.Tensor([[1,2,3],[1,2,4]])
print(input)
output = m(input)
print(output)

代码运行结果:

观察结果:结果都是小数点后保留4位小数,对比第一行手动计算结果,是一致的。接着按照同样的公式,把第二行的结果计算出来

       

对比结果中的第二行,确实是一致的。观察结果:每行的和为1,这是因为dim=1这个参数所控制的。

总结:该公式的意义有点像计算每个值占总和中的比例,总和为1,每个值的范围是[0,1]之间。可以理解为概率。

2.torch.nn.LogSoftmax

做什么的:通过softmax计算出来的占比,也可以理解为概率大小,因为都是0-1之间的数,概率很小的时候,还要进行连乘操作,会导致结果更小,为了避免下溢,将积运算转换为和运算,使用的公式是:

注意事项:公式中只写了一个log,底数没有给出,需要首先确定底数是多少,一般底数比较特殊的就是2和e以及10,e可以排除,如果是e,一般是写为ln,10为底一般可以写为lg,所以优先猜测是以2位底的,其次,计算机机器码就是0和1组成,所以是2的可能性很大。

计算公式:

观察公式,好像就是比Softmax的结果上加了一个log,也就是取对数。那我把上面计算结果去对数看看:

python中有数学公式,直接调用,这次就不要傻傻的去百度计算结果,因为输入的时候不好计算,对数m为底n的对数,输入不方便,所以调用现成的。

代码:

x00 = math.log(0.0900)
x01 = math.log(0.2447)
x02 = math.log(0.6652)
x10 = math.log(0.0420)
x11 = math.log(0.1142)
x12 = math.log(0.8438)
print(x00, x01, x02)
print(x10, x11, x12)

运行结果:

这个计算结果就理解为手动计算出来的结果,也就是将softmax计算出来的结果,取了对数,可能存在一些误差,softmax计算出来的结果是保留了4位小数的。

为了验证手动计算结果是否准确,上代码,看看运行结果

代码:

​​import torch
import torch.nn as nn
m = nn.LogSoftmax(dim=1)
input = torch.Tensor([[1,2,3],[1,2,4]])
print(input)
output = m(input)
print(output)

代码运行结果:

结果显示:和手动结算结果是一致的。说明我们对公式的理解没有问题。注意:举例都是在dim=1参数下做的,不要把条件搞忘了。

总结:在softmax上加了对数,可以理解为对数概率。

3.torch.nn.NLLLoss

做什么的:负对数似然损失,训练分类。

手动计算过程:首先需要明确的点是:NLLLoss函数输入input之前,需要对input进行log_softmax处理。

假设数据是:[[1,2,3],[1,2,4]],标签为:[1,2] dim设置为1,按行求和

首先计算softmax,计算结果是[[0.0900,0.2447,0.6652],[0.0420,0.1142,0.8438]]

再取对数,计算结果是:[[-2.4076,-1.4076,-0.4076],[-3.1698,-2.1698,-0.1698]]

计算负对数似然,首先取负数,再计算,默认是取均值。

根据标签,1表示第一行的索引为1的的数,即:-1.4076

2表示第二行的索引为2的数,即:-0.1698

取负数后,1.4076和0.1698

求均值:(1.4076+0.1698)/2 = 1.5774/2=0.7887

注意事项:标签中的索引号范围是:[0,C-1],比如分为3类,则最多出现:0,1,2,不可能出现比0小或者比2大的数成为标签中的元素。

写段代码验证一下手动计算结果。

代码:

m = nn.LogSoftmax(dim=1)  # 模型
loss = nn.NLLLoss()  # 计算损失的标准
input = torch.Tensor([[1,2,3],[1,2,4]])
print('input:',input)
target = torch.tensor([1, 2])#每一项的范围是[0,C-1]
print('target:', target)
output = loss(m(input), target)
print('output:', output)

代码运行结果:

4.torch.nn.CrossEntropyLoss

前面所说的一切,都是为了给交叉熵作铺垫,^_^,先看下官网怎么说的:

这句描述说的是:交叉熵是LogSoftmax()和NLLLoss()组合而成,而LogSoftmax()实际上是softmax+log,所以通俗的讲:交叉熵是softmax+log+NLLLoss组合而成。并没有什么新的内容。

变相的说,调用交叉熵的结果,和上面一步一步实现的结果是一样的。

代码:

input = torch.Tensor([[1,2,3],[1,2,4]])
target = torch.Tensor([1,2]).long()
criterion = nn.CrossEntropyLoss()
loss = criterion(input, target)
print(loss)

代码运行结果:

再单独一步一步执行测试一下:

代码:

import torch
import torch.nn as nn
input = torch.Tensor([[1, 2, 3], [1, 2, 4]])
target = torch.Tensor([1, 2]).long()
m1 = nn.Softmax(dim=1)
r1 = m1(input)
print('softmax结果:\n', r1)
r2 = torch.log(r1)
print('log结果:\n', r2)
m2 = nn.NLLLoss()
loss = m2(r2, target)
print('NLLLoss结果:\n',loss)
print(loss)

代码运行结果:

总结:我感觉最难的点是公式看不懂,不知道如何展开,其次,就是测试的时候最好是自己写数字,因为随机产生的,不好计算,自己写的,手动计算的时候稍微好计算一些。总之,无论多艰难,一步一步走,大不了多花点时间,总会弄明白。

pytorch | Softmax->Log->NLLLoss->CrossEntropyLoss相关推荐

  1. pytorch笔记:实例解析NLLLoss和CrossEntropyLoss

    1 数据处理 1)我们先随机生成一个3*3的tensor 2)然后对每一行使用Softmax(softmax之后,每一行的加和为1) dim=1,表示第一个维度的 (a[x][1,2,3,...,n] ...

  2. (详细全面)softmax和log_softmax的联系和区别,NLLLOSS和CrossEntropyLoss的联系和区别

    文章目录 1.softmax 2.log_softmax 3.softmax和log_softmax 4.NLLLOSS和CrossEntropyLoss 1.softmax 作用:实现了将n维向量变 ...

  3. torch中的NLLLoss与CrossEntropyLoss

    0.先搞清楚几种分类问题 图片分类问题中通常一张图片中同时有多个目标,所以会有多个标签,通常分类问题可以如下划分 表格1 样本单标签 样本多标签 类别数量=2 简单二分类 当作多个二分类 类别数量&g ...

  4. [转载]用数据说话 Pytorch详解NLLLoss和CrossEntropyLoss

    [转载]用数据说话  Pytorch详解NLLLoss和CrossEntropyLoss https://www.cnblogs.com/jiading/p/11979391.html NLL_Los ...

  5. <binding>和<operation>元素

    <binding>和<operation>元素 Binding栏是完整描述协议.序列化和编码的地方,Types, Messages和PortType栏处理抽象的数据内容,而Bi ...

  6. Error: illegal invocation in <execute> or <revert> phase (action: element.updateProperties或Laber)

    报错类似于:Error: illegal invocation in <execute> or <revert> phase (action: element.updatePr ...

  7. Linux下 “>/dev/null 2>1 “ 命令学习

    Linux下 ">/dev/null 2>&1 " 命令学习 参考链接: 1.https://blog.csdn.net/sunrier/article/det ...

  8. 2021-12-11 工作记录--Wechat applet-结合<van-popup>和<van-picker> 实现年份、月份下拉选择弹窗+禁止滚动穿透

    结合<van-popup>和<van-picker> 实现年份.月份下拉选择弹窗 一.实现效果 二.实现代码 1.HTML attendance.wxml <!-- 年份 ...

  9. 【程序员必修数学课】->基础思想篇->递归(下)->分而治之从归并排序到MapReduce

    递归(下) 前言 归并排序中的分治思想 分布式系统中的分治思想 1.数据分割和映射 2.归约 3.合并 总结 前言 在上一篇中,我介绍了如何使用递归,来处理迭代法中比较复杂的数值计算.但是我们知道,有 ...

  10. loss函数之NLLLoss,CrossEntropyLoss

    NLLLoss 负对数似然损失函数,用于处理多分类问题,输入是对数化的概率值. 对于包含NNN个样本的batch数据 D(x,y)D(x, y)D(x,y),xxx 是神经网络的输出,进行了归一化和对 ...

最新文章

  1. java静态分派_Java基础——重载、静态分派与动态分派
  2. linux系统怎么清理磁盘空间,LINUX系统怎么使用命令清理磁盘空间?
  3. python 优先队列_python中使用优先队列
  4. unix 登录mysql_实例分析mysql用户登录。
  5. 360浏览器急速模式_关于规范电子税务局浏览器要求及设置的通知
  6. Dato for mac(自定义菜单栏日历)支持m1
  7. 在ASP.net MVC中利用ajax配合razor进行局部加载
  8. phonegap plugin.xml 示例
  9. 最好用的五大服装进销存管理软件,强推第一个
  10. 【后台模板】免费开源好看的后台模板
  11. 使用百度批量拾取坐标点-汇总
  12. 英语学术论文简短语句摘抄
  13. arm板配置ssh服务
  14. 什么是 MAC 地址,什么时候应该隐藏它?
  15. shell 获取当月最后一天的方法
  16. 【QGIS入门实战精品教程】4.8:QGIS如何下载SRTM数字高程模型DEM?
  17. 用于光流估计的无监督深度学习DSTFlow
  18. “那些看似不起波澜的日复一日,终会在某天让你看到坚持的意义。”
  19. 【Matlab语音处理】声音信号频谱分析仪【含GUI源码 325期】
  20. java 调用虚拟打印机_通过虚拟打印机获取其他软件的数据,实现数据传输

热门文章

  1. pat1011-1020
  2. HDOJ acm steps 3.1.1
  3. JAVA中几个修饰符的作用以及一些相关话题
  4. 一步步学习SPD2010--附录C--使用SP2010管理任务(6)--配置外部内容类型配置文件页面宿主...
  5. 遍历聚合对象中的元素——迭代器模式(二)
  6. x86 vs x64
  7. 剑桥少儿英语预备级教案(上) unit10 Let's do it.
  8. (转)微服务_创建一个简单的Eureka注册中心
  9. Swift里计数相关的小细节
  10. 201521123054《Java程序设计》第1周学习总结