必能读懂的 交叉熵详解,pytorch中交叉熵的使用

pytorch:交叉熵(cross entropy) entropy中文叫做熵,也叫不确定性,某种程度上也叫惊喜度(measure of surprise) 阅读详情

     目录

1. 交叉熵详解

1.1 信息量

1.2 熵

1.3 相对熵(KL散度)

1.4 交叉熵

1.5 小结

2. 交叉熵的应用(pytorch中) 

2.1 交叉熵在分类任务中的计算过程

2.2 log_softmax()函数

2.3 nll_loss()函数

2.4 cross_entropy()函数

2.5 函数的其他调用方式


1. 交叉熵详解

1.1 信息量

简答的举个例子,假设分别发生了以下事件

1. 摇骰子六次,出现了点数 6

2. 摇骰子六次,全都是点数6

显然事件2出现的概率就很小,所以我们就说,事件2的信息量更大,信息学中使用下面的公式表示信息量:

这里我们画出该图像,

显然,某事件发生的概率在0-1之间,根据图像,事件发生的概率越小,那么事件发生的信息量就越大。

于是就引出了接下来的概念

1.2 熵

这里的熵指的是信息熵,它是指对于某事件所有可能性的信息量的期望,即:

这里我们可以进行一些简单的测试:

显然,事件各个情况发生的概率越平均,熵的值就越大,或者换一种说法,事件各种可能的混杂程度越大,熵的值越小。

1.3 相对熵(KL散度)

相对熵的数学公式如下:

这里设计到对于同一事件的两个分布p和q,这里我们可以将q看成神经网络多分类任务中的预测值,p看成训练的目标值。如果p和q的分布越接近,那么KL散度的值就越小。

这里有一点值得注意,一般情况下,对于分类任务,例如有三种分类x1, x2, x3,神经网络预测的概率q是 [0.1, 0.2, 0.7],这里假设它实际上属于x2类,那么p的分布其实是[0, 1, 0],也就是对于q分布,只有x2的概率是1,其他都是0。

这里附上连续性KL散度的推导过程:

https://blog.youkuaiyun.com/Defiler_Lee/article/details/105454724

1.4 交叉熵

根据KL散度的值,我们可以确定两个分布是否相似,因此我们可以使用KL散度作为学习任务的损失函数,但是KL散度的公式具有化简的空间,我们对其进行以下化简:

 

显然式子的前半部分是p的熵,对于确定的p,它的熵也是固定的,那么我们只需要计算后半部分就可以确定两个分布的相似程度,作为训练任务的loss,这后半部分,就是交叉熵。

1.5 小结

我们知道交叉熵的值可以表示两个概率分布的相似程度,它可以作为多分类训练的损失函数,并且就像刚刚举的例子,神经网络所预测的概率往往是例如 [0, 1, 0]的,而且目标值往往是如同 [0, 1, 0] 的分布,接下来我们讲解这样的分布在深度学习中的应用。

2. 交叉熵的应用(pytorch中) 

2.1 交叉熵在分类任务中的计算过程

这里我们按照之前举的例子:

 x1x2x3
q (Pred)0.10.20.7
p (Label)010

 

那么我们按照交叉熵,进行计算,

            loss = - ( 0 * log(0.1) + 1 * log(0.2) + 0 * log(0.7) )

                   = - log( 0.2 )

也就是说,我们只需要计算label是1的那部分,这里假设目标分类结果是xi类,那么我们只需要计算 -log(p(xi)) 即可。

2.2 log_softmax()函数

首先我们需要了解什么是softmax函数,这里可以查看我的这篇博客:softmax 简单讲解

我们通过softmax(),可以得出总和为1的概率分布,经过log运算,我们其实就得出了log(p(xi)),取反即可得出交叉熵。

举个例子:

2.3 nll_loss()函数

由之前我们推出的,我们只需要计算分类xi概率,进行log运算,所得的值就可以表示交叉熵并作为loss值(有点绕。。),

(总之就是  如果预测值Pred是 [0.1, 0.2, 0.7] ,然后实际上的分类是第二类,那么我们只需要计算第二个的概率的log值

即 log(0.2) )

实际上,我们往往会同时对多个样本进行训练,这样得出的Pred往往是二维的,例如我们进行图片分类,假设 x_input 是最后一层的输出,其中(3,5)表示每次有 3 张图片需要进行分类,分类总共有五种,比如分别是ABCDE五个字母,然后我们使用softmax将输出的数值,转化为总和为1的概率分布(每行的和为1):

每行都是对图片分类的预测,三行表示有三张图片。

当使用交叉熵均值作为loss函数时,假设这次的lable是  [1, 3, 4,](注意下标从0开始)首先需要计算log_softmax():

交叉熵均值计算过程为(只取label对应的值,参考本文章 2.1)

  -(-0.2338 -1.8039 -1.0224 ) / 3             (这里由于数值是直接复制的,所以有些许误差。)

回归正题,可见nll_loss函数,其实就是将x_input每行中与Label对应的值取出来,去掉负号求均值。

2.4 cross_entropy()函数

这里附上cross_entropy函数源码,在我们已经明白了 log_softmax 函数和 nll_loss 函数的基础上,秒懂!!:

所以,cross_entropy函数,其实就是干了log_softmax和nll_loss两件事情,因此我们使用cross_entropy函数时,只需要直接将x_input(最后一层的输出)与 target(label)作为函数的参数调用即可

其中pred_log 是 log_softmax(x_input, dim=1) 的结果

2.5 函数的其他调用方式

torch.nntorch.nn.functional (F)
CrossEntropyLosscross_entropy
LogSoftmaxlog_softmax
NLLLossnll_loss

 

其中,torch.nn 提供的是类,使用时候需要先实例化。

torch.nn.functional 提供函数,直接使用即可。

参考:

  1. https://blog.youkuaiyun.com/tsyccnh/article/details/79163834
  2. https://www.cnblogs.com/marsggbo/p/10401215.html
  3. https://blog.youkuaiyun.com/qq_22210253/article/details/85229988 
【PyTorch】第九节:Softmax 函数与交叉熵函数 本实验主要讲解了分类问题中的二分类问题和多分类问题之间的区别,以及每种问题下的交叉熵损失的定义方法。由于多分类问题的输出为属于每个类别的概率,要求概率和为 1 。因此,我们还介绍了如何利用 Softmax 函数,处理神经网络的输出,使其满足损失函数的格式要求。 阅读详情

相关推荐

CrossEntropy(交叉熵损失函数pytorch)

weight, 为一维张量,具体的大小为M,M为样本的标签数量,代表赋予的类别的权重ignore_index,int类型数据,用于指定忽略某个类别的索引。默认为 -100,表示不忽略任何类别。reduction:指定损失函数的计算方式。可选项包括:‘none’(不返回每个样本的损失值)、‘mean’(返回每个样本的平均损失值)、‘sum’(返回每个样本的总损失值)。N,代表了N个样本LiL_{i}Li​,为某个样本的对应损失函数的值yiy_{i}yi​。

xiaziqiqi的博客 4027

【深度学习】Pytorch中实现交叉熵损失计算的方式总结

虽然在Pytorch架构中,神经网络内流动的数据类型必须是float类型,但是Pytorch也提供了自动处理整数(int类型)标签的交叉熵损失函数(这里的“整数标签”指的是每个样本所属的真实类别,通常是一个从0开始的整数索引,对应着类别数量中的一个),这些函数会自动将整数标签转换为内部使用的one-hot编码格式,并计算交叉熵损失。对于二分类问题,尤其是sigmoid激活函数之后的结果,可以使用带Sigmoid的二元交叉熵损失函数,它同时完成 sigmoid 和 二元交叉熵损失的计算。

qq_42533357的博客 2351

【Pytorch】交叉熵损失函数 CrossEntropyLoss() 详解

文章目录一、损失函数 nn.CrossEntropyLoss()二、什么是交叉熵三、Pytorch 中的 CrossEntropyLoss() 函数参考链接 一、损失函数 nn.CrossEntropyLoss() 交叉熵损失函数 nn.CrossEntropyLoss() ,结合了 nn.LogSoftmax() 和 nn.NLLLoss() 两个函数。 它在做分类(具体几类)训练的时候是非常有用的。 二、什么是交叉熵 交叉熵主要是用来判定 实际的输出与期望的输出的接近程度。 举个例子:在做分类训练的

weixin_44211968的博客 3万+

pytorch中交叉熵

关于pytorch中交叉熵的使用,pytorch的交叉熵是其loss function的一种且包含了softmax的过程。 pytorch中交叉熵函数是nn.CrossEntropyLoss()。其参数包括:weight,size_averaged,reduce weight参数通常默认值是0,如果你的训练样本很不均衡的话,可以设置其值。 size_averaged参数是设置是否取均值,默认...

geter_CS的博客 1万+

Pytorch中的交叉熵函数CrossEntropyLoss()

分类问题中,交叉熵函数是比较常用也是比较基础的损失函数,原来就是了解,但一直搞不懂他是怎么来的?为什么交叉熵能够表征真实样本标签和预测概率之间的差值?趁着这次学习把这些概念系统学习了一下。 交叉熵的数学原理 首先说起交叉熵,脑子里就会出现这个东西: L=−[ylog⁡y^+(1−y)log⁡(1−y^)]L=-[y\log{\hat{y}}+(1-y)\log{(1-\hat{y})}] L=−[...

不愿透漏姓名的王建森的博客 1万+

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

目录 nn.Softmax和nn.LogSoftmax nn.NLLLoss nn.CrossEntropy nn.BCELoss 总结 在Pytorch中的交叉熵函数的血泪史要从nn.CrossEntropyLoss()这个损失函数开始讲起。从表面意义上看,这个函数好像是普通的交叉熵函数,但是如果你看过一些Pytorch的资料,会告诉你这个函数其实是softmax()和交叉熵的结合体...

watermelon1123的博客 4万+

一文读懂交叉熵损失函数

进行二分类或多分类问题时,在众多损失函数中交叉熵损失函数较为常用。 下面的内容将以这三个问题来展开 写目录标题什么是交叉熵损失以图片分类问题为例,理解交叉熵损失函数从0开始实现交叉熵损失函数 什么是交叉熵损失 以图片分类问题为例,理解交叉熵损失函数 从0开始实现交叉熵损失函数 1,什么是交叉熵损失 交叉熵是信息论中的一个重要概念,主要用于度量两个概率分布间的差异性 p(x)表示样本的真实分布,q(x)表示模型所预测的分布 交叉熵能够衡量同一个随机变量中的两个不同概率分布的差异程度,在机器学习中就表示为真实

m0_57569438的博客 2万+

Pytorch:交叉熵损失(CrossEntropyLoss)以及标签平滑(LabelSmoothing)的实现

浅谈Label Smoothing Label Smoothing也称之为标签平滑,其实是一种防止过拟合的正则化方法。传统的分类loss采用softmax loss,先对全连接层的输出计算softmax,视为各类别的置信度概率,再利用交叉熵计算损失。 在这个过程中尽可能使得各样本在正确类别上的输出概率为1,这要使得对应的z值为+∞,这拉大了其与其他类别间的距离。 现在假设一个多分类任务标签是[1,0,0],如果它本身的label的出现了问题,这对模型的伤害是非常大的,因为在训练的过程中强行学习一个非本

要相信光 3万+

pytorch各种交叉熵函数的汇总具体使用

一、引言   最近被pytorch的各种交叉熵损失弄迷糊了,现在我所知道的交叉熵损失有: torch.nn.CrossEntropyLoss() torch.nn.BCELoss() torch.nn.BCEWithLogitsLoss() torch.nn.functional.cross_entropy() torch.nn.functional.binary_cross_entropy() torch.nn.functional.binary_cross_entropy_with_log

comway_Li的博客 4328

关于pytorch交叉熵损失函数使用weight参数来平衡各个类别,即加权交叉熵损失函数

torch.nn.CrossEntropyLoss(weight, reduction=“mean”)的计算方式和一般做法不一样,进行加权计算后,不是直接loss除以batch数量,而是batch中每个数据的标签对应的类别权重 把batch个权重加起来作为除数,被除数是loss。

cdd_box的博客 6384

损失函数-负对数似然和交叉熵(Pytorch中的应用)

文章目录1、负对数似然损失函数1.1、似然1.2、似然函数1.3、极大似然估计1.4、对数似然1.5、负对数似然1.6、pytorch中的应用2、交叉熵损失函数2.1、信息量2.2、信息熵2.3、相对熵(KL散度)2.4、交叉熵2.5、pytorch中的应用3、使用总结 1、负对数似然损失函数 1.1、似然 在解释负对数似然之前,首先要了解什么是似然。似然(likelihood)和概率(probability)有着一定的区别和联系。似然和概率是针对不同内容的估计和近似。概率表达了给定参数θ\thetaθ下样

tcn760的博客 1万+

Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解

来源:AINLPer 微信公众号(点击了解一下吧) 编辑: ShuYini 校稿: ShuYini 时间: 2019-12-22 引言     在使用pytorch深度学习框架,计算损失函数的时候经常回到这么一个个函数: nn.CrossEntropyLoss()     该损失函数结合了nn.LogSoftmax()nn.LogSoftmax()nn.LogSoftmax()和nn.NL...

yinizhilianlove的博客 5345

关于pytorch 交叉熵的个人理解

title: pytorch 交叉熵的个人理解 date: 2020-01-19 11:54:06 tags:machine learning 关于pytorch 交叉熵的个人理解 最近,查pytorch的官方文档。里面关于交叉熵部分的公式描述不太理解,查了一些资料,简单的写了下公式。大概理解了一下,不过也不知道正确与否。 官方文档描写如下: This criterion expects a...

StarLib的博客 858

交叉熵损失函数(cross-entropy loss function)原理及Pytorch代码简介

为了更好的理解交叉熵的意义,先介绍一下相对熵的概念 1、相对熵 基本概念 相对熵又称为KL散度(Kullback–Leibler divergence),用来描述两个概率分布的差异性。假设有对同一变量xxx的q(x)q(x)q(x)和p(x)p(x)p(x)两个概率分布,那么两者之间的相对熵可由以下定义: DKL(p∥q)=∑i=1Np(xi)log⁡(p(xi)q(xi)) D_{K L...

chao_shine的博客 14万+

[pcie]gen6 下 L0p

000b~100b: 触发L0p 操作流程协商工作link width 到target link width.为111b:link width 硬件动态调整。硬件动态:Device control 3 register.target link width=111b当pcie链路检测到空闲状态时,设备可以主动进入L0p状态。L0p 是pcie gen6 新引入的链路状态,是L0的子状态。(5)LINK WIDTH:当LINK WIDTH CHANGE.cmd为Request时表示请求的链路宽度。

BIG_APPLE1的博客 1676

数字电路实验避坑指南:如何正确搭建主从JK触发器测试电路(附Proteus仿真)

本文详细解析了主从JK触发器的工作原理及实验搭建指南,重点解决了常见的Catching Problem现象,并提供了Proteus仿真优化方案。通过元器件选型、电路连接步骤和常见错误排查,帮助读者正确搭建测试电路,确保数字电路实验的稳定性和可靠性。

weixin_30790841的博客 469

详解PyTorch中的交叉熵!

最近在做交叉熵的魔改,所以需要好好了解下交叉熵,遂有此文。 关于交叉熵的定义请自行百度,相信点进来的你对其基本概念不陌生。 推荐原文链接(排版精美):https://mp.weixin.qq.com/s/94qCM6Kim0UaqAr6HaGpiQ 本文将结合PyTorch,介绍离散形式的交叉熵在二分类以及多分类中的应用。注意,本文出现的二分类交叉熵和多分类交叉熵,本质上都是一个东西,二分类交叉熵可以看作是多分类交叉熵的一个特例,只不过在PyTorch中对应方法的实现方式不同(不同之处将在正文详细讲解

雨落狮山山亦奇的个人博客 1909

Verilog——反相器

反相器代码: module inv( A, Y );//A,Y是端口 //定义端口属性 input A; output Y; //定义输入输出关系 assign Y=~A;//Y等于A的反 endmodule //inv是module的名字

weixin_41788560的博客 9500

Pytorch 加权交叉熵实现分析

此文不涉及公式。 假设模型对输入图像数据(1(batch size) * 1 (channels) * 3 (height) * 3 (width))的分割输出结果为1 * 2 (只有两类,前景,背景)* 3 (height)* 3 (width),ground truth为 target ( 1 (batch size) * 3 * 3)。 假设模型的分割结果为input, ground truth 为target。 根据文献[1],计算交叉熵损失有两中方式,一种是用F.nll_loss();.

pain_gain0的博客 9093

Ubuntu 22.04 搭建 PX4 飞控系统完全指南:从仿真到硬件试飞

定义消息文件protobufuint64 timestamp # 时间戳float32 temperature # 温度float32 humidity # 湿度生成代码:bashPX4 在 Ubuntu 22.04 的搭建涉及环境配置、编译仿真、硬件连接等多环节,核心是理解 PX4 1.14 的新特性(uXRCE-DDS、动态控制分配)。通过本文指南,开发者可快速构建稳定的 PX4 开发环境,为无人机应用开发奠定基础。

zqmgx13291的博客 3039

Arduino应用——PWM控制直流电机风扇

Arduino应用——PWM控制直流电机风扇PWM原理实验器件功能描述如何改变文本的样式插入链接与图片实现代码生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 最近在使用arduino UNO开发板完成课程小作业。其中一个要求设计一个电风扇控制系统,要求能够通过PWM调节风扇的转速。期间搜索了许多例程和方法,但受限于器件,效果不

hypecycle的博客 2万+

PyTorch交叉熵理解

PyTorch中对于交叉熵损失的理解

mp9105的博客 1565

【网络安全】基于Python的威胁情报自动推送系统设计与实现(含源码)

本文介绍了一个基于 Python 开发的威胁情报自动推送系统的设计与实现。该系统通过集成 AbuseIPDB 威胁情报数据源与即时通讯平台,实现了恶意 IP 地址的自动化采集、筛选与实时推送功能。文章详细阐述了系统的技术架构、核心算法、数据流转过程以及关键代码实现。系统采用多线程并发架构,通过 Long Polling 技术实现实时消息接收,支持自动推送和交互式查询两种工作模式。文章还提供了完整的部署指南和使用说明,包括环境配置、运行方式等内容。

等风来 312
上一篇: softmax 简单讲解
下一篇: pytorch 使用gpu
Leri_X
博客等级 码龄10年 26粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值