我正在尝试实现一些不同的模型并在 CIFAR-10 上训练它们,我想使用 TF-slim 来做到这一点。看起来 TF-slim 有两个在训练期间有用的主要循环:train_loop 和 evaluation_loop。
我的问题是:使用这些循环的规范方法是什么?
作为后续:是否可以使用 train_loop 提前停止?
目前我有一个模型,我的训练文件 train.py 看起来像这样
import ...
train_log_dir = ...
with tf.device("/cpu:0"):
images, labels, dataset = set_up_input_pipeline_with_fancy_prefetching(
subset='train', ... )
logits, end_points = set_up_model( images ) // Possibly using many GPUs
total_loss = set_up_loss( logits, labels, dataset )
optimizer, global_step = set_up_optimizer( dataset )
train_tensor = slim.learning.create_train_op(
total_loss,
optimizer,
global_step=global_step,
clip_gradient_norm=FLAGS.clip_gradient_norm,
summarize_gradients=True)
slim.learning.train(train_tensor,
logdir=train_log_dir,
local_init_op=tf.initialize_local_variables(),
save_summaries_secs=FLAGS.save_summaries_secs,
save_interval_secs=FLAGS.save_interval_secs)
到目前为止这非常棒——我的模型都训练和收敛得很好。我可以从事件中看到这一点train_log_dir
所有指标都朝着正确的方向发展。朝着正确的方向前进让我很高兴。
但我想检查验证集上的指标是否也在改进。我不知道有什么方法可以与训练循环很好地配合 TF-slim,所以我创建了第二个文件,名为eval.py
其中包含我的评估循环。
import ...
train_log_dir = ...
with tf.device("/cpu:0"):
images, labels, dataset = set_up_input_pipeline_with_fancy_prefetching(
subset='validation', ... )
logits, end_points = set_up_model( images )
summary_ops, names_to_values, names_to_updates = create_metrics_and_summary_ops(
logits,
labels,
dataset.num_classes() )
slim.get_or_create_global_step()
slim.evaluation.evaluation_loop(
'',
checkpoint_dir=train_log_dir,
logdir=train_log_dir,
num_evals=FLAGS.num_eval_batches,
eval_op=names_to_updates.values(),
summary_op=tf.merge_summary(summary_ops),
eval_interval_secs=FLAGS.eval_interval_secs,
session_config=config)
问题:
1) 我目前有一个用于评估循环的模型,占用了整个 GPU,但很少使用。我认为有更好的方法来分配资源。如果我可以使用相同的评估循环来监视多个不同模型(多个目录中的检查点)的进度,那就太好了。这样的事情可能吗?
2)评估和培训之间没有反馈。我正在训练大量模型,并且希望使用提前停止来停止那些无法学习或无法收敛的模型。有没有办法做到这一点?理想情况下使用验证集中的信息,但如果它必须仅基于训练数据,也可以。
3)我的工作流程是否全部错误,我应该以不同的方式构建它?文档中并不清楚如何将评估与培训结合使用。
Update~~似乎从 TF r0.11 开始,我在调用时也遇到了段错误slim.evaluation.evaluation_loop
。它只是有时发生(对我来说,当我将工作分配到集群时)。它发生在sv.managed_session
- 具体来说prepare_or_wait_for_session
.~~
这只是由于评估循环(张量流的第二个实例)尝试使用 GPU,而 GPU 已被第一个实例占用。