具有渴望模式的 TF.data.dataset.map(map_func)
Posted
技术标签:
【中文标题】具有渴望模式的 TF.data.dataset.map(map_func)【英文标题】:TF.data.dataset.map(map_func) with Eager Mode 【发布时间】:2018-11-05 09:00:02 【问题描述】:我正在使用启用了 Eager 模式的 TF 1.8。
我无法在 mapfunc 中打印示例。当我从 mapfunc 中运行 tf.executing_eagerly() 时,我得到“False”
import os
import tensorflow as tf
tf.logging.set_verbosity(tf.logging.ERROR)
tfe = tf.contrib.eager
tf.enable_eager_execution()
x = tf.random_uniform([16,10], -10, 0, tf.int64)
print(x)
DS = tf.data.Dataset.from_tensor_slices((x))
def mapfunc(ex, con):
import pdb; pdb.set_trace()
new_ex = ex + con
print(new_ex)
return new_ex
DS = DS.map(lambda x: mapfunc(x, [7]))
DS = DS.make_one_shot_iterator()
print(DS.next())
打印(new_ex)输出:
Tensor("add:0", shape=(10,), dtype=int64)
在 mapfunc 之外,它工作正常。但在其中,传递的示例没有值,也没有 .numpy() 属性。
【问题讨论】:
【参考方案1】:tf.data
转换实际上是作为图形执行的,因此 map 函数本身不会急切地执行。有关此问题的更多讨论,请参阅 #14732。
如果你真的需要 map 函数的急切执行,你可以使用tf.contrib.eager.py_func
,比如:
DS = DS.map(lambda x: tf.contrib.eager.py_func(
mapfunc,
[x, tf.constant(7, dtype=tf.int64)], tf.int64)
# In TF 1.9+, the next line can be print(next(DS))
print(DS.make_one_shot_iterator().next())
希望对您有所帮助。
请注意,通过将py_func
添加到数据集,单线程 Python 解释器将在循环中生成每个元素。
【讨论】:
感谢您的帮助。我将寻求在 Dev Summit '18 期间宣传的性能优化技术。我将它用于文本,并使用它以更优雅的方式传递不同的预处理函数。 我刚刚注意到的另一件事:在参数列表中,您只能传递张量,而不能传递一般对象,例如另一个函数。就我而言,我想传递一个标记器,因为我正在处理文本,但无论如何这在 mapfunc 函数的主体中仍然是可行的。以上是关于具有渴望模式的 TF.data.dataset.map(map_func)的主要内容,如果未能解决你的问题,请参考以下文章