Когда я использую 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]
, поскольку последняя контрольная точка не привела к экспорту, даже если ранее был экспорт.
Для всехкого это волнует, так это соответствующие биты кода из tenorflow r1.13, отслеживающие жизнь export_results
от вызова к значению,
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