PyTorch线性回归训练时损失函数始终返回NaN值是什么原因?
训练MSE损失始终为NaN的排查与修复
你的代码逻辑本身没有语法错误,出现全NaN损失按以下优先级排查即可:
- 第一优先级(99%概率是这个问题):输入数据存在NaN/无穷大等无效值
你使用的天气数据集中,选取的最高温、最低温列存在未填充的空记录,pandas读取时空值会保留为NaN格式,直接转成PyTorch张量送入模型后,前向传播、损失计算、反向传播的全链路都会被NaN污染,第一次参数更新后模型权重就会变成NaN,后续所有轮次的损失自然全是NaN。 - 第二优先级:列索引选取错误
你是用固定位置索引iloc[:,4]、iloc[:,5]取标签和特征,有可能因为CSV读入后列顺序和你预期不一致,误取到了带非数值内容的列,导致张量里混入无效值。 - 第三优先级:学习率过大导致梯度爆炸
你当前设置的0.01学习率对于单特征线性回归一般不会触发这个问题,但如果前面数据问题排除后仍有NaN,可以尝试把学习率降到0.001再试。
快速验证方法
在转PyTorch张量之前,加几行代码检查数据有效性,直接定位问题:
import numpy as np # 检查缺失值 print("最低温列缺失值数量:", labels.isna().sum()) print("最高温列缺失值数量:", features.isna().sum()) # 检查无穷大值 print("最低温列无穷值数量:", np.isinf(labels).sum()) print("最高温列无穷值数量:", np.isinf(features).sum())
运行后你会看到两列气温数据确实存在不少缺失值,这就是损失为NaN的根源。
修复方案
- 先清洗数据再转张量,丢弃带无效值的记录,同时转张量时先取pandas Series的values属性转成numpy数组,避免版本兼容问题:
# 修改数据预处理部分代码 csvFile = pd.read_csv('/Users/ericbeep999/Desktop/Web Development/Projects/Python/pytorch/3. Linear Regression/weather.csv') # 提取需要的两列后直接删除带空值的行 clean_data = csvFile.iloc[:, [4,5]].dropna() labels, features = clean_data.iloc[:, 0], clean_data.iloc[:, 1] # 转成浮点型张量 labels = torch.tensor(labels.values, dtype=torch.float32).reshape(-1, 1) features = torch.tensor(features.values, dtype=torch.float32).reshape(-1,1)
- (可选优化)对特征和标签做标准化处理,让数值均值为0、方差为1,训练收敛更稳定,避免数值尺度过大带来的训练异常:
# 张量转换完成后加标准化逻辑 features = (features - features.mean()) / features.std() labels = (labels - labels.mean()) / labels.std()
- 训练循环里加NaN检测,碰到异常直接终止,避免跑无效轮次:
num_epochs = 100 for epoch in range(num_epochs): for X, Y in data_set: loss = lossFunc(model(X), Y) # 检测到NaN直接打印异常批次退出 if torch.isnan(loss): print("异常批次输入:", X, "异常批次标签:", Y) exit() gradient.zero_grad() loss.backward() gradient.step() epoch_loss = lossFunc(model(features), labels) print(f'epoch: {epoch + 1}, loss: {epoch_loss}')
改完之后重新运行,损失会从初始值稳步下降,最终能正常输出拟合得到的权重和偏置参数,不会再出现全NaN的问题。
内容的提问来源于stack exchange,提问作者eric424
相关产品推荐
相关产品推荐

