【问题标题】:How to continouosly evaluate a tensorflow object detection model in parallel to training with model_main如何在使用 model_main 进行训练的同时持续评估 tensorflow 对象检测模型
【发布时间】:2018-08-30 14:38:44
【问题描述】:

我使用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 的正确方法,这样才能取得合理的快速进展,并从整个评估集中并行计算评估指标。

【问题讨论】:

    标签: tensorflow object-detection


    【解决方案1】:

    在 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,但它不起作用,所以您应该使用第一个解决方案。

    【讨论】:

    • 感谢您的回答,抱歉耽搁了。 TBH 我希望有一个不需要更改源代码的解决方案。这就是为什么我问如何开始model_main.py而不是如何修改它,但显然这还不够清楚。实际上,我通过更改RunConfigs save_checkpoints_stepssave_checkpoints_secs 找到了修改源代码的不同方法。它被传递给model_libs create_estimator_and_inputs 以创建Estimator。从我的角度来看,优点是我可以控制训练步数而不是时间的评估间隔。
    • 这确实是一种可能,但它会让你改变检查点保存频率。如果你没问题 - 那就太好了。
    猜你喜欢
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 2018-02-19
    • 2020-06-17
    相关资源
    最近更新 更多