有什么方法可以只使用 tensorflow.estimator.train_and_evaluate() 来保存最佳模型吗?
Is there some way to save best model only with tensorflow.estimator.train_and_evaluate()?
我尝试从检查点重新训练 TF 对象检测 API 模型,并使用已有的 .config 文件来使用 tf.estimator.train_and_evaluate() 方法(如 models/research/object_detection/model_main.py 中的训练管道)。它每 N 步或每 N 秒保存一次检查点。
但我只想保存一个像 Keras 中的最佳模型。
有什么方法可以用 TF 对象检测 API 模型来实现吗?也许 options/callbacks 用于 tf.Estimator.train 或某种使用检测 API 与 Keras 的方法?
您可以尝试使用 BestExporter
。据我所知,这是您尝试做的事情的唯一选择。
exporter = tf.estimator.BestExporter(
compare_fn=_loss_smaller,
exports_to_keep=5)
eval_spec = tf.estimator.EvalSpec(
input_fn,
steps,
exporters)
https://www.tensorflow.org/api_docs/python/tf/estimator/BestExporter
我一直在使用 https://github.com/bluecamel/best_checkpoint_copier,它对我来说效果很好。
示例:
best_copier = BestCheckpointCopier(
name='best', # directory within model directory to copy checkpoints to
checkpoints_to_keep=10, # number of checkpoints to keep
score_metric='metrics/total_loss', # metric to use to determine "best"
compare_fn=lambda x,y: x.score < y.score, # comparison function used to determine "best" checkpoint (x is the current checkpoint; y is the previously copied checkpoint with the highest/worst score)
sort_key_fn=lambda x: x.score,
sort_reverse=False) # sort order when discarding excess checkpoints
传递给你的 eval_spec:
eval_spec = tf.estimator.EvalSpec(
...
exporters=best_copier,
...)
如果您正在使用 tensorflow/models 的模型存储库进行训练。
models/research/object_detection/model_lib.py
文件 create_train_and_eval_specs
函数可以修改为包含最佳导出器:
final_exporter = tf.estimator.FinalExporter(
name=final_exporter_name, serving_input_receiver_fn=predict_input_fn)
best_exporter = tf.estimator.BestExporter(
name="best_exporter",
serving_input_receiver_fn=predict_input_fn,
event_file_pattern='eval_eval/*.tfevents.*',
exports_to_keep=5)
exporters = [final_exporter, best_exporter]
train_spec = tf.estimator.TrainSpec(
input_fn=train_input_fn, max_steps=train_steps)
eval_specs = [
tf.estimator.EvalSpec(
name=eval_spec_name,
input_fn=eval_input_fn,
steps=eval_steps,
exporters=exporters)
]
我尝试从检查点重新训练 TF 对象检测 API 模型,并使用已有的 .config 文件来使用 tf.estimator.train_and_evaluate() 方法(如 models/research/object_detection/model_main.py 中的训练管道)。它每 N 步或每 N 秒保存一次检查点。
但我只想保存一个像 Keras 中的最佳模型。 有什么方法可以用 TF 对象检测 API 模型来实现吗?也许 options/callbacks 用于 tf.Estimator.train 或某种使用检测 API 与 Keras 的方法?
您可以尝试使用 BestExporter
。据我所知,这是您尝试做的事情的唯一选择。
exporter = tf.estimator.BestExporter(
compare_fn=_loss_smaller,
exports_to_keep=5)
eval_spec = tf.estimator.EvalSpec(
input_fn,
steps,
exporters)
https://www.tensorflow.org/api_docs/python/tf/estimator/BestExporter
我一直在使用 https://github.com/bluecamel/best_checkpoint_copier,它对我来说效果很好。
示例:
best_copier = BestCheckpointCopier(
name='best', # directory within model directory to copy checkpoints to
checkpoints_to_keep=10, # number of checkpoints to keep
score_metric='metrics/total_loss', # metric to use to determine "best"
compare_fn=lambda x,y: x.score < y.score, # comparison function used to determine "best" checkpoint (x is the current checkpoint; y is the previously copied checkpoint with the highest/worst score)
sort_key_fn=lambda x: x.score,
sort_reverse=False) # sort order when discarding excess checkpoints
传递给你的 eval_spec:
eval_spec = tf.estimator.EvalSpec(
...
exporters=best_copier,
...)
如果您正在使用 tensorflow/models 的模型存储库进行训练。
models/research/object_detection/model_lib.py
文件 create_train_and_eval_specs
函数可以修改为包含最佳导出器:
final_exporter = tf.estimator.FinalExporter(
name=final_exporter_name, serving_input_receiver_fn=predict_input_fn)
best_exporter = tf.estimator.BestExporter(
name="best_exporter",
serving_input_receiver_fn=predict_input_fn,
event_file_pattern='eval_eval/*.tfevents.*',
exports_to_keep=5)
exporters = [final_exporter, best_exporter]
train_spec = tf.estimator.TrainSpec(
input_fn=train_input_fn, max_steps=train_steps)
eval_specs = [
tf.estimator.EvalSpec(
name=eval_spec_name,
input_fn=eval_input_fn,
steps=eval_steps,
exporters=exporters)
]