当使用Tensorflow与Python绑定时,如何将一个张量转换为numpy数组?


当前回答

你需要:

将图像张量以某种格式(jpeg, png)编码为二进制张量 在一个会话中计算(运行)二进制张量 将二进制文件转换为流文件 馈送PIL图像 (可选)使用matplotlib显示图像

代码:

import tensorflow as tf
import matplotlib.pyplot as plt
import PIL

...

image_tensor = <your decoded 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)

这对我很管用。你可以在ippython笔记本上试试。别忘了加上下面这行:

%matplotlib inline

其他回答

一个简单的例子是,

    import tensorflow as tf
    import numpy as np
    a=tf.random_normal([2,3],0.0,1.0,dtype=tf.float32)  #sampling from a std normal
    print(type(a))
    #<class 'tensorflow.python.framework.ops.Tensor'>
    tf.InteractiveSession()  # run an interactive session in Tf.

n 现在如果我们想把这个张量a转换成一个numpy数组

    a_np=a.eval()
    print(type(a_np))
    #<class 'numpy.ndarray'>

就这么简单!

你需要:

将图像张量以某种格式(jpeg, png)编码为二进制张量 在一个会话中计算(运行)二进制张量 将二进制文件转换为流文件 馈送PIL图像 (可选)使用matplotlib显示图像

代码:

import tensorflow as tf
import matplotlib.pyplot as plt
import PIL

...

image_tensor = <your decoded 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)

这对我很管用。你可以在ippython笔记本上试试。别忘了加上下面这行:

%matplotlib inline

关于Tensorflow 2.x

以下通常工作,因为默认情况下立即执行是激活的:

import tensorflow as tf

a = tf.constant([[1, 2], [3, 4]])                 
b = tf.add(a, 1)

print(a.numpy())
# [[1 2]
#  [3 4]]

然而,由于很多人似乎都在发布错误:

AttributeError: 'Tensor' object has no attribute 'numpy'

我认为在图形模式下调用tensor.numpy()是行不通的。这就是为什么你会看到这个错误。这里有一个简单的例子:

import tensorflow as tf

@tf.function
def add():
  a = tf.constant([[1, 2], [3, 4]])                 
  b = tf.add(a, 1)
  tf.print(a.numpy()) # throws an error!
  return a
add()

这里可以找到一个简单的解释:

从根本上讲,不能将图张量转换为numpy数组,因为图不在Python中执行——因此在图执行时没有numpy。[…]

TF文档也值得一看。

关于使用Tensorflow 2.x的Keras模型

这也适用于Keras模型,它被封装在tf中。默认为。如果你真的需要运行tensor.numpy(),你可以在model.compile(*)中设置参数run_eager =True,但这将影响模型的性能。

TensorFlow 1.倍

文件夹特遣部队。1、只需使用以下命令:

a = tf.constant([[1, 2], [3, 4]])                 
b = tf.add(a, 1)
out = tf.multiply(a, b)
out.eval(session=tf.Session())

输出将是:

# array([[ 2,  6],
#       [12, 20]], dtype=int32)

TensorFlow 2.倍

Eager Execution在默认情况下是启用的,所以只需在Tensor对象上调用.numpy()即可。

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兼容性。值得注意的是(从文档中),

Numpy数组可以和Tensor对象共享一个内存。其中一个的任何变化都可能反映在另一个中。

大胆强调我的。可能返回副本,也可能不返回,这是基于数据是在CPU还是GPU中的实现细节(在后一种情况下,必须从GPU复制到主机内存)。

但为什么我得到AttributeError: 'Tensor'对象没有属性'numpy'? 很多人都对这个问题发表了评论,有几个可能的原因:

TF 2.0没有正确安装(在这种情况下,请尝试重新安装),或者 已经安装了TF 2.0,但是由于某种原因禁用了快速执行。在这种情况下,调用tf. compatat .v1.enable_eager_execution()来启用它,或参见下文。


如果禁用了Eager Execution,你可以构建一个图,然后通过tf. compatat .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的映射。