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


当前回答

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

其他回答

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

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)

关于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,但这将影响模型的性能。

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

任何由Session.run或eval返回的张量都是NumPy数组。

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

Or:

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

EDIT: Session.run或eval()返回的张量不是NumPy数组。例如,稀疏张量返回为SparseTensorValue:

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

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