tf.data.Dataset调用map时普通randint仅执行一次的原因是什么?
问题原因解答
为什么普通randint仅执行一次
- TensorFlow的
tf.data.Dataset.map在调用时会先将传入的转换逻辑编译为静态计算图,整个图结构仅构建一次。 - 你使用的
randint是Python原生随机函数,不属于TensorFlow图操作,只会在计算图构建阶段执行一次,得到的固定整数会作为常量被写入计算图。后续遍历数据集处理每个元素时,都会直接复用这个固定常量,不会重新生成随机数,所以所有元素都会加同一个值。
为什么tf.random.uniform符合预期
tf.random.uniform是TensorFlow原生的随机数生成操作,会被作为动态节点加入计算图。- 每次计算图运行(即处理每个数据集元素)时,该节点都会被重新执行一次,生成新的随机整数,因此每个元素叠加的数值都不同,符合你的需求。
额外注意事项
- 如果确实需要在
map中使用Python原生逻辑,需要用tf.py_function对自定义逻辑做包装,但这种方式会打断图优化,性能低于原生TF操作,非必要不推荐使用。 - 若需要固定随机结果保证可复现,需要同时设置TensorFlow全局随机种子和随机操作的本地种子,仅设置Python侧的
seed不会影响TF原生随机操作的结果。
内容的提问来源于stack exchange,提问作者Timocafé
相关产品推荐
相关产品推荐

