7

我正在使用启用了 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())

print(new_ex) 输出:

Tensor("add:0", shape=(10,), dtype=int64)

在 mapfunc 之外,它工作正常。但在其中,传递的示例没有值,也没有 .numpy() 属性。

4

1 回答 1

9

转换实际上是作为一个图执行的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())

希望有帮助。

请注意,通过将 a 添加py_func到数据集,单线程 Python 解释器将在循环中生成每个元素。

于 2018-05-26T00:14:46.783 回答