pytorch-损失函数-分类和回归区别

这篇具有很好参考价值的文章主要介绍了pytorch-损失函数-分类和回归区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

torch.nn 库和 torch.nn.functional库的区别

  1. torch.nn库:这个库提供了许多预定义的层,如全连接层(Linear)、卷积层(Conv2d)等,以及一些损失函数(如MSELoss、CrossEntropyLoss等)。这些层都是类,它们都继承自nn.Module,因此可以很方便地集成到自定义的模型中。torch.nn库中的层都有自己的权重和偏置,这些参数可以通过优化器进行更新。

    1. 当你需要的操作包含可学习的参数(例如权重和偏置)时,通常使用torch.nn库更为方便。例如,对于卷积层(Conv2d)、全连接层(Linear)等,由于它们包含可学习的参数,因此通常使用torch.nn库中的类。这些类会自动管理参数的创建和更新。

      例如:

    2. import torch.nn as nn
      
      conv = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1)
      fc = nn.Linear(in_features=1024, out_features=10)
      
  2. torch.nn.functional库:这个库提供了一些函数,如激活函数(如relu、sigmoid等)、池化函数(如max_pool2d、avg_pool2d等)以及一些损失函数(如cross_entropy、mse_loss等)。这些函数更加灵活,但使用它们需要手动管理权重和偏置。

    1. 对于没有可学习参数的操作,例如ReLU激活函数、池化操作、dropout等,你可以选择使用torch.nn.functional库,因为这些操作不需要额外的参数。

    2. import torch.nn.functional as F
      
      x = F.relu(x)
      x = F.max_pool2d(x, kernel_size=2)
      x = F.dropout(x, p=0.5, training=self.training)
      
  3. 对于损失函数,torch.nn库和torch.nn.functional库都提供了实现,你可以根据需要选择。如果你需要的损失函数有可学习的参数(例如nn.BCEWithLogitsLoss中的pos_weight),那么应该使用torch.nn库。如果你的损失函数没有可学习的参数,那么你可以选择使用torch.nn.functional库,这样可以避免创建不必要的对象。

    例如:

  4. import torch.nn as nn
    import torch.nn.functional as F
    
    # 使用nn库
    loss_fn = nn.CrossEntropyLoss()
    loss = loss_fn(prediction, target)
    
    # 使用functional库
    loss = F.cross_entropy(prediction, target)
    

torch.nn 库和 torch.nn.functional库损失函数的对应关系

以下是一些常见的损失函数在torch.nn和torch.nn.functional中的对应关系:

  1. 交叉熵损失:
    1. torch.nn.CrossEntropyLoss
    2. torch.nn.functional.cross_entropy
  2. 负对数似然损失:
    1. torch.nn.NLLLoss
    2. torch.nn.functional.nll_loss
  3. 均方误差损失:
    1. torch.nn.MSELoss
    2. torch.nn.functional.mse_loss
  4. 平均绝对误差损失:
    1. torch.nn.L1Loss
    2. torch.nn.functional.l1_loss

分类和回归损失函数的区别

  1. 分类问题:分类问题的目标是预测输入数据的类别。对于这类问题,常用的损失函数有交叉熵损失(Cross Entropy Loss)和负对数似然损失(Negative Log Likelihood Loss)。这些损失函数都是基于预测的概率分布和真实的概率分布之间的差异来计算损失的。
    1. nn.CrossEntropyLoss:这是用于分类问题的损失函数。它期望的输入是一个形状为(batch_size, num_classes)的张量,其中每个元素是对应类别的原始分数(通常是最后一个全连接层的输出),以及一个形状为(batch_size,)的张量,其中每个元素是真实的类别标签。
    2. nn.NLLLoss:这也是用于分类问题的损失函数。它期望的输入是一个形状为(batch_size, num_classes)的张量,其中每个元素是对应类别的对数概率(通常是log_softmax的输出),以及一个形状为(batch_size,)的张量,其中每个元素是真实的类别标签。
  2. 回归问题:回归问题的目标是预测一个连续的值。对于这类问题,常用的损失函数有均方误差损失(Mean Squared Error Loss)和平均绝对误差损失(Mean Absolute Error Loss)。这些损失函数都是基于预测值和真实值之间的差异来计算损失的。
    1. nn.MSELoss:这是用于回归问题的损失函数。它期望的输入是两个形状相同的张量,一个是预测值,一个是真实值。这两个张量的形状可以是任意的,只要它们相同即可。
    2. nn.L1Loss:这也是用于回归问题的损失函数。它期望的输入是两个形状相同的张量,一个是预测值,一个是真实值。这两个张量的形状可以是任意的,只要它们相同即可。
举例说明

nn.MSELoss()

输入:预测值和目标值,它们的形状应该是相同的。例如,如果你有一个批量大小为batch_size的数据,每个数据有n个特征,那么预测值和目标值的形状都应该是(batch_size, n)。

输出:一个标量,表示计算得到的均方误差损失。

例如:

import torch
import torch.nn as nn

# 假设我们有一个批量大小为3的数据,每个数据有2个特征
prediction = torch.randn(3, 2)
target = torch.randn(3, 2)

loss_fn = nn.MSELoss()
loss = loss_fn(prediction, target)

print(loss)  # 输出一个标量,表示计算得到的均方误差损失

F.cross_entropy()

输入:预测值和目标值。预测值的形状应该是(batch_size, num_classes),表示对每个类别的预测概率;目标值的形状应该是(batch_size,),表示每个数据的真实类别标签。

输出:一个标量,表示计算得到的交叉熵损失。

例如:

import torch
import torch.nn.functional as F

# 假设我们有一个批量大小为3的数据,有4个类别
prediction = torch.randn(3, 4)
target = torch.tensor([1, 0, 3])  # 真实的类别标签

loss = F.cross_entropy(prediction, target)

print(loss)  # 输出一个标量,表示计算得到的交叉熵损失

多分类中CrossEntropyLoss() 和NLLLoss()的区别

  1. CrossEntropyLoss():它的输入是模型对每个类别的原始分数(通常是最后一个全连接层的输出),并且这些分数没有经过任何归一化处理。CrossEntropyLoss()内部会对这些分数进行log_softmax操作,然后计算交叉熵损失。
  2. NLLLoss():它的输入是模型对每个类别的对数概率,这些对数概率通常是通过对模型的原始输出进行log_softmax操作得到的。NLLLoss()会直接计算负对数似然损失。

CrossEntropyLoss() = softmax + log + NLLLoss() = log_softmax + NLLLoss()

二分类中BCELoss和BCEWithLogitsLoss的区别

BCELoss()和BCEWithLogitsLoss()都是PyTorch中常用的损失函数,主要用于二分类问题。但是它们的输入和处理方式有所不同。

  1. BCELoss():它的输入是模型对每个类别的概率,这些概率通常是通过对模型的原始输出进行sigmoid操作得到的。BCELoss()会直接计算二元交叉熵损失。
  2. BCEWithLogitsLoss():它的输入是模型对每个类别的原始分数(通常是最后一个全连接层的输出),并且这些分数没有经过任何归一化处理。BCEWithLogitsLoss()内部会对这些分数进行sigmoid操作,然后计算二元交叉熵损失。

总的来说,BCELoss()和BCEWithLogitsLoss()的主要区别在于它们的输入:BCELoss()期望的输入是模型的概率输出,而BCEWithLogitsLoss()期望的输入是模型的原始输出。在实际使用中,你可以根据自己的需求和模型的输出来选择使用哪一个损失函数。

另外,BCEWithLogitsLoss()在内部进行sigmoid和loss计算可以提高数值稳定性,因此在实际使用中,如果模型的输出是原始分数,推荐使用BCEWithLogitsLoss()。

回归损失函数中的reduction函数详解

它的完整定义是torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')。

下面是这些参数的解释:

  1. size_average(已弃用):如果设置为True,损失函数会对每个小批量的损失取平均值。如果设置为False,损失函数会对每个小批量的损失求和。默认值是True。这个参数已经被弃用,推荐使用reduction参数。
  2. reduce(已弃用):如果设置为True,损失函数会返回一个标量值,即所有输入元素的损失的平均值或总和(取决于size_average参数)。如果设置为False,损失函数会返回一个损失值的向量,每个元素对应一个输入数据点的损失。默认值是True。这个参数已经被弃用,推荐使用reduction参数。
  3. reduction:指定如何减少损失。可以是'none'(不减少,返回一个损失值的向量),'mean'(取平均,返回所有输入元素的损失的平均值)或'sum'(求和,返回所有输入元素的损失的总和)。默认值是'mean'。

nn.MSELoss()函数的输入是两个张量,分别代表预测值和目标值。它们必须有相同的形状。函数的输出是一个标量值,表示损失。

nn.SmoothL1Loss相比于nn.MSELoss损失函数的优点

  1. nn.MSELoss(均方误差损失)对于回归问题非常有效,但它对于异常值(outliers)非常敏感,因为它会将每个误差的平方进行求和。这意味着,即使只有一个样本的预测值与真实值相差很大,也会导致整体损失值显著增加。
  2. 而nn.SmoothL1Loss(平滑L1损失)则在处理异常值时更为鲁棒。它结合了L1损失和L2损失的优点:当预测值与真实值的差距较大时,它的行为类似于L1损失(即绝对值损失),对异常值不敏感;而当预测值与真实值接近时,它的行为类似于L2损失(即均方误差损失),可以更精细地优化模型。

因此,nn.SmoothL1Loss的一个主要优点是它可以在处理异常值和进行精细优化之间找到一个平衡,这在某些任务中可能是非常有用的。

nn.SmoothL1Loss是通过一个特定的数学公式来实现这个优点的。这个公式如下:

SmoothL1Loss(x, y) = 0.5 * (x - y)^2, if abs(x - y) < 1
                   = abs(x - y) - 0.5, otherwise

这个公式的含义是,当预测值和真实值的差距小于1时,使用平方误差损失(即L2损失);当差距大于或等于1时,使用绝对值误差损失(即L1损失)。

可以看到,当差距较小的时候,SmoothL1Loss的行为类似于nn.MSELoss,它会对这些小的误差进行精细优化。而当差距较大的时候,SmoothL1Loss的行为类似于L1损失,它不会对这些大的误差进行过度惩罚,从而提高了对异常值的鲁棒性。

这就是nn.SmoothL1Loss如何在处理异常值和进行精细优化之间找到平衡的。

nn.HuberLoss的作用

nn.HuberLoss也被称为Huber损失,是一种结合了均方误差损失(Mean Squared Error,MSE)和平均绝对误差损失(Mean Absolute Error,MAE)的损失函数。它在处理回归问题时,尤其是存在异常值(outliers)的情况下,表现出较好的性能。

Huber损失的计算公式如下:

HuberLoss(x, y) = 0.5 * (x - y)^2, if abs(x - y) < delta
                = delta * abs(x - y) - 0.5 * delta^2, otherwise

这个公式的含义是,当预测值和真实值的差距小于一个阈值delta时,使用平方误差损失(即MSE);当差距大于或等于delta时,使用线性误差损失(即MAE)。

与nn.SmoothL1Loss类似,nn.HuberLoss在处理异常值和进行精细优化之间找到了一个平衡。当预测误差较小的时候,它的行为类似于MSE,可以对这些小的误差进行精细优化;而当预测误差较大的时候,它的行为类似于MAE,不会对这些大的误差进行过度惩罚,从而提高了对异常值的鲁棒性。

另外,nn.HuberLoss的一个优点是它的梯度在整个定义域内都是有界的,这使得模型在训练过程中更稳定。

参考自:

pytorch中常用的损失函数用法说明 | w3cschool笔记

pytorch教程 (四)- 损失函数_pytorch对比损失-CSDN博客文章来源地址https://www.toymoban.com/news/detail-744679.html

到了这里,关于pytorch-损失函数-分类和回归区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【PyTorch】在PyTorch中使用线性层和交叉熵损失函数进行数据分类

    在机器学习的众多任务中,分类问题无疑是最基础也是最重要的一环。本文将介绍如何在PyTorch框架下,使用线性层和交叉熵损失函数来解决分类问题。我们将以简单的Iris数据集作为起点,探讨线性模型在处理线性可分数据上的有效性。随后,我们将尝试将同样的线性模型应

    2024年01月18日
    浏览(43)
  • Pytorch代码入门学习之分类任务(三):定义损失函数与优化器

    目录 一、定义损失函数 1.1 代码 1.2 损失函数简介 1.3 交叉熵误差(cross entropy error) 二、定义优化器 2.1 代码 2.2 构造优化器 2.3 随机梯度下降法(SGD)         神经网络的学习通过某个指标表示目前的状态,然后以这个指标为基准,寻找最优的权重参数。神经网络以某个指标

    2024年02月07日
    浏览(34)
  • 【吴恩达·机器学习】第三章:分类任务:逻辑回归模型(交叉熵损失函数、决策边界、过拟合、正则化)

    博主简介: 努力学习的22级计算机科学与技术本科生一枚🌸 博主主页: @Yaoyao2024 每日一言🌼: 勇敢的人,不是不落泪的人,而是愿意含着泪继续奔跑的人。 ——《朗读者》 本系列博客文章是博主本人根据吴恩达老师2022年的机器学习课程所学而写,主要包括老师的核心讲义

    2024年02月19日
    浏览(40)
  • YOLO物体检测-系列教程1:YOLOV1整体解读(预选框/置信度/分类任/回归任务/损失函数/公式解析/置信度/非极大值抑制)

    YOLOV1整体解读 YOLOV2整体解读 YOLOV1提出论文:You Only Look Once: Unified, Real-Time Object Detection two-stage(两阶段):Faster-rcnn Mask-Rcnn系列 one-stage(单阶段):YOLO系列 最核心的优势:速度非常快,适合做实时检测任务! 但是缺点也是有的,效果通常情况下不会太好! 机器学习 分类任

    2024年02月09日
    浏览(32)
  • 逻辑回归中的损失函数

            逻辑回归中的损失函数通常采用的是交叉熵损失函数(cross-entropy loss function)。在逻辑回归中,我们通常使用sigmoid函数将线性模型的输出转换为概率值,然后将这些概率值与实际标签进行比较,从而计算损失。         在逻辑回归解决二分类问题的学习中,我

    2024年01月22日
    浏览(26)
  • 损失函数篇 | YOLOv8 更换损失函数之 MPDIoU | 《2023 一种用于高效准确的边界框回归的损失函数》

    论文地址:https://arxiv.org/pdf/2307.07662v1.pdf 边界框回归(Bounding Box Regression,BBR)在目标检测和实例分割中得到了广泛应用,是目标定位的重要步骤。然而,对于边界框回归的大多数现有损失函数来说,当预测的边界框与真值边界框具有相同的长宽比,但宽度和高度的值完全不

    2024年02月15日
    浏览(34)
  • 【机器学习】P2 线性回归、损失函数与梯度下降

    线性回归简单的说就是线性函数; 线性回归属于机器学习 回归问题; 在线性回归建立的线性关系的模型中,假设目标变量和自变量之间存在一种线性关系,模型的目标是找到最佳的拟合线,是的模型对于未知的数据能够进行最准确的预测; 线性回归模型的一般形式为: y

    2023年04月08日
    浏览(29)
  • 神经网络中的损失函数(上)——回归任务

    神经网络是深度学习的基础。在神经网络中,损失函数和优化函数是两个非常重要的概念,它们共同决定了模型的性能和训练效果。本文将介绍神经网络中比较常用的损失函数。 损失函数是用于量化预测值与真实值之间误差大小的一个非负函数。数值越小表示损失越小,完美

    2024年01月19日
    浏览(26)
  • 【深度学习】分类损失函数解析

    在分类任务中,我们通常使用各种损失函数来衡量模型输出与真实标签之间的差异。有时候搞不清楚用什么,下面是几种常见的分类相关损失函数及其 解析,与代码示例 。 二元交叉熵损失(Binary Cross Entropy Loss,BCELoss): torch.nn.BCELoss() 是用于二元分类的损失函数。它将模型

    2024年02月09日
    浏览(40)
  • 目标检测--边框回归损失函数SIoU原理详解及代码实现

    1.1 原理 有关IoU损失函数,如(GIoU, DIoU, CIoU)没有考虑到真实框与预测框框之间的方向,导致收敛速度较慢,对此SIoU引入真实框和预测框之间的向量角度,重新定义相关损失函数,具体包含四个部分: (1)角度损失(Angle cost),定义如下 Λ = 1 − 2 ∗ sin ⁡ 2 ( arcsin ⁡ ( c h σ ) −

    2024年01月18日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包