问题:如何在TensorFlow中将张量转换为numpy数组?
将Tensorflow与Python绑定一起使用时,如何将张量转换为numpy数组?
回答 0
由Session.run
或eval
为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'>
回答 1
要将张量转换回numpy数组,您只需.eval()
在转换后的张量上运行即可。
回答 2
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的映射。
回答 3
你需要:
- 将图像张量以某种格式(jpeg,png)编码为二进制张量
- 在会话中评估(运行)二进制张量
- 将二进制文件转换为流
- 饲料到PIL图像
- (可选)使用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)
回答 5
在张量表示(对抗性)图像的特定情况下,我已经面对并解决了张量- > 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。
回答 6
一个简单的例子可能是
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
我正在寻找此命令的日子。
在任何会议或类似活动之外,这对我都有效。
# 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
回答 8
您可以使用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'>
希望对您有所帮助!