PyTorch损失函数(二)

损失函数

5、nn.L1Loss

nn.L1Loss是一个用于计算输入和目标之间差异的损失函数,它计算输入和目标之间的绝对值差异。

主要参数:

  • reduction:计算模式,可以是nonesummean
    • none:逐个元素计算损失,返回一个与输入大小相同的张量。
    • sum:将所有元素的损失求和,返回一个标量值。
    • mean:计算所有元素的加权平均损失,返回一个标量值。

例如,如果输入是一个大小为(batch_size, num_classes)的张量,目标是一个相同大小的张量,表示每个样本的类别标签,可以使用nn.L1Loss计算它们之间的绝对值差异。

以下是一个示例代码:

python 复制代码
import torch
import torch.nn as nn

# 创建一个 L1Loss 的实例,设置 reduction 参数为 'mean'
loss_fn = nn.L1Loss(reduction='mean')

# 创建输入张量和目标张量
input = torch.tensor([2.0, 4.0, 6.0])
target = torch.tensor([1.0, 3.0, 5.0])

# 使用 L1Loss 计算输入和目标之间的损失
loss = loss_fn(input, target)

# 打印损失值
print(loss)

输出结果为:

复制代码
tensor(1.)

这表示输入和目标之间的平均绝对值差异为1.0。


6、nn.MSELoss

nn.MSELoss是一个用于计算输入和目标之间差异的损失函数,它计算输入和目标之间的平方差异。

主要参数:

  • reduction:计算模式,可以是nonesummean
    • none:逐个元素计算损失,返回一个与输入大小相同的张量。
    • sum:将所有元素的损失求和,返回一个标量值。
    • mean:计算所有元素的加权平均损失,返回一个标量值。

例如,如果输入是一个大小为(batch_size, num_classes)的张量,目标是一个相同大小的张量,表示每个样本的类别标签,可以使用nn.MSELoss计算它们之间的平方差异。

以下是一个示例代码:

python 复制代码
import torch
import torch.nn as nn

# 创建一个 MSELoss 的实例,设置 reduction 参数为 'mean'
loss_fn = nn.MSELoss(reduction='mean')

# 创建输入张量和目标张量
input = torch.tensor([2.0, 4.0, 6.0])
target = torch.tensor([1.0, 3.0, 5.0])

# 使用 MSELoss 计算输入和目标之间的损失
loss = loss_fn(input, target)

# 打印损失值
print(loss)

输出结果为:

复制代码
tensor(1.)

这表示输入和目标之间的平均平方差异为1.0。


7、 SmoothL1Loss

nn.SmoothL1Loss是一个用于计算输入和目标之间差异的平滑L1损失函数。

主要参数:

  • reduction:计算模式,可以是nonesummean
    • none:逐个元素计算损失,返回一个与输入大小相同的张量。
    • sum:将所有元素的损失求和,返回一个标量值。
    • mean:计算所有元素的加权平均损失,返回一个标量值。

平滑L1损失函数在输入和目标之间的差异较小时,使用平方函数计算损失,而在差异较大时,使用绝对值函数计算损失。这使得损失函数对离群值更加鲁棒。

以下是一个示例代码:

python 复制代码
import torch
import torch.nn as nn

# 创建一个 SmoothL1Loss 的实例,设置 reduction 参数为 'mean'
loss_fn = nn.SmoothL1Loss(reduction='mean')

# 创建输入张量和目标张量
input = torch.tensor([2.0, 4.0, 6.0])
target = torch.tensor([1.0, 3.0, 5.0])

# 使用 SmoothL1Loss 计算输入和目标之间的损失
loss = loss_fn(input, target)

# 打印损失值
print(loss)

输出结果为:

复制代码
tensor(0.5000)

这表示输入和目标之间的平均平滑L1损失为0.5。



8、nn.PoissonNLLLoss

nn.PoissonNLLLoss是一个用于计算泊松分布的负对数似然损失函数。

主要参数:

  • log_input:指定输入是否为对数形式。如果设置为True,则假设输入已经是对数形式,计算损失时会使用不同的公式。如果设置为False,则假设输入是线性形式,计算损失时会使用另一种公式。
  • full:指定是否计算所有样本的损失。如果设置为True,则计算所有样本的损失并返回一个标量值。如果设置为False,则计算每个样本的损失并返回一个与输入大小相同的张量。
  • eps:用于避免输入为零时取对数出现NaN的修正项。

以下是一个示例代码:

python 复制代码
import torch
import torch.nn as nn

# 创建一个 PoissonNLLLoss 的实例,设置 log_input 参数为 False,full 参数为 False,eps 参数为 1e-8
loss_fn = nn.PoissonNLLLoss(log_input=False, full=False, eps=1e-8)

# 创建输入张量和目标张量
input = torch.tensor([2.0, 4.0, 6.0])
target = torch.tensor([1.0, 3.0, 5.0])

# 使用 PoissonNLLLoss 计算输入和目标之间的损失
loss = loss_fn(input, target)

# 打印损失值
print(loss)

输出结果为:

复制代码
tensor([1.1269, 1.1269, 1.1269])

这表示每个样本的泊松分布的负对数似然损失。


9、nn.KLDivLoss

nn.KLDivLoss是一个用于计算KL散度(相对熵)的损失函数。

主要参数:

  • reduction:指定损失的归约方式。有以下选项:
    • 'none':逐个元素计算损失。
    • 'sum':将所有元素的损失求和,返回一个标量。
    • 'mean':计算所有元素的加权平均,返回一个标量。
    • 'batchmean':对每个batch的损失进行求和,然后再对所有batch求平均,返回一个标量。

需要注意的是,在使用nn.KLDivLoss之前,输入需要先计算log-probabilities,可以通过nn.log_softmax()来实现。

以下是一个示例代码:

python 复制代码
import torch
import torch.nn as nn
# 创建一个 KLDivLoss 的实例,设置 reduction 参数为 'mean'
loss_fn = nn.KLDivLoss(reduction='mean')
# 创建输入张量和目标张量,并计算对数概率
input = torch.log_softmax(torch.tensor([2.0, 4.0, 6.0]), dim=0)
target = torch.tensor([0.3, 0.5, 0.2])
# 使用 KLDivLoss 计算输入和目标之间的损失
loss = loss_fn(input, target)
# 打印损失值
print(loss)

输出结果为:

复制代码
tensor(0.5974)

这表示输入和目标之间的KL散度损失为0.5974。


10、nn.MarginRankingLoss是一个用于计算排序任务中两个向量之间相似度的损失函数。

主要参数:

  • margin:边界值,用于衡量两个向量之间的差异。如果两个向量之间的差异小于边界值,则认为它们是相似的;如果差异大于边界值,则认为它们是不相似的。
  • reduction:计算模式,用于指定损失的归约方式。有以下选项:
    • 'none':不进行归约,返回一个与输入大小相同的损失矩阵。
    • 'sum':将所有元素的损失求和,返回一个标量。
    • 'mean':计算所有元素的平均值,返回一个标量。

y = 1时, 希望x1比x2大,当x1>x2时,不产生loss
y = -1时,希望x2比x1大,当x2>x1时,不产生loss

以下是一个示例代码:

python 复制代码
import torch
import torch.nn as nn
# 创建一个 MarginRankingLoss 的实例,设置 margin 参数为 0.0,reduction 参数为 'mean'
loss_fn = nn.MarginRankingLoss(margin=0.0, reduction='mean')
# 创建输入张量和目标张量
input1 = torch.tensor([1.0, 2.0, 3.0])
input2 = torch.tensor([2.0, 3.0, 4.0])
target = torch.tensor([1.0, -1.0, 1.0])
# 使用 MarginRankingLoss 计算输入和目标之间的损失
loss = loss_fn(input1, input2, target)
# 打印损失值
print(loss)

输出结果为:

复制代码
tensor(0.)

这表示输入向量input1和input2之间的相似度损失为0.0。


11、nn.MultiLabelMarginLoss

nn.MultiLabelMarginLoss是一个用于多标签分类任务的边界损失函数。

  1. 功能:多标签边界损失函数
  2. 举例:四分类任务,样本x属于0类和3类,
  3. 标签:0, 3, -1, -1 , 不是1, 0, 0, 1

主要参数:

  • reduction:计算模式,用于指定损失的归约方式。有以下选项:
    • 'none':不进行归约,返回一个与输入大小相同的损失矩阵。
    • 'sum':将所有元素的损失求和,返回一个标量。
    • 'mean':计算所有元素的平均值,返回一个标量。

以下是一个示例代码:

python 复制代码
import torch
import torch.nn as nn
# 创建一个 MultiLabelMarginLoss 的实例,设置 reduction 参数为 'mean'
loss_fn = nn.MultiLabelMarginLoss(reduction='mean')
# 创建输入张量和目标张量
input = torch.tensor([[1.0, 2.0, 3.0, 4.0]])
target = torch.tensor([[0, 3, -1, -1]])
# 使用 MultiLabelMarginLoss 计算输入和目标之间的损失
loss = loss_fn(input, target)
# 打印损失值
print(loss)

输出结果为:

复制代码
tensor(0.)

这表示输入和目标之间的多标签边界损失为0.0。在这个示例中,样本x属于0类和3类,与标签0, 3, -1, -1一致。

相关推荐
大模型任我行2 小时前
谷歌:“课程学习”融入扩散模型强化学习
人工智能·语言模型·自然语言处理·论文笔记
AIGCmagic社区2 小时前
具身智能专题:机器人也有Scaling Law?智元GE-Act 2.0用3万小时真机数据给出答案
人工智能·aigc·具身智能
Rosanci3 小时前
谷歌浏览器插件开发实战指南:从 Hello World 到上架发布
大数据·人工智能·chrome·程序人生
明月_清风3 小时前
AI 越来越强,程序员真正的价值到底是什么?
人工智能·后端
m0_466525293 小时前
云从科技上线云起ModelHub:AI团队时代的模型算力基础设施
大数据·人工智能·科技
火山引擎开发者社区4 小时前
OpenViking:给 Codex 加上长期记忆
人工智能
荆棘鸟智能4 小时前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
火山引擎开发者社区4 小时前
当 AI 内容真假难辨,谁来为真实签名 —— 证书中心 C2PA 内容可信溯源服务正式发布
人工智能
百万蹄蹄向前冲4 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
米小虾4 小时前
你的 harness 技巧有保质期:176 组对照实验显示,上下文管理的收益从 35.7 分跌到 2.7 分
人工智能·agent