当我在tf.estimator.train_and_evaluate
中将BestExporter
与EvalSpec
一起使用时,最后的返回值可能不包含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_local 703
_NewCheckpointListenerForEvaluate.after_save 517
_NewCheckpointListenerForEvaluate._evaluate 536
答案 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)所有三个已实现的导出器(LatestExporter
,FinalExporter
和BestExporter
)都在对_SavedModelExporter
进行调用,而我们刚刚对其进行了更改。因此,您可以对所有不同的Exporter都采用这种行为,也可以使用一些变量,默认值为False
,该变量控制是否要保存到文件。然后,通过调用BestExporter公开此变量。
希望我能帮上忙。