tensorflow数据集顺序未定义?
如果我使用tf.data.Dataset数据集中的多个元素来构建图,然后稍后对图进行求值,那么数据集中元素的顺序似乎是未定义的。例如,下面的代码片段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
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()
数据集上循环时,请尝试使用以下模式:
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循环将是慢的