imshow()numpy()有困难,并且渴望在tf2.0中执行

时间:2019-09-04 22:40:46

标签: tensorflow2.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中默认启用,但是...

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__除外)。

编辑:

根据this answer,问题可能是因为我试图调试tf.data.Dataset.map()调用内的函数,该函数可用于静态图形。所以也许问题就变成了“我该如何调试这些功能?”

1 个答案:

答案 0 :(得分:0)

对我来说,关键的见解是运行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

文档https://www.tensorflow.org/beta/guide/data

中有一个对py_function的有用解释和演示。