Keras多变量时间序列预测模型训练时MAE与loss返回NaN异常
排查解决步骤
- 全量校验数据异常值
运行df.isnull().sum().sum()检查是否存在空值,运行np.isinf(df).values.sum()检查是否存在无穷值(inf/-inf)。
重点核查标准化逻辑:标准化必须仅使用训练集的均值、标准差计算,再应用到验证集和测试集,如果提前用全量数据做标准化,或是某列特征标准差为0时直接执行(x-mean)/std计算,会直接生成inf/NaN值。 - 检查窗口生成的批次数据
Baseline仅做输入复制不会触发数值异常,可单独提取Conv窗口的批次数据做校验:
如果返回存在NaN,说明窗口生成时对不足长度的尾部数据做了空值填充,未做截断处理。for inputs, labels in conv_window.train.take(5): print("输入含NaN:", tf.reduce_any(tf.math.is_nan(inputs)).numpy()) print("标签含NaN:", tf.reduce_any(tf.math.is_nan(labels)).numpy()) - 修复梯度爆炸问题
193维特征叠加卷积、全连接层时容易出现梯度爆炸,导致参数更新为NaN,可在优化器中增加梯度裁剪:
将优化器替换为tf.optimizers.Adam(clipnorm=1.0),限制梯度的最大范数,避免梯度过大导致参数异常。 - 定位异常特征列
单特征场景运行正常,可逐步增加输入特征的数量,从2列、10列逐步增加到全量193列,定位到触发NaN问题的特定特征列后单独处理。 - 校验数据类型
检查所有特征列是否均为float32/float64数值类型,避免混入字符串、时间戳等非数值类型,导致模型计算异常。
内容的提问来源于stack exchange,提问作者ronjafuchs
相关产品推荐
相关产品推荐

