二分类损失 - BCELoss详解

BCELoss (Binary Cross-Entropy Loss) 是用于二分类问题的损失函数。它用于评估预测值和实际标签之间的差异。在 PyTorch 中,BCELoss 是一个常用的损失函数。以下是 BCELoss 的详细计算过程和代码实现。

BCELoss 的计算过程

给定一组预测值 y ^ \hat{y} y^ 和实际标签 y y y,BCELoss 的公式如下:

BCELoss ( y , y ^ ) = − 1 N ∑ i = 1 N [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] \text{BCELoss}(y, \hat{y}) = - \frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right] BCELoss(y,y^)=N1i=1N[yilog(y^i)+(1yi)log(1y^i)]

其中:

  • N N N 是样本数。
  • y i y_i yi 是第 i i i 个样本的实际标签,取值为 0 或 1。
  • y ^ i \hat{y}_i y^i 是第 i i i 个样本的预测值,取值范围在 (0, 1) 之间。

计算步骤

  1. 计算每个样本的损失
    对于每个样本,根据公式 y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) yilog(y^i)+(1yi)log(1y^i) 计算损失。

  2. 取反
    对上述结果取负,即 − [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] - \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right] [yilog(y^i)+(1yi)log(1y^i)]

  3. 求平均值
    对所有样本的损失取平均值。

PyTorch 中的代码实现

以下是一个完整的代码示例,展示了如何在 PyTorch 中使用 BCELoss 计算损失。

import torch
import torch.nn as nn# 创建一个示例输入(预测值)和标签
predictions = torch.tensor([0.1, 0.9, 0.8, 0.3], dtype=torch.float32)
labels = torch.tensor([0, 1, 1, 0], dtype=torch.float32)# 初始化 BCELoss
criterion = nn.BCELoss()# 计算损失
loss = criterion(predictions, labels)print(f"Binary Cross-Entropy Loss: {loss.item()}")

手动计算过程的实现

我们也可以手动实现 BCELoss 以理解其计算过程。以下是手动计算的代码示例:

import torch# 创建一个示例输入(预测值)和标签
predictions = torch.tensor([0.1, 0.9, 0.8, 0.3], dtype=torch.float32)
labels = torch.tensor([0, 1, 1, 0], dtype=torch.float32)# 计算每个样本的损失
loss = - (labels * torch.log(predictions) + (1 - labels) * torch.log(1 - predictions))# 求平均值
loss = loss.mean()print(f"Manually calculated Binary Cross-Entropy Loss: {loss.item()}")

解释

  1. 预测值 (predictions)标签 (labels): 这是两个张量,分别代表模型的预测结果和真实标签。

  2. nn.BCELoss(): 这是 PyTorch 中的二分类交叉熵损失函数。

  3. 损失计算 (criterion(predictions, labels)): 调用 BCELoss 对象计算预测值和标签之间的损失。

通过上述代码示例,我们可以看到如何在 PyTorch 中使用 BCELoss 计算损失以及手动计算该损失的过程。这样可以帮助更好地理解该损失函数的工作原理。

在 PyTorch 中,nn.BCELoss 是用于计算二分类交叉熵损失的类。这个类有一些参数可以用来调整其行为。以下是对 nn.BCELoss 的参数的详细讲解。

nn.BCELoss 的参数

  1. weight (optional):

    • 类型:Tensor
    • 说明:对每个样本的损失进行加权。如果提供了权重张量 weight,则会对每个样本的损失乘以相应的权重。
    • 使用场景:当需要对样本的重要性进行区分时使用。例如,某些样本可能比其他样本更重要,可以为这些样本赋予更高的权重。
  2. reduction (optional):

    • 类型:字符串,值可以是 'none''mean''sum'
    • 说明
      • 'none':不进行任何 reduction,直接返回每个样本的损失。
      • 'mean':对所有样本的损失取平均值(默认值)。
      • 'sum':对所有样本的损失求和。
    • 使用场景:根据需要调整输出的损失形式。例如,在某些情况下,可能需要查看每个样本的损失值,而不是平均损失值。

示例代码

下面的示例代码展示了如何使用这些参数:

import torch
import torch.nn as nn# 创建一个示例输入(预测值)和标签
predictions = torch.tensor([0.1, 0.9, 0.8, 0.3], dtype=torch.float32)
labels = torch.tensor([0, 1, 1, 0], dtype=torch.float32)# 使用 weight 参数
weights = torch.tensor([1.0, 0.5, 2.0, 1.0], dtype=torch.float32)
criterion_with_weights = nn.BCELoss(weight=weights)
loss_with_weights = criterion_with_weights(predictions, labels)
print(f"Binary Cross-Entropy Loss with weights: {loss_with_weights.item()}")# 使用 reduction 参数为 'none'
criterion_no_reduction = nn.BCELoss(reduction='none')
loss_no_reduction = criterion_no_reduction(predictions, labels)
print(f"Binary Cross-Entropy Loss with no reduction: {loss_no_reduction}")# 使用 reduction 参数为 'sum'
criterion_sum_reduction = nn.BCELoss(reduction='sum')
loss_sum_reduction = criterion_sum_reduction(predictions, labels)
print(f"Binary Cross-Entropy Loss with sum reduction: {loss_sum_reduction.item()}")# 使用 reduction 参数为 'mean'(默认)
criterion_mean_reduction = nn.BCELoss()
loss_mean_reduction = criterion_mean_reduction(predictions, labels)
print(f"Binary Cross-Entropy Loss with mean reduction (default): {loss_mean_reduction.item()}")

解释

  1. weight 参数

    • 在创建 BCELoss 对象时,通过 weight 参数传递一个权重张量。该权重张量的长度应与预测值和标签的长度相同。
    • criterion_with_weights = nn.BCELoss(weight=weights): 创建一个带权重的损失函数。
    • loss_with_weights = criterion_with_weights(predictions, labels): 计算带权重的损失值。
  2. reduction 参数

    • 'none':不进行任何 reduction,直接返回每个样本的损失。
      criterion_no_reduction = nn.BCELoss(reduction='none')
      loss_no_reduction = criterion_no_reduction(predictions, labels)
      
    • 'sum':对所有样本的损失求和。
      criterion_sum_reduction = nn.BCELoss(reduction='sum')
      loss_sum_reduction = criterion_sum_reduction(predictions, labels)
      
    • 'mean':对所有样本的损失取平均值(默认)。
      criterion_mean_reduction = nn.BCELoss()
      loss_mean_reduction = criterion_mean_reduction(predictions, labels)
      

通过调整这些参数,nn.BCELoss 可以更灵活地适应不同的应用场景和需求。

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

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

相关文章

redis的使用场景-分布式锁

使用redis的setnx命令放入数据并用此数据当锁完成业务(但是如果用户操作途中出现异常导致超出指定时间会出现问题) Service public class StockService {Autowiredprivate StockDao stockDao; //mapper注入Autowiredprivate StringRedisTemplate redisT…

ssm框架整合,异常处理器和拦截器(纯注解开发)

目录 ssm框架整合 第一步:指定打包方式和导入所需要的依赖 打包方法:war springMVC所需依赖 解析json依赖 mybatis依赖 数据库驱动依赖 druid数据源依赖 junit依赖 第二步:导入tomcat插件 第三步:编写配置类 SpringCon…

【AI绘画】Midjourney V6初学者完全指南 参数篇

本文我们将详细介绍对图像生成结果产生重大影响的"参数"。 1. 什么是参数? 参数是一种添加到提示末尾以调整图像生成输出设置的方法。 它们用两个连字符"–“和特定字符串表示,如”–ar"、“–chaos”、"–r"等。 您也可以同时使用多个参数…

分布式控制算法——第一部分:基础概念与原理

分布式控制算法 文章目录 分布式控制算法第一部分:基础概念与原理1. 引言分布式控制的定义分布式控制系统的特点与优势分布式控制的应用场景 2. 分布式系统基础分布式系统的定义和特性分布式计算模型常见的分布式系统架构 3. 分布式控制基础分布式控制的基本原理中央…

面试题003:面向对象的特征 之 封装性

Java规定了4种权限修饰,分别是:private、缺省、protected、public。我们可以使用4种权限修饰来修饰类及类的内部成员。当这些成员被调用时,体现可见性的大小。 封装性在程序中的体现: 场景1:私有化(private)类的属性,提供公共(pub…

java项目中添加SDK项目作为依赖使用(无需上传Maven)

需求: 当需要多次调用某个函数或算法时,不想每次调用接口都自己编写,可以将该项目打包,以添加依赖的方式实现调用 适用于: 无需上线的项目,仅公司或团队内部使用的项目 操作步骤: 以下面这…

菜鸟从0学微服务——MyBatis-Plus

关于“菜鸟从0学微服务” 针对有编程基础,开始学习微服务的同学,我们陆续推出从0学微服务的笔记分享。力求从各个中间件的使用来反思这些中间件的作用和优势。 会分享的比较快,会记录demo演算和中间件的使用过程,至于细节的理论…

OPENMV脱机调阈值

用到了7个按钮,第一个用来选择是否进入调阈值模式。 后6个用来调整OPENMV阈值编辑器的6个滑动条 OPENMV代码 import sensor, image, time, pyb,math, display from pyb import UARTsensor.reset() sensor.set_framesize(sensor.QQVGA) sensor.set_pixformat(sens…

【数学建模】——【python】实现【最短路径】【最小生成树】【复杂网络分析】

目录 1. 最短路径问题 - 绘制城市间旅行最短路径图 题目描述: 要求: 示例数据: python 代码实现 实现思想: 要点: 2. 最小生成树问题 - Kruskal算法绘制MST 题目描述: 要求: 示例数据…

【Linux】模拟实现简易shell命令行:基于进程创建、进程等待、进程替换等知识的练习

程序功能:模拟实现一个自己的shell执行命令行。 涉及知识:字符串输入及操作函数、子进程创建、进程等待、进程替换、环境变量及获取、添加环境变量的函数 额外需要了解的功能函数:chdir(char* path)函数——改变当前…

PostgreSQL入门与进阶学习,体系化的SQL知识,完成终极目标高可用与容灾,性能优化与架构设计,以及安全策略

​专栏内容: postgresql使用入门基础手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 文章目录 概述基础篇初级篇进阶篇…

安装 GCC 编译器和开发工具

安装 GCC 编译器和开发工具 更新软件包管理器 在 CentOS 终端中,首先更新软件包管理器: sudo yum update -y安装 GCC 编译器和其他开发工具 运行以下命令安装 GCC 编译器和其他必要的开发工具: sudo yum groupinstall -y "Development T…

通过不同方式在 Vue 3 中传递路由参数

如何通过不同方式在 Vue 3 中传递路由参数,并在组件中使用 defineProps 或其他组合式 API 获取这些参数? 1. 通过 path 参数传递 最常见的方式,通过在路由路径中定义动态参数,并在路由配置中设置 props: true,将参数…

S5730举例

校园网络拓扑和设备 大学校园网络通常使用多层级结构,核心是承载所有交换机的中心点,而分支则连接到核心以支持更广泛的网络覆盖。华为的S5730交换机通常用于大型企业和校园网络中,提供高性能和可靠性。 STP (Spanning Tree Protocol) 作用&…

事务、函数和索引

目录 什么是事务? 事务的ACID原则: 事务的操作 事务的原子性、一致性、持久性 事务的隔离性 什么是事务的隔离性? 用什么方法实现事务的隔离性? MySQL中的锁 锁分类: 事务的隔离级别 事务并发问题 InnoDB的MVCC MVCC…

【C++】红黑树的应用(封装map和set)

✨ 青山一道同云雨,明月何曾是两乡 🌏 📃个人主页:island1314 🔥个人专栏:C学习 🚀 欢迎关注:👍点赞 &…

Unity UGUI 实战学习笔记(3)

仅作学习,不做任何商业用途 不是源码,不是源码! 是我通过"照虎画猫"写的,可能有些小修改 不提供素材,所以应该不算是盗版资源,侵权删 拼UI 提示面板的逻辑 using System.Collections; using System.Col…

大数据——Hive原理

摘要 Apache Hive 是一个基于 Hadoop 分布式文件系统 (HDFS) 的数据仓库软件项目,专为存储和处理大规模数据集而设计。它提供类似 SQL 的查询语言 HiveQL,使用户能够轻松编写复杂的查询和分析任务,而无需深入了解 Hadoop 的底层实现。 Hive…

Firefox扩展程序和Java程序通信

实现Firefox扩展程序,和Java RMI Client端进行通信。 在Firefox工具栏注册按钮,点击按钮后弹出Popup.html页面,引用Popup.js脚本,通过脚本向Java RMI client发送消息,Java RMI Client接收消息后转发到Java RMI Server…

python写的登陆邮箱 接收邮件

import time from datetime import datetime, timedelta from mail import get_mails, server_login from notion import sync_bills from data_handler import alipay_data, wechat_data server server_login() if server ! -1: print(“尝试获取邮件”) waiting_time da…