PyTorch/TensorFlow训练时loss突然变NaN?这5个排查步骤帮你快速定位问题
当你全神贯注地盯着训练进度条,突然看到loss值变成了"nan"——这种时刻就像赛车手在弯道突然失去抓地力。别急着重启训练,让我们像调试工程师一样,用系统化的方法定位问题根源。
1. 数据质量诊断:从源头排查NaN污染
数据问题导致的NaN通常会在训练初期就出现。我曾在处理医疗影像数据集时,因为DICOM文件解析错误导致16%的像素值为NaN,模型第一轮迭代就直接崩溃。
快速检查清单:
python复制# PyTorch数据检查
import torch
def check_data_loader(loader):
for batch_idx, (data, target) in enumerate(loader):
if torch.isnan(data).any():
print(f"NaN detected in batch {batch_idx} at positions:")
print(torch.where(torch.isnan(data)))
return False
return True
# TensorFlow数据检查
import tensorflow as tf
dataset = ... # 你的tf.data.Dataset
for batch in dataset.take(1):
print(tf.reduce_any(tf.math.is_nan(batch[0])))
常见数据陷阱:
- 未处理的缺失值(尤其CSV中的空字符串)
- 图像解码错误产生的无效像素
- 音频文件采样异常
- 文本中的特殊unicode字符
数值范围规范化建议:
| 数据类型 | 推荐预处理方式 | 典型问题 |
|---|---|---|
| 图像像素 | 除以255后减均值除标准差 | 未归一化导致梯度爆炸 |
