当使用Tensorflow与Python绑定时,如何将一个张量转换为numpy数组?
当前回答
任何由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'>
其他回答
为了这个命令,我找了好几天。
这对我来说在任何会议之外或类似的事情都很有效。
# 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
也许你可以试试这个方法:
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,但这将影响模型的性能。
我成功地把TensorGPU变成了np。数组使用以下 :
np.array(tensor_gpu.as_cpu())
(直接使用TensorGPU只会导致包含TensorGPU的单元素数组)。
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的映射。
推荐文章
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- django MultiValueDictKeyError错误,我如何处理它
- 如何在for循环期间修改列表条目?
- 我如何在Django中创建一个鼻涕虫?
- 没有名为'django.core.urlresolvers'的模块
- 蟒蛇导出环境文件
- Django - makemigrations -未检测到任何更改
- SQLAlchemy:引擎、连接和会话差异
- 在Python Pandas中删除多个列中的所有重复行
- 更改pandas DataFrame中的特定列名
- 将Pandas多索引转换为列
- 熊猫在每组中获得最高的n个记录
- 熊猫数据帧得到每组的第一行