You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras模型训练出现NaN损失、预测输出NaN,已有解决方案无效如何解决?

问题排查及解决方案

  • 标签合法性校验
    你当前使用的是SparseCategoricalCrossentropy损失,要求标签为0~9范围内的整数,首先执行以下命令检查标签是否异常:
# 检查标签是否存在空值
print(np.isnan(train_labels_int_np).any())
# 检查标签取值范围
print(train_labels_int_np.min(), train_labels_int_np.max())

如果存在标签超出0~9范围、或存在空值,修正标签后重新训练即可。

  • 输入特征归一化
    VGG提取的原始特征数值范围通常较大,且你输入的特征展开后维度达到131072维,直接输入全连接层极易触发梯度爆炸。你可以对输入特征做标准化处理:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# 先展平做标准化再恢复原维度
train_fea_flat = train_imgs_fea.reshape(len(train_imgs_fea), -1)
train_imgs_fea = scaler.fit_transform(train_fea_flat).reshape(train_imgs_fea.shape)
  • 优化网络结构与初始化
    给全连接层添加合理的初始化策略和Dropout层,提升训练稳定性:
inp_fea = layers.Input((16,16,512))
flat = layers.Flatten()(inp_fea)
flat = layers.Dropout(0.3)(flat)
fc_256 = layers.Dense(256, activation='relu', kernel_initializer='he_normal')(flat)
fc_256 = layers.Dropout(0.3)(fc_256)
fc_10 = layers.Dense(10, activation='softmax', kernel_initializer='glorot_normal')(fc_256)
final_model = Model(inp_fea, fc_10)
  • 调整训练参数
    1. 调小学习率:原学习率0.001过高,可下调到1e-4~1e-5测试
    2. 提升数值稳定性:去掉最后一层的softmax激活,损失函数改为SparseCategoricalCrossentropy(from_logits=True),避免softmax计算带来的数值溢出
    3. 调整batch size:将batch size从32上调到64或128,避免小batch数据波动带来的梯度异常
  • 小样本测试定位问题
    取前100条训练样本单独训练,若依然出现NaN则说明是网络结构/参数问题,若恢复正常则说明训练集中存在部分异常样本,可逐批排查异常样本。

内容的提问来源于stack exchange,提问作者Yige Song

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:24:03