操纵tf.data.Dataset我得到一个行为,我无法理解的起源。我正在操作一个tf.data.Dataset,这是一个简单的整数缓冲区,在这里我想向每个数字中添加一个随机整数(重要的一点)。TF提供了一个映射函数,用于将转换(生成器)应用于数据集的每个元素。如果我编码:
seed(0)
dataset = tf.data.Dataset.from_tensor_slices([1, 1, 1, 1, 1, 1])
dataset = dataset.map(lambda x: x + randint(0,9))
print(list(dataset.as_numpy_iterator())) 此代码将无法按我所需返回。随机生成器只应用一次(返回6),并应用于缓冲区的每个元素。我得到了[7, 7, 7, 7 ,7 ,7 ,7]。
但是,如果我编码:
seed(0)
dataset = tf.data.Dataset.from_tensor_slices([1, 1, 1, 1, 1, 1])
dataset = dataset.map(lambda x: x + tf.random.uniform([], minval=0, maxval=9, dtype=tf.dtypes.int32, seed=2))
print(list(dataset.as_numpy_iterator()))返回[7, 8, 1, 9, 1, 4] (我需要的)。我很困惑,为什么第一个版本不能工作,生成器被应用了,但是函数randint(0,9)只执行了一次。有什么建议吗?
谢谢,
蒂莫卡夫
发布于 2022-04-25 00:44:19
在第二种情况下,生成随机整数是图的一部分,因为您使用graph。因此,每次图形运行时,生成随机整数的过程都会重新运行。在第一种情况下,随机整数首先生成,然后参与计算图。所以他们的行为就像常数。这是因为它们不是由tf生成的。
https://stackoverflow.com/questions/69108284
复制相似问题