基于Keras CNN的多标签专辑封面分类训练指标停滞问题咨询
可能的原因排查
首先排除你提到的两个可能性:
- 指标实现没有问题:你用到的
HammingLoss和subset_accuracy是多标签分类场景下的标准评估方式,代码实现符合官方和通用实现规范,不存在使用错误。 - 基本可以排除Dying ReLU问题:如果是ReLU神经元大量死亡,你会观察到损失也同步陷入停滞甚至上升,不会出现损失仍在下降但指标不动的情况。
核心诱因和解决方案
1. 数据增强强度过高,引入无效噪声
你当前的增强策略里加入了垂直翻转、0.4幅度的旋转、最高0.6倍的缩放,而专辑封面本身是有固定语义方向的,垂直翻转、大角度旋转会把封面文字、构图完全打乱,属于无意义的噪声,反而会阻碍模型学习有效特征。
调整建议:
data_augmentation = keras.Sequential( [ layers.RandomFlip("horizontal", input_shape=(img_height, img_width, 3)), layers.RandomRotation(0.1), layers.RandomZoom(0.1) ] )
去掉垂直翻转,把旋转、缩放幅度控制在0.1以内,保留有意义的增强效果。
2. 固定0.5阈值不适配数据集分布
多标签分类默认用0.5作为分类阈值是非常粗糙的策略,如果你的数据集存在类别不平衡,样本量少的类别模型预测的最高概率可能都达不到0.5,永远不会被判定为正类,指标自然会陷入停滞。
调整建议:训练完成后针对验证集每个类别单独绘制PR曲线,选择F1值最高的点作为该类别的专属阈值,替换全局0.5阈值。
3. 类别不平衡导致损失被多数类主导
音乐风格分类数据集天然存在不平衡问题,流行、摇滚类样本量通常远大于爵士、嘻哈类,普通的二元交叉熵损失会被多数类主导,模型只需要猜对多数类就能拿到不错的损失值,不会继续优化少数类的预测效果。
调整建议:
- 统计每个类别的样本量,给损失函数加上类别权重,样本量越少权重越高
- 换成Focal Loss作为损失函数,自动降低易分类样本的权重,让模型更关注难分类的少数样本:
def focal_loss(y_true, y_pred, alpha=0.8, gamma=2): y_pred = tf.clip_by_value(y_pred, 1e-7, 1 - 1e-7) cross_entropy = -y_true * tf.math.log(y_pred) - (1 - y_true) * tf.math.log(1 - y_pred) loss = alpha * tf.pow(1 - y_pred, gamma) * cross_entropy return tf.reduce_mean(loss)
编译模型时用该损失替换默认的binary_crossentropy。
4. 模型容量不足缺少正则化
你当前的自定义卷积模型容量有限,且没有加入正则化策略,容易在学完基础特征后进入瓶颈,同时可能发生轻微过拟合,导致指标不再提升。
调整建议:
- 在每个卷积层和全连接层后加入
BatchNormalization层加速收敛,加入Dropout层防止过拟合 - 条件允许的情况下改用迁移学习,加载ResNet50、EfficientNet等在ImageNet上预训练的主干网络,冻住底层权重后训练分类头,特征提取能力会远高于自定义的小模型。
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

