2016-09-21 40 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 - 嘆息.. – 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()的調用中通過feed_dict送入imageslabels。唯一的小缺點就是驗證數據也是來自隊列的張量,而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

一個可能的答案是使用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)