【问题标题】:Tensorflow Data Input Toggle: Train/ValidationTensorFlow 数据输入切换:训练/验证
【发布时间】:2017-01-29 18:30:06
【问题描述】:

在我从方便但速度较差的占位符切换之后,我的数据通过队列运行器进入我的图表。

在每个训练周期之后,我希望运行一次验证通过。除了训练阶段,验证阶段使用不同的数据,没有增强和洗牌。

问题很简单:如何切换这些东西?

一些观察:

  • 我无法通过 tf.placeholder 布尔值切换 string_input_producer 中的 shuffle 选项。
  • 我发现的唯一在线示例使用placeholder 将训练与验证数据分开。反过来,这些也不要使用高级队列运行器。
  • 我确实设法用tf.cond() 完成了上述操作,在这里我将测试我通过feed_dictis_training tf.placeholder 布尔值。这个解决方案是最优的吗?这个tf.conf() 方法有多贵?

【问题讨论】:

标签: python tensorflow


【解决方案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)

【讨论】:

    【解决方案2】:

    适合我的方法是使用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==>张量转换的延迟最小,无论如何这只发生在验证期间。

    对于验证数据有单独处理要求的情况,可以在设置单独的验证队列和处理流程时处理。

    【讨论】:

    • 这应该可以工作,并且它也以github.com/tensorflow/tensorflow/issues/… 的形式给出。但我不喜欢 numpy 往返;我相信我们可以做得更好。
    • 同意往返。如果您找到更好的方法,请发布。
    猜你喜欢
    • 2017-04-30
    • 2016-12-31
    • 2020-10-28
    • 2018-02-27
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 2017-07-08
    相关资源
    最近更新 更多