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)
- 调整训练参数
- 调小学习率:原学习率0.001过高,可下调到
1e-4~1e-5测试 - 提升数值稳定性:去掉最后一层的softmax激活,损失函数改为
SparseCategoricalCrossentropy(from_logits=True),避免softmax计算带来的数值溢出 - 调整batch size:将batch size从32上调到64或128,避免小batch数据波动带来的梯度异常
- 调小学习率:原学习率0.001过高,可下调到
- 小样本测试定位问题
取前100条训练样本单独训练,若依然出现NaN则说明是网络结构/参数问题,若恢复正常则说明训练集中存在部分异常样本,可逐批排查异常样本。
内容的提问来源于stack exchange,提问作者Yige Song
相关产品推荐
相关产品推荐

