在Tensorflow中转换张量到numpy数组?

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

759111 次浏览

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

你需要:

  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)

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

%matplotlib inline

任何由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'>

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

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)

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

我认为我的问题/答案(在这里)可能是一个有用的例子,也为其他情况。

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

看起来,为了成功,tensor.eval()方法可能还需要输入占位符的值。 Tensor的工作方式可能类似于需要输入值(提供给feed_dict)以返回输出值的函数,例如

array_out = tensor.eval(session=sess, feed_dict={x: x_input})
请注意,在我的例子中占位符名称是x,但我认为你应该为输入占位符找到正确的名称。 x_input是一个包含输入数据的标量值或数组

在我的例子中,还必须提供sess

我的例子还包括matplotlib图像可视化部分,但这是OT。

一个简单的例子是,

    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.
< p > n 现在如果我们想把这个张量a转换成一个

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

就这么简单!

TensorFlow 2.倍

急切的执行是默认启用的,所以只需要在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复制到主机内存)。

< p > 但是为什么我得到AttributeError: 'Tensor' object has no attribute 'numpy'?
很多人都评论了这个问题,有几个可能的原因:

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

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

为了这个命令,我找了好几天。

这对我来说在任何会议之外或类似的事情都很有效。

# you get an array = your tensor.eval(session=tf.compat.v1.Session())
an_array = a_tensor.eval(session=tf.compat.v1.Session())

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

您可以使用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'>

我希望这能有所帮助!

如果你看到有一个方法_numpy (), 例如,对于一个EagerTensor,简单地调用上面的方法,你将得到一个ndarray

可以用以下方法将tensorflow中的张量转换为numpy数组。

< >强: 使用np.array(your_tensor) < / p >

第二:< >强 使用your_tensor.numpy < / p >

关于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.function中。如果你真的需要运行tensor.numpy(),你可以在model.compile(*)中设置参数run_eagerly=True,但这将影响你的模型的性能。