【问题标题】:How to access results from BestExporter while using train_and_evaluate?如何在使用 train_and_evaluate 时访问 BestExporter 的结果?
【发布时间】:2019-05-31 08:28:59
【问题描述】:

当我在EvalSpec 中使用tf.estimator.train_and_evaluateBestExporter 时,最后的返回值可能不包括export_result,因为最终的评估调用不一定会导致导出。例如,如果您的最后一个检查点不会导致评估集的损失较低,就会发生这种情况。

如何访问导致从BestExporter 导出的最后一个export_result?理想情况下,我希望在 train_and_evaluate 的末尾有每个 (metrics, export_results)list,而不仅仅是最后一个。


对于任何急需解决方法的人,您可以使用这样的 python 内置函数访问该目录。

estimator = tf.estimator.Estimator(...)
best_exporter = tf.estimator.BestExporter(...)

# Add best_exporter to your eval_spec
# Make train_spec
metrics, export_results = tf.estimator.train_and_evaluate(...)

best_export_dir = os.path.join(estimator.model_dir, 'export', best_exporter.name)
savedmodels = os.listdir(best_export_dir)
best_model = savedmodels[-1]

显然,最好有更好的方法。我在此处描述的特定问题是 export_results 可能只是 [None],因为即使有较早的导出,上一个检查点也不会导致导出。


对于任何关心这些的人来说,这些是来自 tensorflow r1.13 的相关代码位,跟踪 export_results 从调用到值的生命,

tf.estimator.train_and_evaluate471

_TrainingExecutor.run611

_TrainingExecutor.run_local703

_NewCheckpointListenerForEvaluate.after_save517

_NewCheckpointListenerForEvaluate._evaluate536

_Evaluator.evaluate_and_export924

_Evaluator._export_eval_result948

【问题讨论】:

  • 好问题,我刚刚发现 BestExporter 可以解决我的一个问题,但我根本无法获得一些类似 dict 的结构,从而为每个导出结果提供评估指标。如果您不受 Estimator 的约束,请考虑查看 TF2,他们使用 Keras API 以更好的方式处理此问题。

标签: python tensorflow tensorflow-estimator


【解决方案1】:

如果您愿意(稍微)更改源代码,特别是tensorflow_estimator\python\estimator\exporter.py 中的_SavedModelExporter 类实现,我可能已经找到了解决方案。

首先,我使用包tensorflow_estimator,而不是从tf.estimator 获取estimator。如果解决方案在您的情况下不起作用,请考虑使用tensorflow_estimator - 您不应该因此而失去任何东西。

基本上,_SavedModelExporter 有一个名为 export 的方法,在我的例子中(tensorflow 1.13.2,tensorflow_estimator 1.13.0),从第 116 行开始并具有以下实现:

  def export(self, estimator, export_path, checkpoint_path, eval_result,
             is_the_final_export):
    del is_the_final_export

    export_result = estimator.export_savedmodel(
        export_path,
        self._serving_input_receiver_fn,
        assets_extra=self._assets_extra,
        as_text=self._as_text,
        checkpoint_path=checkpoint_path,
        strip_default_attrs=self._strip_default_attrs)

################
###I ADDED THIS
################
    results_file = os.path.join(export_result, b"model_eval.txt")
    with open(results_file, mode="w") as f:
      for result in eval_result:
        f.write(result + ": " + str(eval_result[result]) + "\n")
################
###END OF I ADDED THIS
################
    return export_result

在上面的代码中,如标记的那样,我添加了循环遍历评估结果字典的代码(eval_result 变量,我们已经可以使用但这里没有使用!)并将其作为行保存到文件中。该文件将保存在包含导出模型的同一文件夹中,即export\best_exporter\1565348723\

几点:

1) 你要求返回值,我没有给你。我将其保存到文件中,因为我认为这是对源代码更改最少的解决方案。如果您无法使用它,请告诉我。

2) 您可以在此解决方案上进行开发。例如,您可以将所有条目保存到同一个文件中,而不是为每个导出的模型保存一个文件。

3) 所有三个已实现的导出器(LatestExporterFinalExporterBestExporter)都在调用我们刚刚更改的 _SavedModelExporter。因此,您可以为所有不同的导出器忍受这种行为,或者有一些变量,默认为False,它控制是否保存到文件。然后,通过调用 BestExporter 来公开这个变量。

希望我能帮忙。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2022-07-20
    • 2017-04-19
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多