torch.nn.functional.cross_entropy代码定义(可参考大牛写的这篇博客:https://blog.csdn.net/chao_shine/article/details/89925762?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164627346316780357263356%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164627346316780357263356&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-89925762.pc_search_result_cache&utm_term=%E4%BA%A4%E5%8F%89%E7%86%B5%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0%E4%BB%A3%E7%A0%81&spm=1018.2226.3001.4187)

def cross_entropy(input, target, weight=None, size_average=None, ignore_index=-100,
reduce=None, reduction=‘mean’):
# type: (Tensor, Tensor, Optional[Tensor], Optional[bool], int, Optional[bool], str) -> Tensor

if size_average is not None or reduce is not None:reduction = _Reduction.legacy_get_string(size_average, reduce)
return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)

可以看出inpt、target是必选项,并且都是Tensor类型。最后return可以看出functional.cross_entropy实际计算过程应是先计算input的log_softmax,然后再计算nll_loss

log_softmax是在sotfmax基础上进行log函数。

sotfmax 在dim上的理解:注意:上标在哪计算结果就在哪(可参考:):https://blog.csdn.net/weixin_41391619/article/details/104823086?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_antiscan&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_antiscan&utm_relevant_index=2

y = torch.rand(size=[2,2,3])
print(‘y=’,y)
net1 = nn.Softmax(dim=0)
net2 = nn.Softmax(dim=1)
net3 = nn.Softmax(dim=2)
当dim =0:旨在第一个维度上,本例中第一个维度是2

y= tensor([[[0.1391, 0.1783, 0.8231],
[0.8878, 0.8061, 0.2732]],

    [[0.7208, 0.6728, 0.9620],[0.5471, 0.3034, 0.8006]]])

dim=0的结果是: tensor([[[0.3585, 0.3788, 0.4653],
[0.5843, 0.6231, 0.3711]],

    [[0.6415, 0.6212, 0.5347],[0.4157, 0.3769, 0.6289]]])

是怎么计算的呢?

for i in range(2):
print(y[i,:,:].reshape(-1))

#输出tensor([0.1391, 0.1783, 0.8231, 0.8878, 0.8061, 0.2732])
tensor([0.7208, 0.6728, 0.9620, 0.5471, 0.3034, 0.8006])

dim = 1:旨在第二维度上,本例第二维度为2

print(‘dim=1的结果’,net2(y))
for i in range(2):
print(y[:,i,:].reshape(-1)) #

dim=1的结果 tensor([[[0.3211, 0.3480, 0.6341],

     [0.6789, 0.6520, 0.3659]],[[0.5433, 0.5913, 0.5403],[0.4567, 0.4087, 0.4597]]])

reshape输出:tensor([0.1391, 0.1783, 0.8231, 0.7208, 0.6728, 0.9620])
tensor([0.8878, 0.8061, 0.2732, 0.5471, 0.3034, 0.8006])

dim = 3旨在第三维度上,本例第三维度为3

print(‘dim=2的结果’,net3(y))
for i in range(3):
print(y[:,:,i].reshape(-1))

#输出结果:
dim=2的结果 tensor([[[0.2486, 0.2586, 0.4928],
[0.4061, 0.3742, 0.2196]],

    [[0.3100, 0.2955, 0.3946],[0.3255, 0.2551, 0.4194]]])

#reshape结果:
tensor([0.1391, 0.8878, 0.7208, 0.5471])
tensor([0.1783, 0.8061, 0.6728, 0.3034])
tensor([0.8231, 0.2732, 0.9620, 0.8006])

知道了log_softmax是干嘛的,现在来了解下nll_loss

truth = torch.tensor([0], dtype=torch.int64)
predicted1 = torch.tensor([[0.5, 0.4, 0.1]], dtype=torch.float)

loss = nn.NLLLoss()

print(F.log_softmax(predicted1, 1))
print(loss(F.log_softmax(predicted1, 1), truth))
print(F.cross_entropy(predicted1, truth))
输出结果:

tensor([[-0.9459, -1.0459, -1.3459]])
tensor(0.9459)
tensor(0.9459)
可以看到truth中的值就是log_softmax结果后的数组的idx,即truth的0对应-0.9459的位置,将-0.9459取出后取负数便为NLLLoss的结果。同样地,若truth的值为1,那么第二行和第三行的输出结果为1.0459。

交叉熵损失函数原理及pytorch实现相关推荐

  1. 交叉熵损失函数原理详解

    交叉熵损失函数原理详解 之前在代码中经常看见交叉熵损失函数(CrossEntropy Loss),只知道它是分类问题中经常使用的一种损失函数,对于其内部的原理总是模模糊糊,而且一般使用交叉熵作为损失函 ...

  2. 交叉熵损失函数原理深层理解

    说起交叉熵损失函数「Cross Entropy Loss」,相信大家都非常熟悉,但是要深入理解交叉熵损失函数的原理和作用,还得溯本追源才能对其有一个真实的理解与认知. 交叉熵 交叉熵是用来度量两个概率 ...

  3. 交叉熵损失函数原理详解,KL散度

    https://blog.csdn.net/b1055077005/article/details/100152102 https://blog.csdn.net/tsyccnh/article/de ...

  4. 损失函数-交叉熵的原理及实现

    咕咕咕~不催不更 什么是损失函数,损失函数的作用是? 有哪些常用的损失函数?数学表达式是什么? 实现 交叉熵的原理 实现 pytorch自带的交叉熵: class CrossEntropyLoss(_ ...

  5. 【交叉熵损失函数】关于交叉熵损失函数的一些理解

    目录 0. 前言 1.损失函数(Loss Function) 1.1 损失项 1.2 正则化项 2. 交叉熵损失函数 2.1 softmax 2.2 交叉熵 0. 前言 有段时间没写博客了,前段时间主 ...

  6. 一文读懂交叉熵损失函数

    进行二分类或多分类问题时,在众多损失函数中交叉熵损失函数较为常用. 下面的内容将以这三个问题来展开 什么是交叉熵损失 以图片分类问题为例,理解交叉熵损失函数 从0开始实现交叉熵损失函数 1,什么是交叉 ...

  7. LESSON 10.110.210.3 SSE与二分类交叉熵损失函数二分类交叉熵损失函数的pytorch实现多分类交叉熵损失函数

    在之前的课程中,我们已经完成了从0建立深层神经网络,并完成正向传播的全过程.本节课开始,我们将以分类深层神经网络为例,为大家展示神经网络的学习和训练过程.在介绍PyTorch的基本工具AutoGrad ...

  8. 交叉熵损失函数分类_逻辑回归(Logistic Regression)二分类原理,交叉熵损失函数及python numpy实现...

    本文目录: 1. sigmoid function (logistic function) 2. 逻辑回归二分类模型 3. 神经网络做二分类问题 4. python实现神经网络做二分类问题 ----- ...

  9. Pytorch专题实战——交叉熵损失函数(CrossEntropyLoss )

    文章目录 1.用CrossEntropyLoss预测单个目标 2.用CrossEntropyLoss预测多个目标 3.二分类使用BCELoss损失函数 4.多分类使用CrossEntropyLoss损 ...

最新文章

  1. 自己编写的MSN历史记录合并工具
  2. js 日期星期 带农历
  3. ios传值给js_WKWebView JS与OC间相互传值调用
  4. 1.2 文本域(含可编辑表格实现)
  5. Specificity考量
  6. TortoiseSVN的bin目录下面没有svn.exe
  7. 吃相难看!《人民日报》再评视频网站套路:消磨观众信任,必将引火烧身
  8. 牛客小白月赛2 G 文 【模拟】
  9. 【cc2541历程】APP更改蓝牙设备名称
  10. High-Quality Genome-Scale Models From Error-Prone, Long-Read Assemblies高质量的基因组尺度模型来自易出错的,长时间读取的程序集
  11. 计算机内存不足 无法使用,电脑内存不足怎么办,教您解决电脑内存不足
  12. 小样本不符合正态_尿液样本HPV分型检测用于宫颈癌筛查的可能性
  13. navicat 执行sql文件
  14. Postman 是一个接口测试和 http 请求的神器,非常好用。
  15. kangle安装php7.0_【Kangle】Linux下EasyPanel及PHP安装升级
  16. Codelf 命名神器
  17. Android从上往下滑动或从下往上滑动结束Activity
  18. 英文版系统远程桌面无法连接到远程计算机,windows server 2016远程桌面进去,英文系统修改语言...
  19. ZZULIOJ-2905
  20. win11安装deepin20.6双系统(双硬盘)

热门文章

  1. EOS区块链一周要闻回顾(2.17-2.23)
  2. CE.CCC.FCC分别是欧盟,中国,美国的强制认证要求吗?
  3. Dimensional Modeling
  4. Java基础学习记录~~
  5. linux系列:shell将字符串分割成数组
  6. footbar2000 简单介绍
  7. MCS51霓虹灯_Proteus仿真
  8. AutoEventWireup=false导致Page_Load事件未执行
  9. python decode ignore_Python decode()方法 - Python 教程 - 自强学堂
  10. ESET NOD32 Antivirus 13.1.21.0 免激活版