You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Keras训练精度下降及相关问题咨询:精度丢失、NaN损失等

针对你的模型训练问题解答

1. 训练后期精度暴跌+Loss出现NaN的原因

Loss显示nan本质是训练过程中出现了数值不稳定,这是导致你后期精度崩盘的核心原因,常见触发场景有这些:

  • 学习率过高:如果学习率设置得太大,参数更新的幅度会超出合理范围,比如计算Loss时触发了指数、对数运算的极端值溢出,直接变成NaN;
  • 数据预处理失误:训练数据里藏着缺失值、离谱的异常值,或者归一化/标准化时犯了除以零这类低级错误,前向传播时就会产出无效数值;
  • 函数选型的数值风险:比如用sigmoid时输入值过大,输出趋近于1,后续梯度计算容易出问题;或者交叉熵损失计算时,模型输出的概率值太接近0或1,对数运算直接跳出有效数值范围;
  • 梯度爆炸/消失:深层网络里梯度累积得过大或过小,参数更新彻底失控,最终引发整个计算链路的数值崩溃。

你提到第20个epoch精度还接近90%,之后直接跌到20%左右,大概率是某个epoch开始触发了上述某一种情况,模型参数被彻底破坏,后续训练完全偏离了之前的最优方向。

2. Keras没在最佳精度处停止的原因

Keras默认不会自动在最佳性能点停止训练——它会老老实实跑完你设定的所有epochs。要实现“性能下降就停”的功能,必须手动添加Early Stopping回调函数,示例代码如下:

from keras.callbacks import EarlyStopping

# 配置早停规则:监控验证集精度,5个epoch没提升就停,并且恢复到最优权重
early_stop = EarlyStopping(monitor='val_acc',
                           patience=5,
                           mode='max',  # 精度是越大越好,所以选max模式
                           restore_best_weights=True)

# 训练时把回调传入即可
model.fit(x_train, y_train, callbacks=[early_stop], validation_data=(x_val, y_val))

没加这个回调的话,哪怕后期Loss崩盘、精度暴跌,模型也会一直训练到你设定的epoch数结束。

3. 快速修复的建议

  • 先解决NaN问题:
    • 把学习率缩小10倍试试,这是最容易排查的数值不稳定诱因;
    • 彻查训练数据:有没有缺失值、异常值?预处理步骤(比如归一化)是不是没做对?
    • 换更稳定的函数:比如把sigmoid换成relu(搭配Batch Normalization效果更好),或者用Keras提供的数值稳定版损失函数实现;
  • 必须加早停+权重保存:
    除了Early Stopping,建议再搭配ModelCheckpoint回调,定期保存最优权重,哪怕训练崩了也能找回之前的好状态:
from keras.callbacks import ModelCheckpoint

checkpoint = ModelCheckpoint('best_model_weights.h5', 
                             monitor='val_acc', 
                             save_best_only=True, 
                             mode='max')

model.fit(..., callbacks=[early_stop, checkpoint])

你提供的训练输出:
399/400 [>.] - ETA: 0s - loss: nan - acc: 0.2168
400/400 [
==] - 50s 125ms/step - loss: nan - acc: 0.2166 - val_loss: nan - val_acc: 0.2280

内容的提问来源于stack exchange,提问作者Valentin H

火山引擎 最新活动