如何在TensorFlow中将张量转换为numpy数组?

时间:2015-12-04 20:55:55

标签: python numpy tensorflow

如何在使用Tensorflow和Python绑定时将张量转换为numpy数组?

11 个答案:

答案 0 :(得分:98)

Session.runeval返回的任何张量都是NumPy数组。

>>> print(type(tf.Session().run(tf.constant([1,2,3]))))
<class 'numpy.ndarray'>

或者:

>>> sess = tf.InteractiveSession()
>>> print(type(tf.constant([1,2,3]).eval()))
<class 'numpy.ndarray'>

或等同地:

>>> sess = tf.Session()
>>> with sess.as_default():
>>>    print(type(tf.constant([1,2,3]).eval()))
<class 'numpy.ndarray'>

编辑: Session.runeval()返回的任何张量都是NumPy数组。例如,稀疏张量作为SparseTensorValue返回:

>>> print(type(tf.Session().run(tf.SparseTensor([[0, 0]],[1],[1,2]))))
<class 'tensorflow.python.framework.sparse_tensor.SparseTensorValue'>

答案 1 :(得分:69)

要从张量转换回numpy数组,您只需在转换的张量上运行.eval()

答案 2 :(得分:4)

你需要:

  1. 以某种格式(jpeg,png)将图像张量编码为二进制张量
  2. 评估(运行)会话中的二进制张量
  3. 将二进制文件转换为流
  4. 提供给PIL图像
  5. (可选)使用matplotlib显示图像
  6. 代码:

    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)
    

    这对我有用。你可以在ipython笔记本中试试。只是不要忘记添加以下行:

    %matplotlib inline
    

答案 3 :(得分:3)

TensorFlow 2.0

Eager Execution是默认启用的,因此只需在Tensor对象上调用.numpy()

import tensorflow as tf

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

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)

有关旧API到新API的映射,另请参见TF 2.0 Symbols Map

答案 4 :(得分:2)

也许你可以试试这个方法:

import tensorflow as tf
W1 = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
array = W1.eval(sess)
print (array)

答案 5 :(得分:1)

我已经解决并解决了 tensor-> ndarray 转换问题,具体情况是张量表示(对抗性)图像,这些图像是通过 cleverhans 库/教程获得的。

我认为我的问题/答案(here)对于其他情况也可能是一个有用的例子。

我是TensorFlow的新手,我的结论是这样的:

为了成功,似乎tensor.eval()方法可能还需要输入 placeholders 的值。 张量可能类似于需要其输入值(提供给feed_dict的函数)以返回输出值(例如

)的功能
array_out = tensor.eval(session=sess, feed_dict={x: x_input})

请注意,在我的情况下,占位符名称为 x ,但我想您应该为输入的占位符找到正确的名称。 x_input是包含输入数据的标量值或数组。

就我而言,还必须提供sess

我的示例还涵盖了 matplotlib 图像可视化部分,但这是OT。

答案 6 :(得分:1)

一个简单的例子是

    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'>

就这么简单!

答案 7 :(得分:0)

我正在搜索此命令的日子。

在任何会议或类似活动之外,这对我都有效。

void getData(float &weightP, float &heightP)

https://kite.com/python/answers/how-to-convert-a-tensorflow-tensor-to-a-numpy-array-in-python

答案 8 :(得分:0)

您可以使用keras后端功能。

import tensorflow as tf
from tensorflow.python.keras import backend 

sess = backend.get_session()
array = sess.run(< Tensor >)

print(type(array))

<class 'numpy.ndarray'>

希望对您有帮助!

答案 9 :(得分:0)

如果看到有方法 _numpy(), 例如,对于EagerTensor,只需调用上述方法,您将获得一个ndarray。

答案 10 :(得分:0)

您可以通过以下方式将 tensorflow 中的张量转换为 numpy 数组。

首先: 使用np.array(your_tensor)

第二: 使用your_tensor.numpy