python - 如何在使用 train_and_evaluate 时访问 BestExporter 的结果?

标签 python tensorflow tensorflow-estimator

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

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

<小时/>

对于任何迫切需要解决方法的人,您可以使用像这样的 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 的生命周期从调用到值(value),

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

最佳答案

如果您愿意(稍微)更改源代码,特别是_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 ,我们刚刚改变了。因此,您可以接受所有不同导出器的这种行为,或者使用一些变量,默认为 False ,它控制是否保存到文件。然后,通过调用 BestExporter 公开此变量。

希望我能帮忙。

关于python - 如何在使用 train_and_evaluate 时访问 BestExporter 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56391404/

相关文章:

python - 当 TensorFlow 找不到 tools 属性时,如何检查 TensorFlow 中检查点文件中的变量?

tensorflow - tf.estimator 的 gRPC 错误

python - 具有依赖预设参数的函数

python - 使用 tf.data.Dataset.from_generator 时为 "SystemError: error return without exception set"

python - Pandas 通过事件创建月末持有量

python - 如何为 Tensorflow 2 中的每像素分类从 PNG 创建单热编码矩阵

tensorflow - 使用 BERT (TF 1.x) 保存的模型执行推理

python - 在 tensorflow 估计器中记录长张量值

python - 基于python中的条件绘制多色线

python - 跨数据框迭代函数