我对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>]
1 回答
map函数作为TensorFlow图函数运行,即wrapped in a Defun decorator .
Defun
尚未成为公共TensorFlow API的一部分,但您可以在Defun class docstring中阅读它 .所以在一个层面上's a new graph because that'是如何实现
Defun
的 . 我相信Dataset
在这里使用Defun
,这样映射转换可以应用于不同的设备/工作者而不会炸毁图形的大小(因此任何使用的变量都被提升并定义一次) .