问题描述
- 训练时梯度出现 nan 或 -nan
- 问题详细描述:在训练时,出现异常:NanLossDuringTrainingError: NaN loss during training.
问题分析
- 进一步分析,batch_size=1 且 worker=1 时,发现首先是线上梯度出现 nan 或 -nan,然后下一轮跌待中所有数据都是 nan,进一步导致 loss 为 nan
- 在问题确认过程中,需要一步步排除:
- 排除分母除 0 的情况,可以简单的用
tf.div_no_nan代替\ - 排除 log 参数为负数或 0 的情况
- 排除抽取 batch 中选择符合条件的行后出现行数为 [] 的情况,使用
tf.shape(x)[0]是否为 0 来判断是否为空 - 重点:排除整数除法等导致的值为 0 的情况,这种情况比较隐晦,难以感知
- 有时候会是 TensorFlow 版本导致,需要注意
- 排除分母除 0 的情况,可以简单的用