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_average、reduce 和 reduction。size_average 和 reduce 用于确定是否对损失值进行平均和降维操作,reduction 则用于指定损失值的降维方式,默认为均值 'mean'。

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

1、nn.CrossEntropyLoss

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

nn.CrossEntropyLoss 是 PyTorch 中用于计算交叉熵损失的函数。它是将 nn.LogSoftmax 和 nn.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 函数和二分类交叉熵损失来计算损失值,并返回结果。可以通过设置参数来调整损失的计算方式、权重和忽略的类别,以满足实际需求。

相关推荐
田里的水稻10 分钟前
FA_CNN卷积神经网络七---优化器PyTorch
人工智能·pytorch·深度学习·神经网络·cnn
智能直播1 小时前
RK3518:1.5G 内存 + 8G 存储,如何跑起硬件编解码、Web、AI 识别、绿幕特效
前端·人工智能·5g
大模型真好玩1 小时前
初试短视频生成:豆包将我梦中的场景画出来了~
人工智能·agent·deepseek
梦想出海-Phoebe2 小时前
AI Agent能实现自主复制吗?Anthropic研究揭示模型部署与IoT设备安全问题
人工智能·物联网·安全
指针向南2 小时前
PDF转长图用什么?3种方法实测(2026)
图像处理·人工智能·计算机视觉·pdf
郝学胜-神的一滴2 小时前
AI 编程智能体 09:零门槛调用教程
人工智能·数据分析·自动化·numpy·pandas·量化投资
商业看点解说2 小时前
支持私有化部署的 AI 助手有哪些?把“私有化“拆成四层,排除一类常被错放的产品
大数据·人工智能
清华kenny2 小时前
安徽晓得养HIS系统适合哪类健康机构升级使用
大数据·人工智能·安徽晓得养
kyriewen2 小时前
我抽查了 6 万个 Skills:前排没几个真货
人工智能·程序员·ai编程
掘金酱2 小时前
【10.24 特别活动】AI 时代,程序员的新饭碗在哪里?
前端·人工智能·后端