最近在手撸Tensorflow2版本的Faster RCNN模型,稍后会进行整理。但在准备好了模型和训练数据之后的训练环节中出现了大岔子,即训练过程中loss变为nan。nan表示not a number类型,任意有关nan的运算结果都将得到nan。这可真是一颗老鼠屎坏了一锅粥,一但一个step中出现loss为nan,所有神经元的参数都将被更新为nan,之后的epochs和step中所有预测结果和模型参数都将为nan。
为了弄清楚nan的原因,我检查了每个组件函数以及所用的训练数据是否有误,结果显示都是没问题的。怀疑参数设置,怀疑模型流程写错了.....在大量debug之后,终于找到了症结所在。
1、为什么会出现nan?
nan在数学表示上表示一个无法表示的数,一般表示一个非浮点数(比如无理数)。inf不同于nan,inf是一个超过浮点表示范围的浮点数,其本质仍然是一个数,只是他为无穷大。
在numpy数组中,这些计算会产生nan的结果:
仔细debug整个训练过程, 用如下代码段捕获nan的出现(因为在python中nan不会报错)
import numpy as np
if np.any(np.isnan(contents)):
print('contents contain nan')