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

相关推荐
qq_189807034 分钟前
golang如何实现日志按级别过滤_golang日志按级别过滤实现教程
jvm·数据库·python
abc123456sdggfd4 分钟前
Golang map底层实现原理_Golang map哈希表原理教程【经典】
jvm·数据库·python
yaoxin5211239 分钟前
391. Java 文件操作基础 - 方法链式调用
java·开发语言·python
淡海水10 分钟前
【AI模型】概念-Token
人工智能·算法
justjinji12 分钟前
JavaScript中利用宏任务拆分阻塞任务的实操案例
jvm·数据库·python
weixin_4087177714 分钟前
c++如何实现跨平台的文件读写进度监听器回调机制【实战】
jvm·数据库·python
一铭1119916 分钟前
gpt-claude-gemini 超级大模型安装使用教程
java·python·gpt·ai编程·claude·gemini
数智化精益手记局16 分钟前
什么是安全生产?解读安全生产的基本方针与核心要求
大数据·运维·人工智能·安全·信息可视化·自动化·精益工程
ManThink Technology17 分钟前
KS31 4-20mA 模拟量采集器通过LoRaWAN 接入ThinkLink
人工智能·物联网
Zzj_tju17 分钟前
大语言模型部署实战:生产环境怎么做高并发、监控、限流与故障恢复?
人工智能·语言模型·自然语言处理