keras FRCNN训练错误消息:异常:除非没有采样,否则'a'不能为空

时间:2019-05-14 15:39:57

标签: python keras faster-rcnn

我正在使用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:

当我收到错误消息时,损失仍然下降,这是什么原因,我该如何解决?

2 个答案:

答案 0 :(得分:0)

我一直看到相同的错误消息,它似乎并没有影响培训的结果。我已经注意到,当我在训练数据上的边界框小于20像素时,就会出现此错误。让我知道您是否真的确定导致问题的原因!

答案 1 :(得分:0)

我找到了根本原因并进行了一些肤浅的修复,但是我对所发生的事情没有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为空,我不确定是否可以采样。可能是对算法有更好理解的人可以在这里给出合理的评论。