TensorFlow自定义二分类模型预测时第二类得分异常偏高问题
问题诊断与修复方案
核心问题1:损失函数参数不匹配
模型最后一层使用了softmax激活,但损失函数SparseCategoricalCrossentropy设置了from_logits=True,这是错误的。from_logits=True仅适用于未经过激活函数(如softmax/sigmoid)的原始输出,当前设置会导致损失计算逻辑混乱,模型实际学习目标偏移。
修复代码:
lossFn = tf.keras.losses.SparseCategoricalCrossentropy() # 或显式设置from_logits=False,默认值即为False lossFn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
核心问题2:学习率过高
你注释了学习率调度逻辑,但RMSprop默认学习率为0.001,而你定义的初始学习率0.3远超合理范围,过高的学习率会导致模型训练时权重震荡,无法收敛到有效特征,最终只能随机偏向某一类。
修复代码:
使用合理初始学习率,或启用注释的学习率调度:
initial_learning_rate = 0.001 decay_steps = 1000 decay_rate = 0.5 learning_rate_fn = tf.keras.optimizers.schedules.InverseTimeDecay(initial_learning_rate, decay_steps, decay_rate) model.compile(optimizer=tf.keras.optimizers.RMSprop(learning_rate=learning_rate_fn), loss=lossFn, metrics='accuracy')
关键数据预处理缺失
图像数据通常是0-255的整数范围,直接输入模型会导致ReLU激活函数快速饱和,模型无法有效提取特征,需要将数据归一化到0-1区间。
修复代码:在getDataset和getTestSet中添加归一化步骤:
# 在getDataset中 trainData = data['img'] / 255.0 # 在getTestSet中 testData = data['img'] / 255.0
其他排查方向
- 数据集平衡性:检查训练集、测试集中两类样本的数量占比,如果第二类样本占比极高,模型会自然偏向预测该类,需通过数据增强或类别权重调整优化。
- 标签正确性:确认
trainLabels和testLabels的取值为0和1(符合SparseCategoricalCrossentropy的输入要求),无标签值错误情况。
修复后验证流程
- 重新训练模型,观察训练准确率、损失是否稳定下降
- 训练时加入验证集(从训练集中拆分一部分),监控
val_accuracy,确认模型无过拟合/欠拟合问题 - 再次评估测试集,查看预测结果是否不再全偏向第二类
内容的提问来源于stack exchange,提问作者Ice Wind
相关产品推荐
相关产品推荐

