【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(通用)或自定义周期性损失(角度)。
  • 多任务:加权求和或自适应不确定性加权。
相关推荐
F_D_Z2 小时前
岭回归(Ridge Regression)辨析
回归·kotlin·l2正则
Hello.Reader3 小时前
Flink ML KNN 入门基于 Table API 的近邻分类
机器学习·分类·flink
山海青风4 小时前
人工智能基础与应用 - 数据处理、建模与预测流程 7 基础模型之回归模型
人工智能·数据挖掘·回归
智算菩萨8 小时前
【Python机器学习】回归模型评估指标深度解析:MAE、MSE、RMSE与R²的理论与实践
python·机器学习·回归
智算菩萨8 小时前
【Python机器学习】分类模型评估体系的全景解析:准确率、精确率、召回率、F1 分数与 AUC
python·机器学习·分类
计算机毕设指导68 小时前
基于微信小程序图像识别的智能垃圾分类系统【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·分类·maven
熬夜敲代码的小N9 小时前
AI文本分类实战:从数据预处理到模型部署全流程解析
人工智能·分类·数据挖掘
natide10 小时前
表示/嵌入差异-1-欧几里得距离(Euclidean Distance)-L2 距离(L2 distance)-欧式距离的标准化
人工智能·pytorch·python·深度学习·算法·自然语言处理
Pyeako11 小时前
深度学习--CUDA安装配置、pytorch库、torchvision库、torchaudio库安装
人工智能·pytorch·python·深度学习·gpu·cuda
Hello.Reader11 小时前
Flink ML 二分类评估器 BinaryClassificationEvaluator AUC、PR-AUC、KS 一次搞懂
大数据·分类·flink