如何在使用model_main训练的同时并行评估张量流对象检测模型

时间:2018-08-30 14:38:45

标签: tensorflow object-detection

我成功地使用train.pyeval.py用自定义示例训练了对象检测模型。并行运行两个程序,我能够在训练过程中在张量板上可视化训练和评估指标。

但是,两个程序都移到了legacy文件夹中,model_main.py似乎是运行训练和评估的首选方法(仅执行一个过程)。但是,当我以以下model_main.py开始pipeline.config时:

train_config {
  batch_size: 1
  num_steps: 40000
  ...
}
eval_config {
  # entire evaluation set
  num_examples: 821
  # for continuous evaluation
  max_evals: 0
  ...
}

我看到在model_main.py的输出中启用INFO日志记录后,训练和评估是按顺序执行的(与之前两个过程同时进行),并且在每个训练步骤之后都进行了完整的评估。

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 35932: ...
INFO:tensorflow:Saving checkpoints for 35933 into ...
INFO:tensorflow:Calling model_fn.
...
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-08-30-10:06:47
...
INFO:tensorflow:Restoring parameters from .../model.ckpt-35933
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [82/821]
...
INFO:tensorflow:Evaluation [738/821]
INFO:tensorflow:Evaluation [820/821]
INFO:tensorflow:Evaluation [821/821]
...
INFO:tensorflow:Finished evaluation at 2018-08-30-10:29:35
INFO:tensorflow:Saving dict for global step 35933: ...
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 35933: .../model.ckpt-35933
INFO:tensorflow:Saving checkpoints for 35934 into .../model.ckpt.
INFO:tensorflow:Calling model_fn.
...
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-08-30-10:29:56
...
INFO:tensorflow:Restoring parameters from .../model.ckpt-35934

这当然会减慢训练速度,几乎无法取得进展。当我使用model_main的命令行参数--num_eval_steps1减少评估步骤时,训练的速度与以前一样快(使用train.pyeval.py) ,但是评估指标变得毫无用处(例如DetectionBoxes_Precision/mAP...变得恒定,并且具有诸如10甚至是-1之类的值)。在我看来,似乎只是在为同一张单张图片不断地计算这些值。

那么启动model_main.py的正确方法是什么,这样确实可以取得合理的快速进展,并从整个评估集中并行计算评估指标。

1 个答案:

答案 0 :(得分:0)

在training.py内部,有一个类EvalSpec在main_lib.py中被调用。 它的构造函数有一个名为throttle_secs的参数,该参数设置后续求值之间的间隔,并且默认值为600,并且在model_lib.py中永远不会获得其他值。 如果您有想要的特定值,则只需更改默认值, 但是当然,更好的做法是将其作为model_main.py的参数传递,该参数将通过model_lib.py馈送EvalSpec

更多详细信息,将其设置为另一个输入标志 flags.DEFINE_integer('throttle_secs', <DEFAULT_VALUE>, 'EXPLANATION'), 然后 throttle_secs=FLAGS.throttle_secs, 然后将model_lib.create_train_and_eval_specs更改为也接收throttle_secs,并将其添加到tf.estimator.EvalSpec的调用中。

编辑: 我发现您还可以在.config文件的eval_config中设置eval_interval_secs。如果这样做有效(由于从eval.py移到model_main.py,因此不支持所有标志)-显然这是一个更简单的解决方案。如果不是,请使用上面的解决方案。

EDIT2:我尝试在eval_config中使用eval_interval_secs,但是它不起作用,因此您应该使用第一个解决方案。