Keras微调人脸情绪识别模型部分类别敏感度为0如何优化?
人脸情绪识别模型低敏感度类别优化方案
1. 数据层面优化
- 先校验低敏感度类别(对应你的Class2、Class5、Class6)的标注质量,排查是否存在大面积标注错误、歧义样本,这类标注问题是class weight无法解决的,错误标注的样本会让模型始终学不到对应类别特征。
- 对低敏感度类别做定向数据增强:不要使用全局统一的增强策略,针对这三类单独做人脸对齐、随机局部遮挡、光照变换、表情幅度微调等针对性增强,扩充有效训练样本量,效果远好于单纯的类别权重调整。
- 尝试定向过采样策略:对低敏感度类别样本做重复采样,搭配随机增强避免过拟合,比class weight的软加权更直接,你可以用
tf.data.Dataset的sample_from_datasets接口实现不同类别的采样比例控制,比如给三类低敏类别设置2-3倍的采样权重。
2. 损失函数与训练策略优化
- 替换交叉熵损失为焦点损失(Focal Loss),它会自动降低易分类样本(你这里占比最高、识别效果最好的Class1)的损失权重,强制模型关注难分类的低敏类别,Keras自定义实现代码参考:
import tensorflow as tf def focal_loss(y_true, y_pred, alpha=0.25, gamma=2.0): y_pred = tf.clip_by_value(y_pred, 1e-7, 1 - 1e-7) cross_entropy = -y_true * tf.math.log(y_pred) loss = alpha * tf.pow(1 - y_pred, gamma) * cross_entropy return tf.reduce_sum(loss, axis=-1)
- 增加类别敏感度相关的度量作为训练监控指标,训练时同时监控每类的
sensitivity或召回率,可搭配多任务学习策略,把表情的极性(正/中/负情绪)作为辅助分类头,先让模型学会区分情绪大类别,再细化到7个细分类别,降低小类的学习难度。 - 调低模型学习率,当前你遇到的情况大概率是模型陷入了局部最优,只学会了识别占比高的类别,把学习率降到原来的1/5到1/10,继续微调10-20个epoch,给模型留出学习小众类别特征的空间。
3. 预测后处理优化
- 调整分类阈值,默认的0.5阈值对不平衡类别不友好,你可以根据验证集的各类别召回率,单独给低敏类别设置更低的分类阈值,牺牲少量整体准确率换取低敏类别的敏感度提升。
内容的提问来源于stack exchange,提问作者User Tester
相关产品推荐
相关产品推荐

