【深度学习】cv领域中各种loss损失介绍

news2024/10/2 1:35:16

文章目录

  • 前言
  • 一、均方误差
  • 二、交叉熵损失
  • 三、二元交叉熵损失
  • 四、Smooth L1 Loss
  • 五、IOU系列的loss


前言

损失函数是度量模型的预测输出与真实标签之间的差异或误差,在深度学习算法中起着重要作用。具体作用:
1、目标优化:损失函数是优化算法的目标函数,通过最小化损失函数,模型的参数可以使得预测值接近真实值。训练过程的目标就是找到使损失函数最小化的参数。
2、模型评估:损失函数也可用于评估模型的性能。
3、指导学习过程:通过损失函数,模型可以学习如何调整权重和偏置以最小化预测实际标签之间的差异。这是通过梯度下降等优化算法来实现,这些算法使用损失函数的梯度来指导参数的更新。

深度学习损失函数在训练和评估深度学习模型中发挥关键作用,直接影响模型的性能和泛化能力。选择合适的损失函数是深度学习模型设计中的一个重要决策。


一、均方误差

均方误差(Mean Squared Error,MSE)是一种用于回归问题的损失函数,它度量模型的预测值与实际标签之间的平方差的平均值。通常用在具有连续输出的回归问题中使用,结合梯度下降等优化算法,最小化模型的预测误差。
优点:由于平方的存在,能对大误差给予更大的惩罚。缺点:对离群值(异常值)非常敏感,单个异常值可能对整体损失较大影响。
在pytroch的API:参考文档
torch.nn.MSELoss(reduction=‘mean’)
reduction (str, optional) – Specifies the reduction to apply to the output: ‘none’ | ‘mean’ | ‘sum’. ‘none’: no reduction will be applied, ‘mean’: the sum of the output will be divided by the number of elements in the output, ‘sum’: the output will be summed. Note: size_average and reduce are in the process of being deprecated, and in the meantime, specifying either of those two args will override reduction. Default: ‘mean’
代码示例:

import torch
import torch.nn as nn

torch.random.manual_seed(0)


if __name__ == '__main__':
    mse = nn.MSELoss(reduction='sum')
    inputs = torch.randn(3, 5, requires_grad=True)
    outputs = torch.randn(3, 5)
    loss = mse(inputs, outputs)

在cv中,常用在以下几个领域:

  1. 图像配准(模板匹配):MSE用于衡量两个图像之间的差异。通过比较配准后的图像与目标之间的像素,评估二者之间的差异。
  2. 回归任务:在图像属性预测等任务中,MSE是一种常见的损失函数。
  3. 目标检测:在目标检测中,当模型需要回归目标边界框的坐标时,MSE度量预测框与真实框之间的位置差异。如yolov1等。
  4. 自监督学习:生成的目标通常是通过对原始数据应用某种变换而获得的。MSE可以用于度量模型生成的结果与变换后的原始数据之间的差异。
  5. 生成对抗网络(GAN): 在 GAN 中,生成器的输出与真实图像之间的差异通常可以通过 MSE 来度量。然而,对抗性损失(例如二元交叉熵)通常更为常见,因为它更好地促使生成器生成逼真的图像。

二、交叉熵损失

CrossEntropyLoss(交叉熵损失)是在多分类问题中常用的损失函数,用于衡量模型输出的概率分布与真实标签的差异。
在这里插入图片描述
Y代表真实值, Y-head表示预测值
交叉熵损失通过比较模型对每个类别的预测概率与真实标签的概率分布,惩罚模型对正确类别的不确定性越大的情况。在优化过程中,模型的目标是最小化交叉熵损失,以使得模型对每个样本的预测更接近真实的标签分布。参考文档
在PyTorch等深度学习框架中,CrossEntropyLoss通常与Softmax激活函数结合使用。Softmax函数能够将模型的原始输出转换成表示概率分布的形式,而CrossEntropyLoss则基于这些概率计算损失。
在这里插入图片描述
代码示例:

import torch
import torch.nn as nn

# Example of target with class indices
loss = nn.CrossEntropyLoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.empty(3, dtype=torch.long).random_(5)
output = loss(input, target)
output.backward()
# Example of target with class probabilities
input = torch.randn(3, 5, requires_grad=True)
target = torch.randn(3, 5).softmax(dim=1)
output = loss(input, target)
output.backward()

在cv领域,交叉熵损失常用在图像多分类的场景中。

三、二元交叉熵损失

BCELoss是交叉熵损失在二分类问题上的一个特例。在深度学习中,会使用二元交叉熵损失函数来衡量二分类模型的性能。与一般的交叉熵损失相比,二元交叉熵只涉及两个类别,因此简化了损失函数的形式。优化算法(如梯度下降)通过最小化BCELoss来调整模型参数,使得模型在二分类任务中更准确。
表达式如下:
在这里插入图片描述
在pytorch的API:
torch.nn.BCELoss(weight=None, reduction=‘mean’)

reduction (str, optional) – Specifies the reduction to apply to the output: ‘none’ | ‘mean’ | ‘sum’. ‘none’: no reduction will be applied, ‘mean’: the sum of the output will be divided by the number of elements in the output, ‘sum’: the output will be summed. Note: size_average and reduce are in the process of being deprecated, and in the meantime, specifying either of those two args will override reduction. Default: ‘mean’
在PyTorch等深度学习框架中,BCELoss通常与Sigmoid激活函数一起使用,因为Sigmoid函数可以将模型输出映射到[0, 1]范围内的概率值。这两者的结合通常用于最后一层的模型输出。
代码示例:

import torch
import torch.nn as nn

m = nn.Sigmoid()
loss = nn.BCELoss()
input = torch.randn(3, 2, requires_grad=True)
target = torch.rand(3, 2, requires_grad=False)
output = loss(m(input), target)
output.backward()

四、Smooth L1 Loss

Smooth L1 Loss,也称为 Huber Loss,是一种损失函数,通常用于回归问题。它的特点是相对于均方误差(MSE),在预测接近目标值时损失函数的增长更缓慢,这使得它对离群值(outliers)更加鲁棒。
在这里插入图片描述
beta一般等于1。
优点:

  1. 鲁棒性:Smooth L1 Loss相对于均方误差(MSE)对离群值更具鲁棒性。这使得它在处理包含噪声或异常值的数据时表现更好,尤其在回归任务中,其中存在离群值的可能性较大。
  2. 平滑性: 在 (|x| < 1) 的情况下,Smooth L1 Loss使用平方项,使得损失在预测接近目标值时增长缓慢。这种平滑性有助于训练过程的稳定性。
  3. 对于大误差的抑制效果: 对于大误差,Smooth L1 Loss的增长速率较慢,相对于MSE,它在对大误差的处理上更加温和。
    缺点:
  4. 对小误差不敏感: 对于小误差,Smooth L1 Loss的损失增长速率较快,这可能使得在某些情况下对小误差不够敏感。这也可能导致模型对于较小的误差调整得过于激烈。
  5. 非唯一性: 对于某些相同的误差,Smooth L1 Loss可能有多个最小值。这使得损失函数的形状在某些情况下变得复杂,可能对优化过程产生一定的影响。

在pytorch中的API:
torch.nn.SmoothL1Loss(reduction=‘mean’, beta=1.0)
在cv领域中,smooth L1 loss常用来代替MSE,用于边界框回归,相比较MSE,smooth L1 loss更抗干扰。

五、IOU系列的loss

IOU Loss用于衡量目标检测模型性能的损失函数。用于监督模型在生成边界框预测时与真实边界框之间的重叠程度。
总共有四种IOU相关的Loss:IOU Loss、GIOU Loss、DIOU Loss、CIOU Loss
(1)IOU Loss:衡量预测框与真实框的IOU的大小,IOU越大,损失越少。
在这里插入图片描述
优点:能够更好反应重合程度,具有尺度不变性;
缺点:当二者不相交时,Loss为0,导致损失没办法继续传播。
(2)、GIOU Loss
GIOULoss针对IOULoss的缺点,引入了Ac和u,改善了部分IOULoss的缺陷。
在这里插入图片描述
Ac表示蓝色矩形框的面积,u表示预测框与真实框的并集。
GIOULoss表达式:
GIOU Loss = 1 - GIOU
缺点是:两个边界框在同一水平线上时(Ac等于u),退化成IOU。收敛慢,收敛精度低。
(3)DIOU Loss
DIOU Loss在IOU的基础上,考虑了预测框与边界框中心的距离及最大矩形框的对角线距离。
在这里插入图片描述
DIOULoss = 1 - DIou
DIOULoss极大加快了收敛速度和收敛精度。
(4)CIOU Loss
CIOU Loss在DIOU Loss的基础上,还考虑长宽比。
在这里插入图片描述

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

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

相关文章

Unable to connect to Redis server

报错内容&#xff1a; Exception in thread "main" org.redisson.client.RedisConnectionException: java.util.concurrent.ExecutionException: org.redisson.client.RedisConnectionException: Unable to connect to Redis server: 175.24.186.230/175.24.186.230…

C语言scanf()函数详解

目录 1. scanf&#xff08;&#xff09;函数简介 1.1 函数原型 1.2 头文件 1.3 返回值 1.4 参数 2.格式说明符 3.输入格式控制 关于‘ * ’的例子 关于width域宽的例子 关于length长度修饰符的说明 4. 其他常见问题说明 4.1 scanf&#xff08;&#xff09;函数连…

2024年【烟花爆竹经营单位主要负责人】考试题及烟花爆竹经营单位主要负责人考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【烟花爆竹经营单位主要负责人】考试题及烟花爆竹经营单位主要负责人考试资料&#xff0c;包含烟花爆竹经营单位主要负责人考试题答案和解析及烟花爆竹经营单位主要负责人考试资料练习。安全生产模拟考试一点通…

纹理贴图如何为游戏角色增添质感

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 游戏角色的3D建模是位移贴图技术广泛应用的领域之一。通过位移贴图&a…

记录汇川:H5U与Fctory IO 测试1

主程序&#xff1a; 子程序&#xff1a; Fctory IO通讯配置如下 &#xff1a; H5U作服务器&#xff0c;Fctory IO作客户端 这里参考&#xff1a;HU5作服务器地址 实现的动作如下&#xff1a; H5U与Factory IO联动

华为MDC610接口说明

1、MDC610对外功能接口 2、1、MDC610硬件技术规格

数据库初始化脚本(用 truncate 命令一键清空某个数据库中全部数据表数据)

数据库初始化脚本&#xff08;用 truncate 命令一键清空某个数据库中全部数据表数据&#xff09; 1.执行下面的sql语句生成“清空数据库的sql脚本”2.执行“清空数据库的sql脚本” 在开发中&#xff0c;当数据表结构有变动或者数据库中有脏数据时&#xff0c;想要清空数据表中的…

Python中的@abstractmethod

abstractmethod 是 Python 中 abc 模块&#xff08;Abstract Base Classes&#xff09;提供的一个装饰器&#xff0c;用于声明抽象方法。抽象方法是指在抽象类中声明但没有提供具体实现的方法&#xff0c;而是由其子类提供具体实现。 使用 abstractmethod 装饰器可以使得子类在…

普通BUG

IDEA包折叠 如果自动紧凑包名,则有些时候创建新包或类的时候不能达到想要的摆放层级关系,此时右上角搜索按钮搜hide middle,关掉紧凑即可,然后既可以每层一个包不折叠. 效果: 20240105println输出多个参数 int a 10;int b 20;报错println是可以输出多个参数的,但不支持直接用…

C++中的new和delete

相关文章 C智能指针 文章目录 相关文章前言一、new 运算符1. operator new 函数的范围2. 在类中重载new运算符3. 分配失败 二、delete 运算符1. 内存泄露统计示例2. 在类中重载delete运算符 总结 前言 在C中&#xff0c;new和delete是用于动态内存管理的运算符&#xff0c;它们…

优势演员-评论家算法 A2C

优势演员-评论家算法 A2C 优势演员-评论家算法 A2C主要思想目标函数 优势演员-评论家算法 A2C 前置知识&#xff1a;演员-评论家算法&#xff1a;多智能体强化学习核心框架 主要思想 AC 网络结构&#xff1a; 策略网络 - 演员: 这个网络负责根据当前的状态选择动作。它输出的是…

更改ERPNEXT源

更改ERPNEXT源 一&#xff0c; 更改源 针对已经安装了erpnext的&#xff0c;需要更改源的情况&#xff1a; 1, 更改为官方默认源, 进入frapp-bench的目录&#xff0c; 然后执行: bench remote-reset-url frappe //重设frappe的源为官方github地址。 bench remote-reset-url…

如何使用免费的ZeroSSL证书保护您的网站

使用 ZeroSSL 在您的站点上轻松实施 SSL。我们的指南涵盖了免费证书设置&#xff0c;确保安全和加密的用户连接。 如今&#xff0c;保护您的网站不仅是一种建议&#xff0c;而且是一种必需品。这就是SSL证书发挥作用的地方。它们对用户浏览器和网站之间传输的数据进行加密&…

复旦MBA科创青干营(二期):探索合肥科创企业的创新之路

11月18日-19日&#xff0c;复旦MBA科创青干营二期学生开启了整合实践活动的第三次企业参访&#xff0c;前往位于合肥的蔚来第二先进制造基地、安徽万邦医药科技股份有限公司和合肥国轩高科动力能源有限公司&#xff0c;在学术导师和科创企业家“双导师”的指导下&#xff0c;深…

LeetCode 每日一题 Day 3334(hard)35 ||二进制枚举/单调栈/链表遍历

2397. 被列覆盖的最多行数 给你一个下标从 0 开始、大小为 m x n 的二进制矩阵 matrix &#xff1b;另给你一个整数 numSelect&#xff0c;表示你必须从 matrix 中选择的 不同 列的数量。 如果一行中所有的 1 都被你选中的列所覆盖&#xff0c;则认为这一行被 覆盖 了。 形式…

MyBatis - 批量更新(update foreach)报错

在使用mybatis执行批量更新(update foreach)数据的时候报错如下&#xff1a; org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; c…

Merge还是Rebase?这次终于懂了

《Git分支管理&#xff1a;Merge还是Rebase&#xff1f;》 导语&#xff1a; 在Git的分支管理中&#xff0c;Merge和Rebase是两种常见的合并策略&#xff0c;每一种都有其优劣之处。究竟应该选择Merge还是Rebase&#xff0c;取决于项目的需求和团队的工作流程。本文将深入探讨…

金和OA C6 MailTemplates.aspx SQL注入漏洞复现

0x01 产品简介 金和OA协同办公管理系统软件(简称金和OA),本着简单、适用、高效的原则,贴合企事业单位的实际需求,实行通用化、标准化、智能化、人性化的产品设计,充分体现企事业单位规范管理、提高办公效率的核心思想,为用户提供一整套标准的办公自动化解决方案,以帮助…

手势识别+人脸识别+姿态估计(关键点检测+教程+代码)

手势识别和手势关键点检测是计算机视觉领域中的一个重要研究方向,涉及到从图像或视频中检测人手的位置和姿态信息,并推断出手势的意义。以下是一些可能用到的方法和技术: 手势识别 基于深度学习的手势识别 基于深度学习的手势识别是目前最流行的方法之一。它通常使用卷积神…

前置判断-Detection

检测模型回答存在幻觉可以通过检索外部知识进行校验&#xff0c;不过考虑生成式模型覆盖问题的广泛性&#xff0c;Self-Contradictory论文中评估chatgpt生成的回答中38.5%的内容无法通过Wiki等外部知识进行校验。 因此这里我们先介绍一种完全基于模型自身&#xff0c;不依赖外…