当我使用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_local第703章
_NewCheckpointListenerForEvaluate.after_save 517
_NewCheckpointListenerForEvaluate._evaluate 536
最佳答案
如果您愿意(稍微)更改源代码,特别是_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) 所有三个已实现的导出器( LatestExporter
、 FinalExporter
和 BestExporter
)都正在调用 _SavedModelExporter
,我们刚刚改变了。因此,您可以接受所有不同导出器的这种行为,或者使用一些变量,默认为 False
,它控制是否保存到文件。然后,通过调用 BestExporter 公开此变量。
希望我能帮忙。
关于python - 如何在使用 train_and_evaluate 时访问 BestExporter 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56391404/