tensorflow数据集顺序未定义?

tensorflow数据集顺序未定义?,tensorflow,tensorflow-datasets,Tensorflow,Tensorflow Datasets,如果我使用tf.data.Dataset数据集中的多个元素来构建图,然后稍后对图进行求值,那么数据集中元素的顺序似乎是未定义的。例如,下面的代码片段 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

如果我使用tf.data.Dataset数据集中的多个元素来构建图,然后稍后对图进行求值,那么数据集中元素的顺序似乎是未定义的。例如,下面的代码片段

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]

评估每个元素

01 2 3 4

此外,每次运行都会产生不同的“构建图,然后评估”。
我希望“构建图,然后评估”和“评估每个元素”一样有序。有人能解释为什么会发生这种情况吗?

tf.data.Dataset的顺序是定义的和确定性的(除非添加非确定性的
Dataset.shuffle()

但是,您的两个循环构建了不同的图形,这说明了差异:

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

  • “eval each element”部分还创建了五个
    迭代器.get_next()
    操作,但它按顺序运行这些操作,因此您总是按照预期的顺序获得结果

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

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) 

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

但是,您的两个循环构建了不同的图形,这说明了差异:

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

  • “eval each element”部分还创建了五个
    迭代器.get_next()
    操作,但它按顺序运行这些操作,因此您总是按照预期的顺序获得结果

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

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) 
来自TensorFlow常见问题解答

单独的ops具有并行实现,在CPU中使用多个内核,或在GPU中使用多个线程

因此,您的“build graph then eval”调用对列表中的每个元素并行运行,这就是为什么数字是随机顺序的,而for循环强制一个调用一个接一个地运行,因此它是串行的。您可以通过对两者进行计时来验证,第一个应该是快的,for循环将是慢的。

来自TensorFlow常见问题解答

单独的ops具有并行实现,在CPU中使用多个内核,或在GPU中使用多个线程

因此,您的“build graph then eval”调用对列表中的每个元素并行运行,这就是为什么数字是随机顺序的,而for循环强制一个调用一个接一个地运行,因此它是串行的。您可以通过对两者进行计时来验证,第一个应该是快的,for循环将是慢的