Keras搭建的LSTM模型验证准确率为0且损失为nan,该如何排查解决?
问题根因
- 最后一层激活函数与输出单元数不匹配:你最后一层全连接层仅配置1个单元,却使用
softmax激活函数。softmax会将所有输出单元的结果归一化为总和为1的概率分布,单单元场景下无论输入是什么,输出永远为1,完全无法输出有效分类结果,直接导致准确率恒为0。 - 损失函数与任务场景不匹配:当前使用的
sparse_categorical_crossentropy是多分类任务专用损失函数,要求输出单元数对应分类数量(至少为2),和1个输出单元的场景完全不契合,会导致损失计算逻辑错误。 - 损失计算异常触发nan:损失计算逻辑错误会直接导致梯度计算异常,出现梯度爆炸/消失,最终loss变为nan,模型完全无法学习,所以训练和验证的准确率始终为0。
解决思路
根据你的任务类型选择对应修改方案:
- 若为二分类任务:
- 将最后一层的激活函数从
softmax改为sigmoid - 将损失函数从
sparse_categorical_crossentropy改为binary_crossentropy
- 将最后一层的激活函数从
- 若为回归任务:
- 去掉最后一层的激活函数,直接使用默认线性输出
- 将损失函数改为
mean_squared_error,评估指标更换为MAE等回归类指标,无需使用准确率
- 额外优化项:
- 确认输入特征是否做了归一化处理,未归一化的特征也容易触发梯度异常导致loss为nan
- 可将Dropout比例调整到0.2-0.3区间,当前0.02的Dropout几乎没有正则效果
- 修改后如果依然出现nan,可在优化器配置中添加梯度裁剪参数
clipnorm=1.0,避免梯度爆炸 - 检查标签数据是否存在空值、超出合理范围的异常值
内容的提问来源于stack exchange,提问作者Dhruba
相关产品推荐
相关产品推荐

