为什么我的二分类LSTM神经网络总是预测同一类别?
核心问题诊断
- 输出层激活函数选择错误
二分类任务仅配置1个输出神经元的场景下,使用softmax作为激活函数是完全错误的。softmax的逻辑是将所有输出值归一化到总和为1,当仅存在1个输出神经元时,无论输入是什么,该层的输出恒为1,这是你模型始终预测正类的直接原因。 - 优化器学习率设置过低
你给Adam优化器设置的学习率为1e-06,远低于该优化器默认的1e-3,过小的学习率会导致梯度更新极慢,模型长期处于未训练的状态,即便修复激活函数问题也会出现收敛极慢的情况。 - 可选补充检查点
- 检查输入特征是否做了归一化/标准化处理,数值范围过大会导致梯度爆炸或消失,影响模型收敛
- 验证标签编码是否正确,确认负类标签为0、正类标签为1,排除数据集标注异常的情况
代码修改方案
首先修正输出层激活函数,单神经元二分类场景需要使用sigmoid激活:
# 原错误代码 dense_3 = Dense(1, activation='softmax')(dense_2) # 修改后代码 dense_3 = Dense(1, activation='sigmoid')(dense_2)
调整优化器学习率到合理区间,可先使用1e-4测试收敛效果,再根据实际情况微调:
# 原错误代码 opt = Adam(lr=1e-06) # 修改后代码 opt = Adam(lr=1e-4)
如果需要进一步缓解类别不平衡的潜在影响,可在训练时传入类别权重参数:
class_weight = {0: 0.43, 1: 0.57} train_history = model.fit([Data_x_train], [Data_y_train], batch_size=batch_size, epochs=epochs, validation_data=(Data_x_val, Data_y_val), callbacks = callbacks, verbose = 2, class_weight=class_weight)
内容的提问来源于stack exchange,提问作者MRM
相关产品推荐
相关产品推荐

