pytorch损失函数之nn.BCELoss()(为什么用交叉熵作为损失函数)

CE Loss与BCE Loss的区别 CE Loss与BCE Loss区别 作为学习交叉熵损失函数与Focal Loss函数的补充 阅读详情
关于熵、KL散度、交叉熵的讲解在这一篇文章中
一个二项分布,随机变量只有两种可能值,所以是一个二分类。二分类的交叉熵形式: − y l o g y ^ − ( 1 − y ) l o g ( 1 − y ^ ) ( 1 ) -ylog\hat{y}-(1-y)log(1-\hat{y})(1) −ylogy^​−(1−y)log(1−y^​)(1) 其中 y ^ \hat{y} y^​是输出值在0-1之间。对于批量样本 ( x 1 , y 1 ) , ( x 2 , y 2 ) . . . {(x_1,y_1),(x_2,y_2)...} (x1​,y1​),(x2​,y2​)...则可以对交叉熵求和或者求均值: ∑ i − y i l o g y i ^ − ( 1 − y i ) l o g ( 1 − y i ^ ) ( 2 ) \sum_{i}-y_ilog\hat{y_i}-(1-y_i)log(1-\hat{y_i})(2) i∑​−yi​logyi​^​−(1−yi​)log(1−yi​^​)(2),注意公式(1)是两个交叉熵和的形式,因为随即变量有两个可能的值,一个概率为 y ^ \hat{y} y^​,一个概率为 1 − y ^ 1-\hat{y} 1−y^​。(这里我们将标签值y视作先验分布, y ^ \hat{y} y^​为模型分布)
pytorch中 class torch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduction=‘elementwise_mean’) 表示求一个二分类的交叉熵。它的loss如下:
l ( x , y ) = L = { l 1 , l 2 , . . . , l n } , 其 中 l n = − w n [ y n l o g y n ^ + ( 1 − y n ) l o g ( 1 − y n ^ ) ] l(x,y)=L=\{l_1,l_2,...,l_n\},其中l_n=-w_n[y_nlog\hat{y_n}+(1-y_n)log(1-\hat{y_n})] l(x,y)=L={l1​,l2​,...,ln​},其中ln​=−wn​[yn​logyn​^​+(1−yn​)log(1−yn​^​)],这里n表示批量大小。 w n w_n wn​表示权重。
当参数reduce设置为 True,且参数size_average设置为True时,表示对交叉熵求均值,当size_average设置为Flase时,表示对交叉熵求和。参数weight设置的是 w n w_n wn​,其是一个tensor且size与批量数一样(不设置时可能都为1)。目标值 y y y的范围是0-1之间。输入输出的维度都是 ( N , ∗ ) (N,*) (N,∗),N是批量数,*表示目标值维度。
为什么是用交叉熵作为损失函数?
在深度学习中我们常用的损失函数是二次函数 L = ( y − y ^ ) 2 2 ( 3 ) L=\frac{(y-\hat{y})^2}{2} (3) L=2(y−y^​)2​(3),若激活函数使用的是sigmoid函数,则 y ^ = σ ( z ) \hat{y}=\sigma(z) y^​=σ(z),其中 z = w x + b z=wx+b z=wx+b。采用链式法则求导,则有:

∂ L ∂ w = ( y ^ − y ) σ ( z ) ′ x \frac{\partial L}{\partial w}=(\hat{y}-y){\sigma(z)}'x ∂w∂L​=(y^​−y)σ(z)′x ∂ L ∂ b = ( y ^ − y ) σ ( z ) ′ \frac{\partial L}{\partial b}=(\hat{y}-y){\sigma(z)}' ∂b∂L​=(y^​−y)σ(z)′

可以看出梯度都与sigmoid函数的梯度有关,如下图所示,sigmoid函数在两

在这里插入图片描述

端的梯度均接近0,这导致反向传播的梯度也很小,这就这就不利于网络训练,这就是 梯度消失问题 。
再来看看以交叉熵作为损失函数.对 1 n ∑ i − y i l o g y i ^ − ( 1 − y i ) l o g ( 1 − y i ^ ) ( 2 ) \frac{1}{n}\sum_{i}-y_ilog\hat{y_i}-(1-y_i)log(1-\hat{y_i})(2) n1​i∑​−yi​logyi​^​−(1−yi​)log(1−yi​^​)(2)求导,可得: ∂ L ∂ w = − 1 n ∑ i ( y σ ( z ) − 1 − y 1 − σ ( z ) ) ∂ σ ∂ w = − 1 n ∑ i ( y σ ( z ) − 1 − y 1 − σ ( z ) ) σ ′ x \frac{\partial L}{\partial w}=-\frac{1}{n}\sum_i(\frac{y}{\sigma(z)}-\frac{1-y}{1-\sigma(z)})\frac{\partial \sigma}{\partial w}=-\frac{1}{n}\sum_i(\frac{y}{\sigma(z)}-\frac{1-y}{1-\sigma(z)}) {\sigma}'x ∂w∂L​=−n1​i∑​(σ(z)y​−1−σ(z)1−y​)∂w∂σ​=−n1​i∑​(σ(z)y​−1−σ(z)1−y​)σ′x 由于 σ ( z ) = 1 / ( 1 + e − z ) \sigma(z)=1/(1+e^{-z}) σ(z)=1/(1+e−z)所以最终得到: ∂ L ∂ w = 1 n ∑ i x ( σ ( z ) − y ) \frac{\partial L}{\partial w}=\frac{1}{n}\sum_i x(\sigma(z)-y) ∂w∂L​=n1​i∑​x(σ(z)−y)而对偏置的导数也等于 ∂ L ∂ b = 1 n ∑ i ( σ ( z ) − y ) \frac{\partial L}{\partial b}=\frac{1}{n}\sum_i (\sigma(z)-y) ∂b∂L​=n1​i∑​(σ(z)−y)可以看见使用交叉熵作为损失函数后,反向传播的梯度不在于sigmoid函数的导数有关了。这就从一定程度上避免了梯度消失。
若是遇到多分类问题怎么使用交交叉熵呢?
比如我们有3个类别,那么我们通过softmax得到 y ^ = [ 0.2 , 0.5 , 0.3 ] \hat{y}=[0.2,0.5,0.3] y^​=[0.2,0.5,0.3]的到的一个一个样本的分类结果,这个结果的通俗解释就是:为第一类的概率为0.2,为第二类的概率为0.5,为第三类的结果过0.3。
假设这个样本真实类别为第二类,那么我们希望模型输出的结果过应该是 y = [ 0 , 1 , 0 ] y=[0,1,0] y=[0,1,0],这个就是标签值。那么损失函数可以使用交叉熵:

L = − ∑ k 3 y k l o g ( y ^ ) L=-\sum_k^3y_klog(\hat{y}) L=−k∑3​yk​log(y^​),可以看见实际上这个求和只有一项。也就是 L = − l o g ( 0.5 ) L=-log(0.5) L=−log(0.5)。
pytorch中提供了多分类使用的损失函数nn.CrossEntropyLoss()使用的原理,与这里类似。

Neural Network and Deep Learning ,Michael Nielsen(中文)
pytorch官方文档
http://www.cnblogs.com/pinard/p/6437495.html

损失函数 | BCE Loss(Binary CrossEntropy Loss) BCE(Binary CrossEntropy)损失函数图像二分类问题--->多标签分类Sigmoid和Softmax的本质及其相应的损失函数和任务多标签分类任务的损失函数BCEPytorch的BCE代码和示例总结 图像二分类问题—>多标签分类 二分类是每个AI初学者接触的问题,例如猫狗分类、垃圾邮件分类…在二分类中,我们只有两种样本(正样本和负样本),一般正样本的标签y=1,负样本的标签y=0。比如下边这张图片,判断里边有没有人。 那么这张图片的标签为y=1,这时我们就根据标签y=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万+

【pytorch损失函数(1)】之nn.BCELoss二进制交叉熵和 nn.BCEWithLogitsLoss

可以看出梯度都与sigmoid函数的梯度有关,如下图所示,sigmoid函数在两端的梯度均接近0,这导致反向传播的梯度也很小,这就这就不利于网络训练,这就是 梯度消失问题。在面对不同的分类问题的时候,选择的loss function也不一样,二分类和多标签分类通常使用sigmoid函数而多分类则一般使用softmax函数(互斥性质)。目标值 y的范围是0-1之间。的到的一个一个样本的分类结果,这个结果的通俗解释就是:为第一类的概率为0.2,为第二类的概率为0.5,为第三类的结果过0.3。

AbiUni(YY熊) 1万+

Loss function(Cost Function)SVM softmax pytorch函数解析

SVM and Softmax 当评分函数输出结果与真实结果之间差异越大,损失函数输出越大,反之越小。 SVM Loss function hinge loss (折叶损失) 假设有3个分类,并且得到了分值s=[13,-7,11]。其中第一个类别是正确类别,即yi=0。同时假设是10。 =0+8=8 L2-SVM(平方折叶损失SVM) 我们对于预测训练集数据分类标签的情况总有一些不满意的,...

鹿鹿的博客 1988

torch.nn.BCELoss用法

1. 定义 数学公式为Loss = -w * [p * log(q) + (1-p) * log(1-q)],其中p、q分别为理论标签、实际预测值,w为权重。这里的log对应数学上的ln。 PyTorch对应函数为: torch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduction=‘mean’) 计算目标值和预测值之间...

qq_29631521的博客 5万+

损失函数总结(三):BCELoss、CrossEntropyLoss

本文对损失函数进行了部分总结,包括:BCELoss、CrossEntropyLoss 等损失函数及其在当前损失函数众多的情况下使用的环境。总的来说:对于分类任务,CrossEntropyLoss 是其进行多分类任务的标准方法,而BCELoss 广泛用于二分类任务中。。。这两种损失函数都是当前较为常用的损失函数,可以好好研究一下。

走在深度学习前沿的小宋 4410

脑电分析:为什么大脑信号会“变同步”?——事件相关同步化与去同步化 (ERS/ERD) 全景解析

脑电分析中的事件相关同步化(ERS)和去同步化(ERD)是研究大脑动态节律的重要方法,反映特定任务下脑电频段能量的变化。ERD表示神经元活动分散(功率下降),提示脑区活跃处理信息;ERS则反映神经元同步(功率增强),常与静息状态相关。本文详解了ERS/ERD的生理机制、计算流程(包括基线校正和功率谱分析),并提供了Python实现示例,展示如何通过Welch法和STFT进行时频分析,生成ERD/ERS热力图。该技术广泛应用于运动想象脑机接口、癫痫检测等领域,为理解大脑功能状态提供了量化工具。

qq_32516809的博客 1395

PyTorch交叉熵损失函数实战:从nn.BCELoss到nn.CrossEntropyLoss的选型与避坑指南

本文深入解析PyTorch中的交叉熵损失函数,包括nn.BCELoss、nn.BCEWithLogitsLoss和nn.CrossEntropyLoss的适用场景与常见陷阱。通过实战案例,指导开发者正确选择和使用这些损失函数,避免数值稳定性问题,并介绍高级技巧如标签平滑、混合精度训练等,帮助优化模型性能。

weixin_30613433的博客 290

【同花顺公式编辑教程】第4章 功能函数

本章节主要给出大部分能够运行且常用的同花顺指标编辑器提供的函数。其中,计算类函数不作演示,绘图类函数提供示例及示例运行结果。

LiaoYi2016218的博客 2万+

Pytorch常用的函数(十)交叉熵损失函数nn.BCELoss()、nn.BCELossWithLogits()、nn.CrossEntropyLoss()详解

Pytorch常用的函数(九)交叉熵损失函数nn.BCELoss()、nn.BCELossWithLogits()、nn.CrossEntropyLoss()详解

qq_44665283的博客 4286

脑机接口(BCI)从原理到开发实战 01|意念控制真的来了?一文看懂脑机接口的技术革命

类型定义典型应用主动式用户主动产生特定思维模式来控制设备运动想象(想象左手/右手移动)反应式用户被动接受外部刺激,系统检测大脑反应P300拼写器、SSVEP(稳态视觉诱发电位)被动式系统监测用户自发脑状态,不要求主动控制疲劳监测、情绪识别、注意力评估本系列后续文章将重点围绕主动式(运动想象)和反应式(P300/SSVEP)展开实战。脑机接口,这个曾经只存在于科幻中的概念,正在政策、资本、技术的三重驱动下,加速从实验室走向产业落地。2026年,注定是脑机接口发展史上浓墨重彩的一年。

小明的博客 1431

YOLOv11改进有效涨点专栏目录 | 含卷积、主干、注意力机制、Neck、检测头、损失函数、二次创新C2PSA/C3k2等各种网络结构改进

Hello,各位读者们好.本文为最新YOLOv11有效涨点专栏目录,YOLOv11以及发布了一个月左右,这个过程中我也是给大家整理了许多的机制,其中包含了C3k2、主干(均支持根据yolov11训练的版本进行二次缩放,全系列都能轻量化)、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新。

Snu77的博客 8万+

对于pytorch中nn.CrossEntropyLoss()与nn.BCELoss()的理解和使用

在pytorch中nn.CrossEntropyLoss()为交叉熵损失函数,用于解决多分类问题,也可用于解决二分类问题。 nn.BCELoss()为二元交叉熵损失函数,只能解决二分类问题。

qq_35605081的博客 1万+

数字电路逻辑与设计实验三 译码器和数据选择器

1. 译码器功能测试 将 74LS139 按图 3.1 接线,按表 3.2 输入电平分别置位,填输出状态表。 2. 译码器转换 将双 2-4 线译码器转换为 3-8 线译码器。 (1)画出转换电路图。 (2)在实验箱上接线并验证设计是否正确。 (3)设计并填表写该 3-8 线译码器功能表,画出输入、输出波形。 3. 数据选择器的测试及应用 (1) 将双 4 选 1 数据选择器 74LS153 参照图 3.2 接线,测试其功能并填写功能表 3.3。 (2)将实验箱脉冲信号源中固定连续脉冲 4 个不

欢迎交流学习心得 3085

笔记随记---pytorch损失函数之nn.BCELoss()(为什么用交叉熵作为损失函数)

https://blog.csdn.net/geter_cs/article/details/84747670 可以看见使用交叉熵作为损失函数后,反向传播的梯度不在于sigmoid函数的导数有关了。这就从一定程度上避免了梯度消失。

weixin_42394925的博客 543

从0到全栈:C#/.NET/.NET Core终极学习路线——2025年开发者必修的12个阶段与30个实战项目

【代码】从0到全栈:C#/.NET/.NET Core终极学习路线——2024年开发者必修的12个阶段与30个实战项目。

墨夶的博客 2042

三相五柱式消弧线圈自动测控装置设计与实现

本文设计了一种基于STM32的三相五柱式消弧线圈自动测控装置。该装置采用信号注入法检测系统对地电容电流,通过PID自适应算法调节消弧线圈电感值,实现单相接地故障时的快速补偿。硬件系统包含信号采集、注入、控制执行等模块,软件采用Goertzel算法提取特征频率信号,结合增量式PID实现精确控制。实验结果表明,装置电容检测误差小于2%,调谐响应时间小于50ms,满足配电网对消弧线圈自动调谐的技术要求。

AI的内部世界的博客 239

【Pytorch基础】torch.nn.BCELoss()和torch.nn.BCEWithLogitsLoss()损失函数

目录1 交叉熵损失函数2 二元交叉熵损失函数2.1 torch.nn.BCELoss()2.2 torch.nn.BCEWithLogitsLoss()3 参考文献 1 交叉熵损失函数   在之前的损失函数介绍中已经解释过,什么是交叉熵损失函数以及其数学原理(【Pytorch基础】torch.nn.CrossEntropyLoss损失函数介绍)。在多分类问题中输出层的函数是SoftmaxSoftmaxSoftmax函数, 在二分类问题中输出层的函数是SigmodSigmodSigmod函数。   而Cros

sxl的博客 7910

基于共识的捆绑算法CBBA在多无人机多任务调度中的实现

在捆绑过程中,每个无人机根据自己的任务清单和其他无人机的任务清单,确定一个被称为“束”的集合。通过合理的任务分配和无人机协作,CBBA算法能够实现最优的任务调度,提高了多无人机系统的效率和执行能力。在每一轮迭代中,无人机根据自己的当前任务和位置信息将任务清单发送给其他无人机,并接收其他无人机发送过来的任务清单。通过比较其他无人机的任务清单和自身的任务清单,每个无人机可以更新自己的任务分配情况。在这一步中,每个无人机根据自己选择的新任务,更新自身的任务清单,并将更新后的清单发送给其他无人机。

持续更新 1156

PyTorch中常用损失函数整理

更新自己所研究领域(图像语义分割、点云语义分割、点云实例分割)中的常用损失函数整理。

Justin_JGT的博客 1767

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

交叉熵损失函数代码中的那些坑

最近在用交叉熵损失函数,但是却频频出现bug,这里把坑都记录一下,避免以后又再一次掉进去,也希望能帮助到掉进去的人出来。 torch.nn.CrossEntropyLoss() 首先,这是一个类,在用的时候需要先创建对象,然后把参数传给对象。例如 # 正确示例 loss = torch.nn.CrossEntropyLoss() loss = loss(predict, target.long()) # 或者 loss = torch.nn.CrossEntropyLoss()(predict, tar

Acmer_future_victor的博客 2529

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【深入浅出向】从自信息到熵、从相对熵到交叉熵,nn.CrossEntropyLoss, 交叉熵损失函数与softmax,多标签分类

【深入浅出向】从自信息到熵、从相对熵到交叉熵,nn.CrossEntropyLoss, 交叉熵损失函数与softmax,多标签分类

a_piece_of_ppx的博客 1666

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

关于二分类,多分类,及多标签分类的损失函数详解及Pytorch实现

相信很多小伙伴最开始都是从分类任务入手深度学习这个领域的吧,这个就类似学习代码的第一课,“Hello world”一样。深度学习中,除了模型设计之外,最重要的想必就是选取合适的损失函数了。不过一般实验中,损失函数的调用十分简单,也就是一行代码的事情,但是最近发现,好多小伙伴,对于损失函数的基础意义及实现细节,还是不甚了解,所以在此对分类任务中常用的交叉熵损失函数进行详细的介绍。 1. 交叉熵(Cross Entropy) 交叉熵是信息论中的概念,想要理解交叉熵,首先需要了解一些与之相关的信息论基础。

qq_24193303的博客 1万+

pytorch教程 (四)- 损失函数

在深度学习项目中首先对数据做数据预处理,然后构建模型之后,第三步需要定义一个好的损失函数。 配置损失函数都是确保模型以预期方式工作的最重要步骤之一。 损失函数可以为神经网络提供很多实用的灵活性,它将定义网络输出与网络其余部分的连接方式。 简单说损失函数(J)可以定义为具有两个参数的函数: 预测输出 真实输出 定义损失函数,通过将模型的预测值与真实值进行比较,比较二个值之间的差距,差距越小,损失函数越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样。 一般来说,监督学习的目标函数由二部分组成:

weixin_42010722的博客 1654

实现l1损失_Pytorch的损失函数Loss function接口介绍

1.损失函数简介损失函数,又叫目标函数,用于计算真实值和预测值之间差异的函数,和优化器是编译一个神经网络模型的重要要素。 损失Loss必须是标量,因为向量无法比较大小(向量本身需要通过范数等标量来比较)。 损失函数一般分为4种,HingeLoss 0-1 损失函数,绝对值损失函数,平方损失函数,对数损失函数。损失函数的本质任何一个有负对数似然组成的损失都是定义在训练集上的经验分布和定义在模型上的概...

weixin_36192410的博客 2510

交叉熵损失CrossEntropyLoss

这两种方法哪一个更好?

Gefangenes的博客 1万+

《深度学习》—— PyTorch的神经网络模块中常用的损失函数

在神经网络中,损失函数(Loss Function)扮演着至关重要的角色,它是衡量模型预测值与实际值之间差异的关键工具

weixin_73504499的博客 1905
上一篇: 熵,KL散度,交叉熵
下一篇: pytorch损失函数之nn.CrossEntropyLoss()、nn.NLLLoss()
geter_CS
博客等级 码龄10年 7310粉丝 118原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值