imshow() numpy() 的困难和 tf2.0 中的急切执行

difficulty with imshow() numpy() and eager execution in tf2.0

我是conda环境下的运行tf2.0,想在图中显示张量

plt.imshow(tmp)
TypeError: Image data of dtype object cannot be converted to float

tmp.dtype
tf.float32

所以我尝试将其转换为 numpy 数组,但是...

print(tmp.numpy())
AttributeError: 'Tensor' object has no attribute 'numpy'

tmp.eval()
ValueError: Cannot evaluate tensor using `eval()`: No default session is registered. Use `with sess.as_default()` or pass an explicit session to `eval(session=sess)`

我在别处读到这是因为我需要一个活跃的会话或急切的执行。在 tf2.0 中应该默认启用 Eager execution,但是...

print(tf.__version__)
2.0.0-alpha0

tf.executing_eagerly()
False

tf.enable_eager_execution()
AttributeError: module 'tensorflow' has no attribute 'enable_eager_execution'

tf.compat.v1.enable_eager_execution()
None

tf.executing_eagerly()
False

sess = tf.Session()
AttributeError: module 'tensorflow' has no attribute 'Session'

我尝试升级到 2.0.0b1,但结果完全一样(tf.__version__ 除外)。

编辑:

根据 ,问题可能是因为我正在尝试调试 tf.data.Dataset.map() 调用中的一个函数,该函数使用静态图。所以也许问题变成了"how do I debug these functions?"

对我来说重要的见解是 运行 tf.data.Dataset.map() 函数构建了一个图形,该图形稍后作为数据管道的一部分执行。所以它更多的是关于代码生成,急切执行不适用。除了缺乏急切执行之外,构建图形还有其他限制,包括所有输入和输出都必须是张量。张量不支持项目分配操作,例如 T[0] += 1.

项目分配是一个相当常见的用例,因此有一个简单的解决方案:tf.py_function(以前是 tf.py_func)。 py_function 使用 numpy 数组作为输入和输出,因此您可以自由使用尚未包含在 tensorflow 库中的其他 numpy 函数。

像往常一样,有一个权衡:py_function 由 python 解释器即时解释。所以它不会像预编译的张量操作那样快。更重要的是,the interpreter threads are not aware of each other, so there may be parallelisation issues.

文档中有对 py_function 的有用解释和演示:https://www.tensorflow.org/beta/guide/data