最近在手撸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')

本文讲述了在使用TensorFlow2实现FasterRCNN模型时遇到训练loss变为nan的问题。通过详细debug,作者发现nan的产生原因是由于目标物体位于图像边缘,导致目标框和先验框匹配不佳,进而影响损失计算。解决方案包括损失截断、数据替换、调整先验框生成策略以及优化损失函数。该问题加深了作者对FasterRCNN的理解,并提出了解决类似问题的思路。
最低0.47元/天 解锁文章

8399

被折叠的 条评论
为什么被折叠?



