Tensorflow 如何在tf slim中使用评估环和训练环

Tensorflow 如何在tf slim中使用评估环和训练环,tensorflow,tf-slim,Tensorflow,Tf Slim,我正在尝试实现一些不同的模型,并在CIFAR-10上对它们进行培训,我希望使用TF slim来实现这一点。看起来TF slim有两个在训练中有用的主要循环:训练循环和评估循环 我的问题是:使用这些循环的规范方法是什么? 作为跟进:是否可以使用列车循环的提前停车 目前我有一个模型,我的培训文件train.py如下所示 import ... train_log_dir = ... with tf.device("/cpu:0"): images, labels, dataset = set_u

我正在尝试实现一些不同的模型,并在CIFAR-10上对它们进行培训,我希望使用TF slim来实现这一点。看起来TF slim有两个在训练中有用的主要循环:训练循环和评估循环

我的问题是:使用这些循环的规范方法是什么? 作为跟进:是否可以使用列车循环的提前停车

目前我有一个模型,我的培训文件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\u log\u 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的U循环,但它很少被使用。我想有更好的方法来分配资源。如果我可以使用相同的评估循环来监控多个不同模型(多个目录中的检查点)的进度,那就太好了。这样的事情可能吗

2) 评估和培训之间没有反馈。我正在训练大量的模型,我很想使用提前停止来停止那些没有学习或没有收敛的模型。有办法做到这一点吗?理想情况下,使用来自验证集的信息,但如果必须仅基于培训数据,也可以

3) 我的工作流程是否都错了,我应该以不同的方式组织它?文档中不清楚如何将评估与培训结合使用

更新 ~~似乎从TF r0.11开始,我在调用
slim.evaluation.evaluation\u loop
时也遇到了一个segfault。它只会偶尔发生(对于我来说,当我将作业分派到集群时)。它发生在
sv.managed_session
——特别是
prepare_或\u wait_for_session
~~ 这仅仅是因为evaluation loop(tensorflow的第二个实例)试图使用GPU,而GPU已经被第一个实例征用

  • evaluation_循环用于(正如您当前使用的)单个目录。如果您想提高效率,可以使用slim.evaluation.evaluate_一次,并添加适当的逻辑来交换目录

  • 可以通过重写slim.learning.train(…,train\u step\u fn)参数来实现这一点。此参数将“train_step”函数替换为自定义函数。在这里,您可以提供自定义培训函数,该函数返回您认为合适的“总损失”和“应停止”值

  • 您的工作流程看起来很棒,这可能是使用TF Slim进行学习/评估最常见的工作流程

  • 加上我的2美分:

    我目前有一个评估循环的模型,它占用了一个 整个GPU,但很少被使用

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

    示例@培训

    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)
    
    示例@验证

    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)
    
    感谢@kmalakoff,它为如何在
    tf.slim
    training中验证或测试模型的问题提供了一个很好的方法。主要思想是覆盖
    train\u step\u fn
    功能:

    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)
    

    您是否解决了评估和培训之间的反馈问题?如果是,您能否详细说明如何进行?您如何在整个纪元内运行
    准确性\u验证
    ?我只能让它为一个小批量工作。@michael,你是说代码中的
    准确性\u验证
    只计算一个小批量数据的准确性吗?如果是,那么您可以在源版本中阅读更多详细信息<代码>准确性\验证实际上是一种操作,您可以根据需要提供任意多的数据,包括整个验证数据。