首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >evaluation_loop与train_loop在tf-slim中的应用

evaluation_loop与train_loop在tf-slim中的应用
EN

Stack Overflow用户
提问于 2016-09-27 19:04:05
回答 3查看 5.8K关注 0票数 11

我正在尝试实现几种不同的模型,并在CIFAR-10上对它们进行培训,我想使用TF-slim来实现这一点。看起来TF-slim有两个在训练中有用的主回路: train_loop和evaluation_loop。

我的问题是:使用这些循环的标准方法是什么?作为后续:是否可以在train_loop中使用早期停止?

目前,我有一个模型,我的培训文件train.py如下所示

代码语言:javascript
复制
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的第二个文件,它包含了我的评估循环。

代码语言:javascript
复制
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)我目前有一个用于evaluation_loop占用整个GPU的模型,但很少使用它。我想有更好的方法来分配资源。如果我可以使用相同的evaluation_loop来监视多个不同模型(多个目录中的检查点)的进程,那就太好了。这样的事有可能吗?

2)评价与培训之间没有反馈。我正在训练大量的模型,并且很乐意使用早期停止来停止那些没有学习或没有收敛的模型。有办法这样做吗?理想情况下,使用来自验证集的信息,但如果必须仅基于培训数据,这也没关系。

3)我的工作流程是否都是错误的,我应该以不同的方式构造它吗?从文档中还不清楚如何在培训的同时使用评估。

更新似乎在Tfr0.11调用slim.evaluation.evaluation_loop时也得到了一个段错误。这种情况有时才会发生(对我来说,当我将作业分派到集群时)。它发生在sv.managed_session--特别是prepare_or_wait_for_session。这仅仅是由于评估循环(tensorflow的第二个实例)试图使用GPU,而GPU已经被第一个实例征用了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-02 15:12:17

  1. evaluation_loop意味着与单个目录一起使用(就像您目前使用的那样)。如果您想提高效率,可以使用slim.evaluation.evaluate_once,并根据需要添加适当的交换目录逻辑。
  2. 您可以通过重写slim.learning.train(.,train_step_fn)参数来做到这一点。此参数将“train_step”函数替换为自定义函数。在这里,您可以提供自定义的培训函数,它返回“total_loss”和“should_stop”值,这是您认为合适的。
  3. 您的工作流程看起来很棒,这可能是使用TF-Slim学习/评估的最常见的工作流。
票数 6
EN

Stack Overflow用户

发布于 2017-03-26 10:37:37

多亏了@kmalakoff,TensorFlow问题为如何在tf.slim培训中验证或测试模型这个问题提供了一个很好的方法。其主要思想是重写train_step_fn函数:

代码语言:javascript
复制
import …
from tensorflow.contrib.slim.python.slim.learning import train_step

...

accuracy_validation = ...
accuracy_test = ...

def train_step_fn(session, *args, **kwargs):
    total_loss, should_stop = train_step(session, *args, **kwargs)

    if train_step_fn.step % FLAGS.validation_every_n_step == 0:
        accuracy = session.run(train_step_fn.accuracy_validation)
        print('your validation info')

    if train_step_fn.step % FLAGS.test_every_n_step == 0:
        accuracy = session.run(train_step_fn.accuracy_test)
        print('your test info')

    train_step_fn.step += 1
    return [total_loss, should_stop] 

train_step_fn.step = 0
train_step_fn.accuracy_validation = accuracy_validation
train_step_fn.accuracy_test = accuracy_test

# run training.
slim.learning.train(
    train_op,
    FLAGS.logs_dir,
    train_step_fn=train_step_fn,
    graph=graph,
    number_of_steps=FLAGS.max_steps)
票数 6
EN

Stack Overflow用户

发布于 2017-02-13 08:38:37

加上我的2美分:

我目前有这个模型用于evaluation_loop占用整个GPU,但它很少被使用

通常,评估模型占用的GPU内存较少。通过将会话配置allow_growth设置为True,可以防止TF占用整个GPU内存。这样,您就可以使用相同的GPU进行培训和评估。

示例@培训

代码语言:javascript
复制
session_config = tf.ConfigProto()
session_config.gpu_options.allow_growth = 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,
                  session_config=session_config)

示例@验证

代码语言:javascript
复制
session_config = tf.ConfigProto()
session_config.gpu_options.allow_growth = True

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=session_config)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39732460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档