binary_cross_entropy和binary_cross_entropy_with_logits的区别

binary_cross_entropy和binary_cross_entropy_with_logits的区别

引言

二分类问题是常见的机器学习任务之一,其目标是将样本分为两个类别。为了训练一个二分类模型,通常使用交叉熵作为损失函数。

二分类交叉熵损失函数有两种不同的形式,分别是 binary_cross_entropy_with_logitsbinary_cross_entropy。在 PyTorch 中,这两种损失函数都是可用的,它们的区别在于输入的形式不同,以及它们分别是在什么情况下使用更合适

在这里插入图片描述

无论生活中发生什么,你都可以选择快乐。
悲伤从来都不是一种选择。
快乐的关键是要知道你可以控制你接受什么和放弃什么。

主要区别与说明

binary_cross_entropy_with_logits 通常用于二元分类问题,其中每个样本都只属于两个类别之一。此损失函数的输入应该是模型的预测值和真实标签,通常是使用sigmoid函数将最终的输出值转换为概率值。

binary_cross_entropy 也是用于二元分类问题的损失函数,但其输入应该是模型的预测值和真实标签的概率值。因此,在使用此损失函数时,需要将模型的输出值使用sigmoid函数转换为概率值,然后再将其与真实标签进行比较。

总之,binary_cross_entropy_with_logits 适用于模型输出未经过概率变换的情况,而 binary_cross_entropy 适用于模型输出已经是概率值的情况。

实例说明

以下是一个基于PyTorch的实例,展示如何使用两种损失函数:

import torch
import torch.nn as nn# 创建一个样例数据
y_true = torch.Tensor([1, 0, 1, 1])
y_pred = torch.Tensor([0.9, 0.1, 0.8, 0.7])# 使用binary_cross_entropy_with_logits计算损失函数
loss_logits = nn.BCEWithLogitsLoss()(y_pred, y_true)
print("loss with logits:", loss_logits)# 错误示例
loss_sigmoid_error = nn.BCELoss()(y_pred, y_true)
print("注意:错误示例 loss with sigmoid_error:", loss_sigmoid_error)  # !!!注意:可以直接计算,但是这样的计算式错误的# 使用binary_cross_entropy计算损失函数
y_pred_sigmoid = torch.sigmoid(y_pred)
print("y_pred_sigmoid:", y_pred_sigmoid)
loss_sigmoid = nn.BCELoss()(y_pred_sigmoid, y_true)
print("loss with sigmoid:", loss_sigmoid)

运行输出如下:

loss with logits: tensor(0.4650)
注意:错误示例 loss with sigmoid_error: tensor(0.1976)
y_pred_sigmoid: tensor([0.7109, 0.5250, 0.6900, 0.6682])
loss with sigmoid: tensor(0.4650)

其中,使用nn.BCEWithLogitsLoss()函数计算binary_cross_entropy_with_logits损失函数,而使用nn.BCELoss()函数计算binary_cross_entropy损失函数。在实际使用中,建议优先使用binary_cross_entropy_with_logits损失函数。

总结

binary_cross_entropy_with_logitsbinary_cross_entropy 两者都是用于二分类问题中的损失函数。它们的主要区别在于输入的形式以及计算方式。

binary_cross_entropy_with_logits的输入是网络输出的logits(未经sigmoid函数激活的),并且该函数会自动进行sigmoid函数激活处理。而binary_cross_entropy的输入是经过sigmoid函数激活的概率值。因此使用binary_cross_entropy_with_logits会更加方便且稳定,因为它可以避免数值计算溢出的情况。

这里的logits指的是,该损失函数已经内部自带了计算logit的操作,无需在传入给这个loss函数之前手动使用sigmoid/softmax将之前网络的输入映射到[0,1]之间。事实上,官方是推荐使用函数带有with_logits的,解释是
This loss combines a Sigmoid layer and the BCELoss in one single class. This version is more numerically stable than using a plain Sigmoid followed by a BCELoss as, by combining the operations into one layer, we take advantage of the log-sum-exp trick for numerical stability.
翻译一下就是说将sigmoid层和binaray_cross_entropy合在一起计算比分开依次计算有更好的数值稳定性,这主要是运用了log-sum-exp技巧。
在这里插入图片描述

reference

@misc{BibEntry2023Oct,
title = {{pytorch损失函数binary{ _ \_ _}cross{ _ \_ _}entropy和binary{ _ \_ _}cross{ _ \_ _}entropy{ _ \_ _}with{ _ \_ _}logits的区别-CSDN博客}},
year = {2023},
month = oct,
urldate = {2023-10-06},
language = {chinese},
note = {[Online; accessed 6. Oct. 2023]},
url = {https://blog.csdn.net/u010630669/article/details/105599067}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/125864.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java-LangChain:使用 ChatGPT API 搭建系统-2】语言模型,提问范式与 Token

第二章 语言模型,提问范式与 Token 在本章中,我们将和您分享大型语言模型(LLM)的工作原理、训练方式以及分词器(tokenizer)等细节对 LLM 输出的影响。我们还将介绍 LLM 的提问范式(chat format…

milvus 结合Thowee 文本转向量 ,新建表,存储,搜索,删除

1.向量数据库科普 【上集】向量数据库技术鉴赏 【下集】向量数据库技术鉴赏 milvus连接 from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility connections.connect(host124.****, port19530)2.milvus Thowee 文本转向量 使用 …

C语言之自定义类型_结构体篇(1)

目录 什么是结构? 结构体类型的声明 常规声明 特殊声明-匿名结构体 结构体变量的定义和初始化和访问 定义 初始化 访问 嵌套结构体 结构体的自引用 什么是结构体的自引用 NO1. NO2. 热门考点:结构体内存对齐 产生内存对齐 NO1 NO2 …

golang gin——controller 模型绑定与参数校验

controller 模型绑定与参数校验 gin框架提供了多种方法可以将请求体的内容绑定到对应struct上,并且提供了一些预置的参数校验 绑定方法 根据数据源和类型的不同,gin提供了不同的绑定方法 Bind, shouldBind: 从form表单中去绑定对象BindJSON, shouldB…

一个.NET开发的开源跨平台二维码生成库

虽然已经有很多生成二维码的解决方案,但是它们大多依赖System.Drawing,而.NET 6开始,使用System.Drawing操作图片,在生成解决方案或打包时,会收到一条警告,大致意思是System.Drawing仅在 ‘windows’ 上受支…

华为MateBook13 2021款(WRTD-WFE9)原装出厂Win10系统工厂模式安装包(含F10智能还原)

下载链接:https://pan.baidu.com/s/1yL7jFbklrln0UqWqxQ7fcw?pwd9nm1 系统自带一键智能还原功能、带有指纹、声卡、显卡、网卡等所有驱动、出厂主题壁纸、系统属性华为专属LOGO标志、Office办公软件、华为电脑管家等预装程序 所需要工具:16G或以上的U…

Linux上将进程、线程与CPU核绑定

CPU亲和性(CPU Affinity)是某一进程(或线程)绑定到特定的CPU核(或CPU集合),从而使得该进程(或线程)只能运行在绑定的CPU核(或CPU集合)上。进程(或线程)本质上并不与CPU核绑定。每次进程(或线程)被调度执行时,它都可以由其关联列表中的任何CPU核执行。如果…

Java常见API---split()

package daysreplace;public class SplitTest {public static void main(String[] args) {String str"武汉市|孝感市|长沙市|北京市|上海市";String[] array str.split("\\|");System.out.println(array[0]);System.out.println(array[1]);System.out.pri…

Unity2D创建帧动画片段

文章目录 概述为角色创建动画Animator组件创建动画片段状态转移 其他文章 概述 动画是游戏中一种使对象表现出运动或变换的方式。当涉及到动画时,我们通常就会用到Animator组件。它允许我们在Unity编辑器中创建、管理和控制这些动画,并将其应用于游戏对…

推荐系统实践 笔记

诸神缄默不语-个人CSDN博文目录 这是我2020年写的笔记,我从印象笔记搬过来公开。 如果那年还在读本科的同学也许有印象,那年美赛出了道根据电商评论给商户提建议的题。其实这件事跟推荐系统关系不大,但我们当时病急乱投医,我打开…

【开发篇】十六、SpringBoot整合JavaMail实现发邮件

文章目录 0、相关协议1、SpringBoot整合JavaMail2、发送简单邮件3、发送复杂邮件 0、相关协议 SMTP(Simple Mail Transfer Protocol):简单邮件传输协议,用于发送电子邮件的传输协议POP3(Post Office Protocol - Versi…

RabbitMQ集群搭建详细介绍以及解决搭建过程中的各种问题——实操型

RabbitMQ集群搭建详细介绍以及解决搭建过程中的各种问题——实操型 1. 准备工作1.1 安装RabbitMQ1.2 简单部署搭建设计1.3 参考官网 2. RabbitMQ 形成集群的方法3. 搭建RabbitMQ集群3.1 部署架构3.2 rabbitmq集群基础知识3.2.1 关于节点名称(标识符)3.2.…