具有渴望模式的 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)的主要内容,如果未能解决你的问题,请参考以下文章

java设计模式之装饰模式

TFJS中渴望风格的性能成本是多少?

JavaScript设计模式与开发实践第一部分

EF Core:渴望加载(.Include)子类别(自我引用)

PMP项目资源管理—激励理论、影响力、权力

Laravel:渴望加载特定的列