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]一致。

相关推荐
武汉知识图谱科技10 小时前
神经符号AI+视觉识别:桥梁吊机自主作业效率翻倍
人工智能·计算机视觉·知识图谱
2501_9458374310 小时前
OpenClaw:让 AI 从 “会说” 到 “会做” 的开源智能体框架
人工智能
AI产品测评官10 小时前
2026年AI招聘软件试用防坑指南:世纪云猎199元全功能体验方案深度测评
大数据·人工智能
bryant_meng10 小时前
【Autonomous Driving】Shadow Mode and Imitation Learning
人工智能·计算机视觉·监督学习·模仿学习·影子模式
享客多网络10 小时前
2026年滨海新区GEO获客公司,本地企业增长新引擎
人工智能·python
渡难繁辰10 小时前
ChCode: Python 7000 行代码手搓了一个终端 Coding Agent
人工智能
AI品信智慧数智人10 小时前
你的五一小长假,有AI伴游助手陪伴吗?
人工智能
dinl_vin10 小时前
LangChain 系列·(六):RAG 评估——你怎么知道它够好?
人工智能·langchain
玩转单片机与嵌入式10 小时前
别再只把 MCU 当控制器:新一代芯片正在把 AI 推理搬到设备端
人工智能·单片机·嵌入式硬件
kabuto_hui10 小时前
【大模型系列】DLLM与Block Diffusion的区别与联系
人工智能·大模型