我正在使用此实现FRCNN在我的数据集上进行培训:
https://github.com/kbardool/keras-frcnn
在训练期间,我获得没有堆栈跟踪的随机例外:
708/1000 [====================>.........] - ETA: 289s - rpn_cls: 0.1376 - rpn_regr: 0.3020 - detector_cls:
709/1000 [====================>.........] - ETA: 288s - rpn_cls: 0.1376 - rpn_regr: 0.3020 - detector_cls:
710/1000 [====================>.........] - ETA: 287s - rpn_cls: 0.1374 - rpn_regr: 0.3021 - detector_cls:
711/1000 [====================>.........] - ETA: 286s - rpn_cls: 0.1373 - rpn_regr: 0.3018 - detector_cls:
712/1000 [====================>.........] - ETA: 284s - rpn_cls: 0.1371 - rpn_regr: 0.3017 - detector_cls:
713/1000 [====================>.........] - ETA: 283s - rpn_cls: 0.1370 - rpn_regr: 0.3019 - detector_cls:
714/1000 [====================>.........] - ETA: 282s - rpn_cls: 0.1370 - rpn_regr: 0.3017 - detector_cls: 0.0783 - detector_regr: 0.0686
Exception: 'a' cannot be empty unless no samples are taken
715/1000 [====================>.........] - ETA: 281s - rpn_cls: 0.1369 - rpn_regr: 0.3015 - detector_cls:
716/1000 [====================>.........] - ETA: 280s - rpn_cls: 0.1367 - rpn_regr: 0.3013 - detector_cls:
717/1000 [====================>.........] - ETA: 279s - rpn_cls: 0.1365 - rpn_regr: 0.3009 - detector_cls:
718/1000 [====================>.........] - ETA: 278s - rpn_cls: 0.1363 - rpn_regr: 0.3011 - detector_cls:
当我收到错误消息时,损失仍然下降,可以是什么原因,我该如何修复?
我一直在看到相同的错误消息,并且似乎并没有影响培训课程的结果。我注意到训练数据的边界框是<20px此错误呈现出来。让我知道您是否真的确定是什么原因引起了问题!
我找到了一个根本原因,并且有一些肤浅的修复,但是我对正在发生的事情没有100%的了解。例外情况是在第二次尝试执行 np.random.choice 时发生的。如果第一选择失败而例外,则作者正在缓存异常,并尝试在没有重复数据的情况下选择。但是,如果 neg_samples 是空的,则第二个调用会产生异常。
try:
selected_neg_samples = np.random.choice(neg_samples, C.num_rois - len(selected_pos_samples), replace=False).tolist()
except:
selected_neg_samples = np.random.choice(neg_samples, C.num_rois - len(selected_pos_samples), replace=True).tolist()
我有这样的"修复":
try:
selected_neg_samples = np.random.choice(neg_samples, C.num_rois - len(selected_pos_samples), replace=False).tolist()
except:
selected_neg_samples = np.random.choice(neg_samples, C.num_rois - len(selected_pos_samples) if len(neg_samples)>0 else 0, replace=True).tolist()
再次,如果neg_samples为空,我不确定是否可以采样。可能是对算法有更好理解的人,可以在此处发表合理的评论。