【pytorch损失函数(7)】损失函数的选择需结合属性类型(分类/回归)、任务粒度(单标签/多标签)以及数据特性(类别平衡性)

在属性(如颜色、类型等)的监督学习中,损失函数的选择需结合属性类型(分类/回归)、任务粒度(单标签/多标签)以及数据特性(类别平衡性)。

文章目录

      • [1. 分类属性(如颜色、类型、方向)](#1. 分类属性(如颜色、类型、方向))
        • [(1) 单标签分类(互斥类别)](#(1) 单标签分类(互斥类别))
        • [(2) 多标签分类(非互斥类别)](#(2) 多标签分类(非互斥类别))
      • [2. 回归属性(如长度、曲率、角度)](#2. 回归属性(如长度、曲率、角度))
        • [(1) 连续值预测](#(1) 连续值预测)
        • [(2) 方向或角度预测](#(2) 方向或角度预测)
      • [3. 多任务联合训练](#3. 多任务联合训练)
        • [(1) 加权多损失融合](#(1) 加权多损失融合)
        • [(2) 自适应权重(如Uncertainty Weighting)](#(2) 自适应权重(如Uncertainty Weighting))
      • 总结

1. 分类属性(如颜色、类型、方向)

(1) 单标签分类(互斥类别)
  • 场景:每个属性仅属于一个类别(如车道颜色只能是红/绿/蓝中的一种)。
  • 推荐损失:
    • 交叉熵损失(Cross-Entropy Loss)
      标准分类损失,适用于类别平衡的数据。

      python 复制代码
      loss_fn = nn.CrossEntropyLoss(weight=class_weights)  # 可选类别权重
      loss = loss_fn(preds, gts)  # preds: [B, C], gts: [B](类别索引)
    • Focal Loss
      解决类别不平衡问题(如某些颜色样本极少)。

      python 复制代码
      loss_fn = FocalLoss(alpha=0.25, gamma=2.0)  # 抑制易分类样本的权重
(2) 多标签分类(非互斥类别)
  • 场景:属性可同时属于多个类别(如车道类型="虚线"+"黄色")。
  • 推荐损失:
    • 二元交叉熵(Binary Cross-Entropy, BCE)
      每个类别独立计算概率。

      python 复制代码
      loss_fn = nn.BCEWithLogitsLoss()  # 内置Sigmoid
      loss = loss_fn(preds, gts)  # preds/gts: [B, C](C为类别数)
    • Dice Loss
      适用于类别高度不平衡的分割任务(如罕见属性)。

      python 复制代码
      def dice_loss(pred, gt, smooth=1e-6):
          pred = torch.sigmoid(pred)
          intersection = (pred  gt).sum()
          return 1 - (2.  intersection + smooth) / (pred.sum() + gt.sum() + smooth)

2. 回归属性(如长度、曲率、角度)

(1) 连续值预测
  • 场景:需预测数值型属性(如车道长度、曲率半径)。
  • 推荐损失:
    • L1 Loss(MAE)
      对异常值鲁棒,输出更稳定。

      python 复制代码
      loss_fn = nn.L1Loss()
      loss = loss_fn(preds, gts)  # preds/gts: [B, 1]
    • Smooth L1 Loss
      结合L1和L2的优点,避免梯度爆炸。

      python 复制代码
      loss_fn = nn.SmoothL1Loss(beta=0.1)  # beta控制过渡区间
(2) 方向或角度预测
  • 场景:预测车道方向(0°~360°),需处理周期性。
  • 推荐损失:
    • Huber Loss for Angles
      将角度差转换为周期性误差。

      python 复制代码
      def angle_loss(pred, gt):
          diff = torch.abs(pred - gt)
          return torch.mean(torch.min(diff, 360 - diff))  # 最小化环形距离

3. 多任务联合训练

若需同时优化多个属性(如颜色+类型+方向),可采用:

(1) 加权多损失融合
python 复制代码
loss_weights = {'color': 1.0, 'type': 0.5, 'angle': 0.2}  # 手动调参
total_loss = sum(loss_weights[k]  loss_fn[k](preds[k], gts[k]) for k in loss_weights)
(2) 自适应权重(如Uncertainty Weighting)
python 复制代码
# 学习每个任务的不确定性权重
log_vars = nn.ParameterDict({k: nn.Parameter(torch.zeros(1)) for k in ['color', 'type']})
loss = sum(0.5  torch.exp(-log_vars[k])  loss_fn[k](preds[k], gts[k]) + log_vars[k] for k in log_vars)

  1. 类别不平衡:
    • 分类任务优先选择 Focal Loss 或加权 CrossEntropy
    • 回归任务使用 HuberSmooth L1
  2. 输出归一化:
    • 角度预测需归一化到 [0, 360] 或使用 sin/cos 编码。
  3. 多任务权衡:
    • 通过网格搜索或不确定性加权调整损失比例。

总结

  • 分类属性:CrossEntropy(平衡数据)或 Focal Loss(不平衡数据)。
  • 回归属性:Smooth L1(通用)或自定义周期性损失(角度)。
  • 多任务:加权求和或自适应不确定性加权。
相关推荐
weiwei228442 天前
神经网络模型导出及开放标准格式ONNX
pytorch·onnx
程序猿追11 天前
那个右下角的小数字怎么“卡”住我打字——我用 HarmonyOS 自己写了一个字数限制输入框
pytorch·华为·harmonyos
闵孚龙11 天前
《PyTorch 深度修炼》Dataset 和 DataLoader:数据如何喂给模型
人工智能·pytorch·python
老余捞鱼11 天前
线性回归实战:5步验证你的量化因子是否真有效
算法·金融·回归·线性回归·ai量化
bryant_meng11 天前
【VAE】From Pixels to Faces: Building a VAE from Scratch
pytorch·vae·log-sigma2·重参数
天行健,君子而铎11 天前
自适应分类·高准确率·可视化易用——运营商数据分类分级解决方案
大数据·分类
装不满的克莱因瓶11 天前
了解多标签图像分类方法——从Sigmoid输出到真实世界复杂视觉理解
人工智能·pytorch·python·深度学习·机器学习·分类·数据挖掘
冷小鱼11 天前
TensorFlow 2.21 进阶实战:从训练优化到生产部署的完整指南
人工智能·pytorch·python·tensorflow
冷小鱼12 天前
PyTorch 2.12 完全指南:从动态图到编译优化的深度学习框架演进
人工智能·pytorch·深度学习
IRevers12 天前
【大模型】Gemma4在ROCm和vLLM部署
人工智能·pytorch·深度学习·大模型·datawhale·vllm·amdev