首先先分析一个这个问题:
这个报错是tensorBoardX的警告,是他接收到了非法的数据,而这个数据一般是训练过程中的出现了非法的值,一般情况下你把tensorBoardX关掉也无济于事,同样loss=nan。那么接下来看非tensorBoardX的错误的分析!
出现这个问题的几个可能的原因
一、lr学习率过大,导致梯度爆炸或者梯度消失
解决办法
1.调节学习率,将学习率降低一个数量级,直到降低到0,如果这个问题消失了,那就是学习率过大导致的
2.也有可能是优化器的问题,尝试将SGD换成Adam,或者换一个优化器尝试
but如果学习率降到0了还有这个问题,那么就不是学习率的问题,我的问题也不是学习率问题。看接下来的情况
二、数据中存在脏数据,要做数据清洗
解决办法
做数据清洗,可能里面的某些数据图像中存在非法数据
but如果像我一样是一个公开数据集,并且好多人都在用,而且这个数据集是发TIP的师兄给我的啊!!!!怎么可能会出错,所以也不是数据的问题,(那就是我的问题咯?),那就接着看接下来的情况!!!!
三、mask掩码问题!!!!
我来说一下我的问题,我的代码有一个对图像加mask的过程,其中这个算法中有涉及到除法,看代码:
mask = mask / torch.max(mask)
我想着除以最大值应该不会出现除以零的问题,就没有在分母加非零偏置项,结果就是这里出了问题!更正后代码:
mask = mask / (torch.max(mask) + 0.0001)
完美解决了这个问题,但是这只是表面的原因!!!
四、深层问题,我还没有想通,给各位大神描述一下
首先我的DataLoader设置为:
shuffle=True, num_workers=2
所以说,数据是无序加载的,我在跑第一个基准数据集的时候,并没有出现这个问题,也得到了最终的结果,但是要跑一下其他数据集,使模型性能更具说服力,于是他在其中一个数据集会在第一个epoch会固定在某个batch也就是第56个batch出现这个问题,导致所有的值都为nan,然后我就发现了在第56个batch中的mask中的第2个tensor出现了全部为nan的问题,然后我debug到
mask = mask / torch.max(mask)
发现了这个除零的问题,但是每次都是固定的batch出现这个问题由于是乱序加载图像,所以和固定某张图像没有关系,如果是某一张图像有问题,那么shuffle=True,应该不同的batch出现这个问题而不是固定的batch出现,这是其一。
我这里给了两个参数,分别是
shuffle=True, num_workers=2
刚刚分析了shuffle=True,那么再来分析一下num_workers=2,对于另外一个数据集来说,前6个epoch不会出这个【Warring:root:NaN or Inf find in input tensor】的问题,那么就是说训练数据其实是没有问题的,计算掩码的算法是不可学习的是在dataset数据预处理的时候计算的,既然前六轮不出现这个问题那么为什么固定在第七轮会出现这个问题,哪怕我跑6轮停掉,然后加载第六轮权重从第一轮开始跑,依旧是第7轮出现这个问题,包括刚刚第一个数据集固定第一个轮出现这个问题。于是我偶然间,修改了num_workers令其等于1,即num_workers=1,居然在第一个数据集第一轮不报错了!?后面也没发现报错(但是我仅仅跑了几十轮,发现都没有报错,没有跑完)。然后对于第二个提到的数据集我将num_workers=4同样在第七轮不出错了,而是在第11轮出现了nan。