keras-yolov3在win10+cpu下训练模型正常;但同样的代码在win10+gpu环境下,训练模型一直显示loss:nan。
1.错误信息如下:
Epoch 1/50
2021-12-24 18:31:54.894750: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudnn64_7.dll
2021-12-24 18:31:57.850212: W tensorflow/stream_executor/cuda/redzone_allocator.cc:312] Internal: Invoking ptxas not supported on Windows
Relying on driver to perform ptx compilation. This message will be only logged once.
2021-12-24 18:31:58.171032: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_100.dll
1/19 [>.............................] - ETA: 4:01 - loss: nan
2/19 [==>...........................] - ETA: 1:57 - loss: nan
3/19 [===>..........................] - ETA: 1:31 - loss: nan
4/19 [=====>........................] - ETA: 1:24 - loss: nan
5/19 [======>.......................] - ETA: 1:17 - loss: nan
2.解决办法如下:
# filter out inf/nan values encountered here:
raw_true_wh = K.switch(tf.is_inf(raw_true_wh), raw_true_wh, K.zeros_like(raw_true_wh))
raw_true_wh = K.switch(tf.is_nan(raw_true_wh), raw_true_wh, K.zeros_like(raw_true_wh))
3.注意:
yolov3样本集打标注时,候选区域不能太小,最好一张图只有一个标注框(这样不影响后续检测,可以检测出多个目标)
---------------------------------------------------------------------------------------------------------------------
2022年1月5日:
理解补充:
①当图片样本集数量比较大,分类比较大多时,若batch_size太大(本例是64),lr太小(本例是1e-4),则loss开始就是nan,原因可能是不同图片之间的差别不大,lr值过小,尤其是freeze_body=2时,只有三层数据参与计算(252-249),算法根本就无法计算图片之间的差异,导致梯度消失,所以loss:nan。
②训练过程中loss会在nan和数值之间波动,原因是每个epoch的采样不同,如果正好取的三张图片(本例batch_size=3)同属于一个分类,那么计算梯度就会非常小,可能比学习率都要小,这个时候loss就会是nan。
下面是训练过程中的截图,从上往下看。