11

いくつかの異なるモデルを実装して CIFAR-10 でトレーニングしようとしていますが、これを行うために TF-slim を使用したいと考えています。TF-slim には、トレーニング中に役立つ 2 つの主要なループ (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、評価ループを含む という 2 番目のファイルを作成しました。

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 全体を占有する Evaluation_loop 用のこのモデルを持っていますが、めったに使用されていません。リソースを割り当てるためのより良い方法があると思います。複数の異なるモデル (複数のディレクトリ内のチェックポイント) の進行状況を監視するために同じ Evaluation_loop を使用できれば、非常に便利です。このようなことは可能ですか?

2) 評価とトレーニングの間にフィードバックはありません。私は大量のモデルをトレーニングしていますが、早期停止を使用して、学習していないモデルや収束していないモデルを停止したいと考えています。これを行う方法はありますか?理想的には検証セットからの情報を使用しますが、トレーニング データに基づいている必要がある場合も問題ありません。

3) 私のワークフローはすべて間違っているのでしょうか? 別の方法で構成する必要がありますか? ドキュメントからは、トレーニングと組み合わせて評価を使用する方法が明確ではありません。

更新 ~~TF r0.11 の時点で、 を呼び出すときに segfault も発生しているようslim.evaluation.evaluation_loopです。たまにしか発生しません(私の場合、ジョブをクラスターにディスパッチするとき)。~~これは、評価ループ (sv.managed_sessionテンソルprepare_or_wait_for_sessionフローの 2 番目のインスタンス) が、最初のインスタンスによって既に要求されている GPU を使用しようとしたためです。

4

3 に答える 3