我对TensorFlow缺乏经验。我看到的教程解释了tf.Tensor
上的Python操作构建了一个抽象的计算图,其中的一部分稍后会被评估。因此,在以下代码中,我期望看到tf.cast
将是默认图上的操作。它不是。如果未在默认图表上评估此操作,则如何评估?
>>> import tensorflow as tf
>>> def mapper(src):
... print('in mapper')
... return tf.cast(src, tf.float32)
...
>>> d = tf.data.Dataset.range(2).map(mapper)
in mapper
>>> get_next = d.make_one_shot_iterator().get_next()
>>> with tf.Session() as sess:
... print(sess.run(get_next))
... print(sess.run(get_next))
...
0.0
1.0
>>> tf.get_default_graph().get_operations()
[<tf.Operation 'start' type=Const>, <tf.Operation 'stop' type=Const>, <tf.Operation 'step' type=Const>, <tf.Operation 'OneShotIterator' type=OneShotIterator>, <tf.Operation 'IteratorToStringHandle' type=IteratorToStringHandle>, <tf.Operation 'IteratorGetNext' type=IteratorGetNext>]
答案 0 :(得分:1)
map函数作为TensorFlow图函数运行,即wrapped in a Defun
decorator。 Defun
尚未成为公共TensorFlow API的一部分,但您可以在Defun class docstring中了解它。
所以在一个层面上它是一个新的图形,因为这是Defun
的实现方式。我相信Dataset
在这里使用Defun
,以便映射转换可以应用于不同的设备/工作者而不会炸毁图形的大小(因此任何使用的变量都被提升并定义一次)。