【问题标题】:tensorflow Dataset order undefined?张量流数据集顺序未定义?
【发布时间】:2017-12-12 21:06:41
【问题描述】:

如果我使用 tf.data.Dataset 数据集中的多个元素来构建图表,然后稍后评估图表,则数据集中元素的顺序似乎是未定义的。举个例子,下面的代码sn -p

import tensorflow as tf

dataset = tf.data.Dataset.range(5)
iterator = dataset.make_one_shot_iterator()


print 'build graph and then eval'
keep = []
for i in range(5):
  keep.append(iterator.get_next())

with tf.Session() as sess:
  keep_eval = sess.run(keep)
  print keep_eval


print 'eval each element'
with tf.Session() as sess:
  for i in range(5):
    print sess.run(iterator.get_next()), 

将产生如下输出:

构建图然后评估

[3 0 1 4 2]

评估每个元素

0 1 2 3 4

此外,每次运行都会产生不同的“构建图然后评估”。 我希望“构建图然后评估”像“评估每个元素”一样被订购。谁能解释一下为什么会这样?

【问题讨论】:

    标签: tensorflow tensorflow-datasets


    【解决方案1】:

    tf.data.Dataset 的顺序已定义且具有确定性(除非您添加非确定性Dataset.shuffle())。

    但是,您的两个循环构建了不同的图表,这导致了差异:

    • “构建图然后评估”部分创建一个包含五个iterator.get_next() 操作的列表,并并行运行这五个操作。由于这些操作是并行运行的,因此它们可能会以不同的顺序产生结果。

    • “评估每个元素”部分还创建了五个iterator.get_next() 操作,但它按顺序运行它们,因此您始终可以按预期顺序获得结果。

    请注意,我们不建议在循环中调用 iterator.get_next(),因为它会在每次调用时创建一个新操作,该操作会添加到图中并消耗内存。相反,当您遍历 Dataset 时,请尝试使用以下模式:

    dataset = tf.data.Dataset.range(5)
    iterator = dataset.make_one_shot_iterator()
    
    # Call `iterator.get_next()` once and use the result in each iteration.
    next_element = iterator.get_next()
    
    with tf.Session() as sess:
      for i in range(5):
        print sess.run(next_element) 
    

    【讨论】:

      【解决方案2】:

      来自 TensorFlow 常见问题解答here

      各个操作具有并行实现,在 CPU 中使用多个内核,或在 GPU 中使用多个线程。

      因此,您的“构建图然后评估”调用对列表中的每个元素并行运行,这就是数字按随机顺序排列的原因,而 for 循环强制一个调用一个接一个地运行,因此它是串行的。你可以通过定时来验证,第一个应该快,for循环会慢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-04
        • 1970-01-01
        • 2017-04-28
        • 1970-01-01
        • 2021-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多