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

Informer模型自定义数据集训练时Loss持续为NaN求助

问题诊断与修复方案

1. 自定义数据集存在未处理的缺失/异常值

原数据集已完成缺失值与异常值清理,但自定义数据集的hight、wind_speed等字段可能存在NaN、无穷大或极端值,直接输入模型会导致前向传播生成NaN预测值,最终让损失计算结果为NaN。

修复步骤:

  • 用df.isnull().sum()统计各字段缺失值,对缺失值采用均值/中位数填充或删除对应样本;
  • 执行df.describe()查看特征的极值范围,排查是否存在不合理数值(如风速为负、气压远超正常范围),对极端值做截断或删除处理。

2. 数据预处理未适配自定义数据集

原数据集已做标准化/归一化处理,但替换自定义数据集后,未重新计算预处理统计量,仍复用原数据集的均值、标准差等参数,导致新数据范围失衡,引发模型计算中的数值溢出(如激活函数输出NaN)。

修复步骤:

  • 单独基于自定义训练集计算每个特征的统计量(Z-score的均值/标准差、Min-Max的最大/最小值),用这些统计量统一标准化训练、验证、测试集;
  • 确保目标字段atmospheric_pressure同步做预处理,训练完成后再反归一化得到真实预测值。

3. 模型输入维度与自定义数据集不匹配

原数据集特征数(不含date和target)为12个,而自定义数据集仅5个,若模型的enc_in参数仍沿用原数据集的设置,会导致输入维度不匹配,触发计算错误生成NaN。

修复步骤:

  • 修改Informer模型的enc_in参数为自定义数据集的特征数量(即5);
  • 在_process_one_batch函数开头添加print(batch_x.shape),验证输入维度是否符合[batch_size, seq_len, feature_num]格式。

4. 损失计算环节的数值异常

当pred全为NaN时,损失函数(如MSE)必然输出NaN,根源通常是:

  • 自定义数据集数值范围远大于原数据集,学习率过高引发梯度爆炸,导致模型参数变为NaN;
  • true值本身存在NaN,或损失函数对NaN敏感。

修复步骤:

  • 降低学习率(如从1e-3调整至1e-4),避免梯度爆炸;
  • 在损失计算前添加断言:assert not torch.isnan(pred).any(), "Pred contains NaN",定位触发NaN的batch,排查对应样本;
  • 检查batch_y中的目标字段,确认无NaN值。

5. 时间标记字段处理错误

Informer的batch_x_mark和batch_y_mark用于时间序列标记,原数据集的date字段处理逻辑(如格式转换、步长编码)可能不适用于自定义数据集的date,导致标记字段出现NaN,干扰模型计算。

修复步骤:

  • 统一date字段格式,转换为模型要求的时间戳格式(如Unix时间戳或序列编码);
  • 验证batch_x_mark和batch_y_mark的内容,确保无NaN值且维度与batch_x、batch_y匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:45:56