【踩坑大全】TensorFlow的Loss出现Nan原因分析及解决方案

记录一次狗屎的经历

背景是这样的

  • 模型是现成的,只是想加一个自定义的Loss
  • 在PyTorch上实现成功,并且效果很好
  • TensorFlow中,没法使用类似PyTorch那样局部更改tensor值的操作(大概是下面这样),在网上查了一堆方案之后,感觉都不好用,就换了一种算法规避了这种操作
indices = torch.tensor([2, 4])
value[indices] = torch.tensor([[1, 2],
                               [3, 4],
                               [5, 6],
                               [7, 8])
  • 问题来了!!!新算法会让indices没有标识的值近似0,在一顿操作之后,发生了下溢,整个tensor几乎全都变成0了
  • 然后这一堆0值经过了一系列操作,又喂给了loss,引发了为期两天的Nan惨案

解决方法

  • 对可能会变成0的值,都加一个:
tf.maximum(value, 1e-6)
  • 注意,不是最后的loss比较大就没事,而是不要让任何有用的值都大规模的接近0或者变成0(这里我不太确定原理,希望有大佬可以指出)
  • 这样可以在对结果不造成什么太大影响的情况下,保证不会出现Nan的情况

中间踩坑

  • 一般出现Nan都可以通过减小lr来解决,但是这次无效
  • 判断方法:lr直接设置为0,如果还是Nan,就不用再考虑学习率的问题了

你可能感兴趣的:(踩坑大全,python,tensorflow,人工智能,深度学习)