如何在使用model_main进行训练的同时并行持续评估tensorflow目标检测模型

6
我成功地使用train.pyeval.py训练了一个自定义示例的目标检测模型。在并行运行两个程序的同时,我能够在训练期间通过tensorboard可视化训练和评估指标。
然而,这两个程序都被移动到了legacy文件夹中,现在使用model_main.py运行训练和评估是首选方法(仅需执行单个进程)。但是当我使用以下pipeline.config启动model_main.py时:
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_steps将评估步骤减少到1时,训练速度与以前一样快(使用train.pyeval.py),但是评估指标变得无用(例如:DetectionBoxes_Precision/mAP... 变成固定值,如10或甚至-1)。在我看来,它似乎仅针对同一张图片不断计算这些值。
那么,正确的启动model_main.py方式是什么,使其能够合理快速地进行并行计算整个评估集的评估指标呢?
1个回答

2
在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),那么这显然是一个更简单的解决方案。 如果不行,请使用上面的解决方案。
编辑2:我尝试在eval_config中使用eval_interval_secs,但它没有起作用,因此您应该使用第一种解决方案。

感谢您的回答,很抱歉让您等待了这么久。说实话,我希望有一种解决方案,不需要更改源代码。这就是为什么我问如何启动 model_main.py 而不是如何修改它,但显然这并不清楚。实际上,我找到了一种不同的方法,通过更改 RunConfigsave_checkpoints_stepssave_checkpoints_secs 来修改源代码。它会传递给 model_libcreate_estimator_and_inputs 来创建 Estimator。从我的角度来看,优点在于我可以控制评估间隔的训练步数,而不是时间。 - Volker Stampa
这确实是一种可能性,但它会让您更改检查点保存频率。如果您可以接受这点,那就太棒了。 - netanel-sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接