训练深度学习网络的过程中出现 loss nan总是让人觉得头疼,本人这次是在pytorch的半精度amp.autocast, amp.GradScaler训练时候出现了loss nan。
loss nan 常见的一般几种情况有:
lr学习率设置的过大,导致loss nan,调小lr;
训练数据中有脏数据,也会导致loss,这个需要自己排查,batch设置为1,遍历所有训练数据遇到nan就打印数据路径再退出;
if np.isnan(loss):
sys.exit()
网络计算过程中可能存在nan,但这种可能比较少见。等等;
计算loss时候出现nan,特别是众多交叉熵损失中,核心原因应该是log(0)导致的。
笔者是在pytorch的半精度amp.autocast, amp.GradScale训练时候出现了loss nan,而且Lr设置合理,且没有脏数据,想到应该是半精度把一些很小的数表示为0了,计算loss时候把输出fp16—> fp32,问题解决。
out = out.float()
下面用交叉熵损失验证了一下fp16,fp64的结果
import numpy as np
import os
out = np.array([0.00000001]).astype(np.float16)
lab = np.array([0]).astype(np.float16)
loss = lab * np.log(out) - (