【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(通用)或自定义周期性损失(角度)。
  • 多任务:加权求和或自适应不确定性加权。
相关推荐
进取星辰2 小时前
PyTorch 深度学习实战(30):模型压缩与量化部署
人工智能·pytorch·深度学习
小白的高手之路3 小时前
常用的卷积神经网络及Pytorch示例实现
人工智能·pytorch·python·深度学习·神经网络·cnn
ak啊5 小时前
PyTorch框架-Python GPU编程
pytorch·python·gpu
Infinity3438 小时前
复合分位回归的统计推断
回归
Francek Chen9 小时前
【现代深度学习技术】现代卷积神经网络06:残差网络(ResNet)
人工智能·pytorch·深度学习·神经网络·cnn·resnet
Mr.Winter`11 小时前
深度强化学习 | 基于优先级经验池的DQN算法(附Pytorch实现)
人工智能·pytorch·神经网络·机器学习·机器人·强化学习
Ronin-Lotus12 小时前
深度学习篇---模型参数调优
人工智能·pytorch·python·深度学习·paddlepaddle·batch·学习率
这就是编程14 小时前
自回归模型的新浪潮?GPT-4o图像生成技术解析与未来展望
人工智能·算法·机器学习·数据挖掘·回归
机器学习之心20 小时前
回归预测 | Matlab实现NRBO-Transformer-BiLSTM多输入单输出回归预测
matlab·回归·多输入单输出回归预测·transformer·bilstm·nrbo
weixin_478689761 天前
pytorch与其他ai工具
人工智能·pytorch·python