2016-09-21 7 views
4

私は便利ですが速度の劣ったプレースホルダから切り替えた後、キューのランナーを通してグラフにデータがあります。Tensorflowデータ入力トグル:列車/妥当性確認

各トレーニングエポックの後、私は検証パスを実行したいと思います。トレーニングパス以外では、検証パスは異なるデータを使用し、増強もシャフリングも使用しません。

質問は簡単です:これらのものをどのように切り替えるのですか?

いくつかの観察:

  • 私はtf.placeholderブールを通じてstring_input_producershuffleオプションを切り替えることができません。
  • 私が見つけたオンラインの唯一の例は、placeholderを使用して検証データからトレーニングを分離しています。これらは順番に、上位キューランナーを使用しないでください。
  • 私はtf.cond()で上記を行うことができました。is_trainingtf.placeholderブール値をテストして、feed_dictを通過することになりました。このソリューションは最適ですか?このtf.conf()の方法はどれくらいの費用がかかりますか?
+0

['tf.cond'は解決策ではありません](https://groups.google.com/a/tensorflow.org/forum/#!msg/discuss)/mLrt5qc9_uU/sGNbC7GpAwAJ) どちらの側の評価でも、両方のキューを介して物事をプルします。 – mdaoust

+0

'tf.cond'は引き続き使用できますが、ハックがあります。代わりに、 'QueueBase.from_list'があります。参照:https://github.com/tensorflow/tensorflow/issues/2514 - sigh .. – TimZaman

答えて

3

私のためによく働く方法は、tf.placeholder_with_defaultを使用することです:トレーニングの間

images_train, labels_train = train_data_pipeline(fnlist_train, ref_grid) 
images_val, labels_val = val_data_pipeline(fnlist_val, ref_grid) 
images = tf.placeholder_with_default(images_train, shape=[None, FLAGS.nx_image, FLAGS.ny_image, FLAGS.nz_image]) 
labels = tf.placeholder_with_default(labels_train, shape=[None, label_length]) 

imageslabelsがトレーニングキューから直接来ます。断続的な検証手順の場合、私はsess.run()への呼び出しで、imageslabelsをfeed_dictを通してフィードします。唯一のわずかなハックは、検証データが待ち行列のテンソルであり、feed_dictがテンソルを受け入れないためです。sess.run([images_val, labels_val])と呼びます。まず、numpy値を取得してfeed_dictで使用します。うまく動作すると思われ、テンソル==> numpy ==>テンソル変換からの遅延は最小限であり、これは検証中にのみ発生します。

検証データに別々の処理要件がある場合は、個別の検証キューと処理フローを設定するときに処理できます。

+0

これはうまくいくはずで、https://github.com/tensorflow/tensorflow/issues/2514#issuecomment-223447983としても与えられます。しかし、私は厄介な往復を好まない。私たちはもっと良くすることができると確信しています。 – TimZaman

+0

往復に同意します。より良い方法を見つけたら投稿してください。 – RobR

1

考えられる回答の1つはmake_template です。これはhttps://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/kernel_tests/template_test.pyで概要を示しています。

training_input, training_output = ([1., 2., 3., 4.], [2.8, 5.1, 7.2, 8.7]) 
test_input, test_output = ([5., 6., 7., 8.], [11, 13, 15, 17]) 

tf.set_random_seed(1234) 

def test_line(x): 
    m = tf.get_variable("w", shape=[], 
         initializer=tf.truncated_normal_initializer()) 
    b = tf.get_variable("b", shape=[], 
         initializer=tf.truncated_normal_initializer()) 
    return x * m + b 

line_template = template.make_template("line", test_line) 

train_prediction = line_template(training_input) 
test_prediction = line_template(test_input) 

train_loss = tf.reduce_mean(tf.square(train_prediction - training_output)) 
test_loss = tf.reduce_mean(tf.square(test_prediction - test_output)) 

optimizer = tf.train.GradientDescentOptimizer(0.1) 
train_op = optimizer.minimize(train_loss) 

with tf.Session() as sess: 
    sess.run(tf.initialize_all_variables()) 
    initial_test_loss = sess.run(test_loss) 
    sess.run(train_op) 
    final_test_loss = sess.run(test_loss) 

# Parameters are tied, so the loss should have gone down when we trained it. 
self.assertLess(final_test_loss, initial_test_loss)