在使用train_and_evaluate时如何从BestExporter访问结果?

时间:2019-05-31 08:28:59

标签: python tensorflow tensorflow-estimator

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

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


对于渴望解决此问题的人,您可以使用类似python的内置程序访问目录。

train_and_evaluate

显然,更好的方法将是首选。我在这里描述的特定问题是,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,因为即使有较早的导出,最后一个检查点也不会导致导出。


对于那些在乎这些的人来说,它们是tensorflow r1.13中相关的代码位,以追踪[None]从调用到值的寿命,

tf.estimator.train_and_evaluate 471

_TrainingExecutor.run 611

_TrainingExecutor.run_local 703

_NewCheckpointListenerForEvaluate.after_save 517

_NewCheckpointListenerForEvaluate._evaluate 536

_Evaluator.evaluate_and_export 924

_Evaluator._export_eval_result 948

1 个答案:

答案 0 :(得分:0)

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

首先,我使用的是软件包tensorflow_estimator,而不是从estimator获取tf.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进行调用,而我们刚刚对其进行了更改。因此,您可以对所有不同的Exporter都采用这种行为,也可以使用一些变量,默认值为False,该变量控制是否要保存到文件。然后,通过调用BestExporter公开此变量。

希望我能帮上忙。