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


Answers:


134

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.run或是eval()一个NumPy数组。例如,稀疏张量作为SparseTensorValue返回:

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

AttributeError的:模块“tensorflow”没有属性“会话”
的JürgenK.

77

要将张量转换回numpy数组,您只需.eval()在转换后的张量上运行即可。


5
澄清:yourtensor.eval()
MRK

12
我知道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)'这仅在Tensoflow会话期间可用吗?
Eduardo Pignatelli,

@EduardoPignatelli它在Theano为我工作,不需要任何额外的工作。不确定tf。
BallpointBen

5
@EduardoPignatelli,您需要.eval()在一个会话中运行方法调用: sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
duhaime,

通过使用此我得到错误的AttributeError的:“张量”对象有没有属性“的eval”
Aakash AGGARWAL

71

TensorFlow 2.x

急切执行默认情况下.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的映射。


2
如何在tf.function中执行此操作?
mathtick

@mentalmushroom找不到文档,但是在自定义手册中提到了该文档 。可以在源代码中找到更多详细信息。
nish-ant

5
I get the following error in TF 2.0: "'Tensor' object has no attribute 'numpy'"
Will.Evo

@ Will.Evo您可能在运行此功能之前禁用了急切执行。检查我的答案的后半部分可以在哪里使用eval()
cs95

2
不,我没有禁用热切的执行。仍然得到AttributeError的:“张量”对象有没有属性“numpy的”
杰弗里·安德森

6

你需要:

  1. 将图像张量以某种格式(jpeg,png)编码为二进制张量
  2. 在会话中评估(运行)二进制张量
  3. 将二进制文件转换为流
  4. 饲料到PIL图像
  5. (可选)使用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)

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

%matplotlib inline

4

也许您可以尝试一下,这种方法:

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)

2

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

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

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

似乎tensor.eval()方法可能还需要输入占位符的值才能成功。张量可能像需要feed_dict返回输入值(提供)的函数一样工作,例如返回

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

请注意,在我的情况下,占位符名称为x,但我想您应该为输入的占位符找出正确的名称。 x_input is a scalar value or array containing input data.

就我而言,提供sess也是强制性的。

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


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

就如此容易!


//不用于在python中进行注释。请修改您的答案。
弗拉德


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

希望对您有所帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.