PyTorch损失函数

一、损失函数是什么

损失函数:衡量模型输出与真实标签的差异

python 复制代码
class _Loss(Module):
    def __init__(self, size_average=None, reduce=None, reduction='mean'):
        """
        Loss函数的基类,定义了一些通用的属性和方法。
        参数:
        - size_average (bool, optional): 是否对损失值进行平均,默认为None。
        - reduce (bool, optional): 是否对损失值进行降维,默认为None。
        - reduction (str, optional): 损失值的降维方式,默认为'mean'。
        """
        super(_Loss, self).__init__()
        if size_average is not None or reduce is not None:
            self.reduction = _Reduction.legacy_get_string(size_average, reduce)
        else:
            self.reduction = reduction

这段代码定义了一个Loss函数的基类 _Loss,用于定义其他具体的损失函数。在初始化方法 __init__ 中,该基类接受三个可选参数:size_averagereducereductionsize_averagereduce 用于确定是否对损失值进行平均和降维操作,reduction 则用于指定损失值的降维方式,默认为均值 'mean'

基类 _Loss 的作用是提供了一些通用的属性和方法,其他具体的损失函数可以继承该基类,并根据自己的需求重写或添加特定的属性和方法。

1、nn.CrossEntropyLoss

功能: nn.LogSoftmax ()与nn.NLLLoss ()结合,进行交叉熵计算

nn.CrossEntropyLoss 是 PyTorch 中用于计算交叉熵损失的函数。它是将 nn.LogSoftmaxnn.NLLLoss 结合在一起使用的。

主要参数如下:

  • weight:各类别的损失权重,默认为 None。
  • ignore_index:忽略某个类别的索引,默认为 None。
  • reduction:计算模式,可选值为 'none''sum''mean'
    • 'none':逐个元素计算损失。
    • 'sum':所有元素的损失值求和,返回一个标量。
    • 'mean':所有元素的损失值求平均,返回一个标量。

nn.CrossEntropyLoss 适用于多分类问题,输入的预测值是经过 nn.LogSoftmax 处理后的,目标值是类别的索引。它将预测值与目标值进行比较,计算交叉熵损失,并返回损失值。可以通过设置参数来调整损失的计算方式和权重,以满足实际需求。







2、nn.NLLLoss

nn.NLLLoss 是 PyTorch 中用于计算负对数似然损失的函数。下面是该函数的主要参数说明:

  • weight:各类别的损失权重,默认为 None。可以使用一个 1D 张量来为每个类别指定不同的权重。如果设置为 None,则所有类别的权重都相等。
  • size_average:已弃用参数,不再使用。
  • ignore_index:忽略某个类别的索引,默认为 -100。在计算损失时,会忽略目标值中等于 ignore_index 的类别。
  • reduce:已弃用参数,不再使用。
  • reduction:计算模式,可选值为 'none''sum''mean'
    • 'none':逐个元素计算损失。
    • 'sum':所有元素的损失值求和,返回一个标量。
    • 'mean':所有元素的损失值求平均,返回一个标量。

nn.NLLLoss 的作用是实现负对数似然函数中的负号功能。它将预测值作为输入,目标值作为目标,计算负对数似然损失,并返回损失值。


3、nn.BCELoss

nn.BCELoss 是 PyTorch 中用于计算二分类交叉熵损失的函数。下面是该函数的主要参数说明:

  • weight:各类别的损失权重,默认为 None。可以使用一个 1D 张量来为每个类别指定不同的权重。如果设置为 None,则所有类别的权重都相等。
  • ignore_index:忽略某个类别的索引,默认为 None。在计算损失时,会忽略目标值中等于 ignore_index 的类别。
  • reduction:计算模式,可选值为 'none''sum''mean'
    • 'none':逐个元素计算损失。
    • 'sum':所有元素的损失值求和,返回一个标量。
    • 'mean':所有元素的损失值求平均,返回一个标量。

需要注意的是,nn.BCELoss 的输入值应该在 [0, 1] 的范围内,表示二分类任务中的概率值。该函数将预测值和目标值进行比较,计算二分类交叉熵损失,并返回损失值。可以通过设置参数来调整损失的计算方式、权重和忽略的类别,以满足实际需求。


4、 nn.BCEWithLogitsLoss

nn.BCEWithLogitsLoss 是结合了 Sigmoid 函数和二分类交叉熵损失的函数,并且在计算损失时,输入的网络输出值不需要经过 Sigmoid 函数。

下面是 nn.BCEWithLogitsLoss 的主要参数说明:

  • pos_weight:正样本的权重,默认为 None。可以使用一个标量或与目标张量形状相同的张量来为正样本指定不同的权重。如果设置为 None,则所有样本的权重都相等。
  • weight:各类别的损失权重,默认为 None。可以使用一个 1D 张量来为每个类别指定不同的权重。如果设置为 None,则所有类别的权重都相等。
  • ignore_index:忽略某个类别的索引,默认为 None。在计算损失时,会忽略目标值中等于 ignore_index 的类别。
  • reduction:计算模式,可选值为 'none''sum''mean'
    • 'none':逐个元素计算损失。
    • 'sum':所有元素的损失值求和,返回一个标量。
    • 'mean':所有元素的损失值求平均,返回一个标量。

需要注意的是,在使用 nn.BCEWithLogitsLoss 时,网络的最后一层不需要加上 Sigmoid 函数,因为该函数内部会自动将输入通过 Sigmoid 函数进行处理。nn.BCEWithLogitsLoss 将结合 Sigmoid 函数和二分类交叉熵损失来计算损失值,并返回结果。可以通过设置参数来调整损失的计算方式、权重和忽略的类别,以满足实际需求。

相关推荐
Forrit3 小时前
ptyorch安装
pytorch
腾讯云开发者4 小时前
港科大熊辉|AI时代的职场新坐标——为什么你应该去“数据稀疏“的地方?
人工智能
工程师老罗4 小时前
YoloV1数据集格式转换,VOC XML→YOLOv1张量
xml·人工智能·yolo
yLDeveloper4 小时前
从模型评估、梯度难题到科学初始化:一步步解析深度学习的训练问题
深度学习
喵手4 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
Coder_Boy_4 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_944934734 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
啊森要自信4 小时前
CANN ops-cv:面向计算机视觉的 AI 硬件端高效算子库核心架构与开发逻辑
人工智能·计算机视觉·架构·cann
helloworldandy4 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python