You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多标签不平衡图像分类:损失函数、效果评估与优化咨询

多标签图像分类任务问题咨询

我正在开展一项包含5个类别的多标签图像分类任务,采用了如下加权交叉熵(weighted cross entropy)损失函数,并得到了测试集的分类报告,现提出以下技术问题:

  1. 该损失函数针对不平衡数据集的多标签图像分类是否有效、合理?
  2. 这份分类报告的表现如何?例如标签0的precision为0.06、recall为0.75,这样的结果是否合理?应重点关注accuracy、precision、recall还是f1 score?
  3. 标签4的学习效果良好,但标签1、2、3效果较差,请问原因是什么,如何优化这三类的分类效果?

损失函数代码

def loss_fn(y_true,y_pred):
    loss = 0

    loss -= (float(positive_weights[0]*y_true[0])*K.log(y_pred[0]) + float(negative_weights[0]*(1-y_true[0]))*K.log(1-y_pred[0]))
    loss -= (float(positive_weights[1]*y_true[1])*K.log(y_pred[1]) + float(negative_weights[1]*(1-y_true[1]))*K.log(1-y_pred[1]))
    loss -= (float(positive_weights[2]*y_true[2])*K.log(y_pred[2]) + float(negative_weights[2]*(1-y_true[2]))*K.log(1-y_pred[2]))
    loss -= (float(positive_weights[3]*y_true[3])*K.log(y_pred[3]) + float(negative_weights[3]*(1-y_true[3]))*K.log(1-y_pred[3]))
    loss -= (float(positive_weights[4]*y_true[4])*K.log(y_pred[4]) + float(negative_weights[4]*(1-y_true[4]))*K.log(1-y_pred[4]))
    loss = float(loss)
    return loss

测试集分类报告

precision    recall  f1-score   support

       0       0.06      0.75      0.11       347
       1       0.05      0.43      0.09       314
       2       0.05      0.42      0.08       286
       3       0.16      0.39      0.23      1017
       4       0.78      1.00      0.88      4867
macro avg       0.22      0.60      0.28      6831
weighted avg       0.59      0.84      0.67      6831
 samples avg       0.38      0.87      0.50      6831

问题解答

1. 加权交叉熵损失函数的有效性与合理性

从代码逻辑看,你实现的是针对每个标签分别设置正负样本权重的加权交叉熵,这个思路本身适配不平衡多标签任务——多标签场景下每个标签的正负样本分布可能独立失衡,给每个标签单独分配权重能针对性修正损失偏向。

但存在几个细节问题:

  • 代码写法冗余:可以用循环遍历标签,避免重复5次相同逻辑,减少出错概率;
  • float()强制转换可能带来精度损失:Keras的张量运算不需要手动转成float,直接用张量运算即可;
  • 权重计算逻辑未知:如果positive_weights和negative_weights是基于每个标签的正负样本比例(比如正样本权重=总样本数/(2*正样本数)),那这个损失是合理的;但如果权重设置随意,反而会加剧失衡。

总体来说,思路方向正确,但实现细节可以优化。

2. 分类报告表现分析

整体表现

模型严重偏向标签4(样本量占比超70%),加权指标被标签4拉高,但小样本标签(0、1、2、3)的表现极差,模型整体泛化能力不足。

标签0的结果合理性

标签0的recall=0.75说明模型能识别出75%的真实标签0样本,但precision=0.06意味着每100个被预测为0的样本里只有6个是真的——这是不平衡数据集下模型为提高recall大量误判的典型表现:因为标签0样本少,模型随便猜0能覆盖大部分真样本,但会把大量非0样本误判成0,导致precision暴跌。这个结果合理,但完全不符合实际使用需求。

指标选择

多标签+不平衡场景下:

  • accuracy毫无参考价值:样本失衡时,模型只预测占比高的标签就能得到高accuracy;
  • 优先看F1-score:它是precision和recall的调和平均,能综合反映模型对每个标签的分类质量;
  • 其次关注recall和precision的平衡:如果业务要求不能漏检(比如医疗影像),可侧重recall;如果要求误判少,侧重precision。

3. 标签1、2、3效果差的原因与优化方案

核心原因

  1. 样本量严重不足:标签1、2、3的support分别是314、286、1017,远低于标签4的4867,模型学习到的特征不足;
  2. 损失权重可能不合理:如果权重未根据样本比例调整,损失会被标签4主导,模型优先学习标签4的特征;
  3. 特征提取偏向:模型可能只学到标签4的通用特征,对小样本标签的独特特征捕捉不足;
  4. 阈值设置问题:多标签任务通常用0.5作为分类阈值,但小样本标签可能需要调整阈值来平衡precision和recall。

优化方案

  • 数据层面:
    • 对标签1、2、3的样本做数据增强:比如翻转、裁剪、色彩扰动等,扩充有效样本量;
    • 采用重采样:对小样本标签的正样本过采样,或对标签4的样本欠采样(欠采样需注意不要丢失关键特征);
  • 损失与模型层面:
    • 改用Focal Loss:降低易分类样本(标签4的大量样本)的损失权重,让模型更关注难分类的小样本标签;
    • 验证权重计算:确保positive_weights是根据每个标签的正样本占比计算的,比如positive_weights[i] = total_samples / (2 * positive_samples[i]),negative_weights[i] = total_samples / (2 * negative_samples[i]);
    • 采用迁移学习:用预训练模型(比如ResNet、EfficientNet)做特征提取,冻结部分层仅微调顶层,让模型利用通用图像特征学习小样本标签特征;
  • 推理层面:
    • 针对每个标签单独调整分类阈值:比如标签0可提高阈值,减少误判、提升precision;
  • 训练策略:
    • 采用类别平衡采样:每个batch中保证各个标签的正负样本比例尽量均衡,避免batch被标签4主导;
    • 早停策略:监控小样本标签的F1-score,避免模型过拟合到标签4。

内容的提问来源于stack exchange,提问作者joy_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:45:32