在使用带有Python绑定的Tensorflow时,如何将张量转换为numpy数组?
由Session.run
或返回的任何张量eval
是NumPy数组.
>>> print(type(tf.Session().run(tf.constant([1,2,3]))))
要么:
>>> sess = tf.InteractiveSession() >>> print(type(tf.constant([1,2,3]).eval()))
或者,等效地:
>>> sess = tf.Session() >>> with sess.as_default(): >>> print(type(tf.constant([1,2,3]).eval()))
编辑:没有任何张量返回Session.run
或是eval()
NumPy数组.例如,稀疏张量作为SparseTensorValue返回:
>>> print(type(tf.Session().run(tf.SparseTensor([[0, 0]],[1],[1,2]))))
要从张量转换回numpy数组,您可以简单地运行.eval()
转换张量.
急切执行默认情况下.numpy()
处于启用状态,因此只需调用Tensor对象即可。
import tensorflow as tf a = tf.constant([[1, 2], [3, 4]]) b = tf.add(a, 1) a.numpy() # array([[1, 2], # [3, 4]], dtype=int32) b.numpy() # array([[2, 3], # [4, 5]], dtype=int32) tf.multiply(a, b).numpy() # array([[ 2, 6], # [12, 20]], dtype=int32)
值得注意的是(来自文档),
Numpy数组可以与Tensor对象共享内存。对一个的任何更改都可能反映在另一个上。
大胆强调我的。副本可能会也可能不会返回,这是实现的详细信息。
如果禁用了“急切执行”,则可以构建一个图形,然后通过tf.compat.v1.Session
以下方式运行它:
a = tf.constant([[1, 2], [3, 4]]) b = tf.add(a, 1) out = tf.multiply(a, b) out.eval(session=tf.compat.v1.Session()) # array([[ 2, 6], # [12, 20]], dtype=int32)
另请参见TF 2.0符号映射,以获取旧API到新API的映射。
你需要:
将图像张量以某种格式(jpeg,png)编码为二进制张量
在会话中评估(运行)二进制张量
将二进制文件转换为流
送入PIL图片
(可选)使用matplotlib显示图像
码:
import tensorflow as tf import matplotlib.pyplot as plt import PIL ... image_tensor =jpeg_bin_tensor = tf.image.encode_jpeg(image_tensor) with tf.Session() as sess: # display encoded back to image data jpeg_bin = sess.run(jpeg_bin_tensor) jpeg_str = StringIO.StringIO(jpeg_bin) jpeg_image = PIL.Image.open(jpeg_str) plt.imshow(jpeg_image)
这对我有用。您可以在ipython笔记本中尝试。只是不要忘记添加以下行:
%matplotlib inline