如何在TensorFlow中将张量转换为numpy数组?
numpy
python
tensorflow
8
0

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

参考资料:
Stack Overflow
收藏
评论
共 7 个回答
高赞 时间 活跃

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

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

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

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

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

请注意,在我的情况下,占位符名称为x ,但我想您应该为输入的占位符找出正确的名称。 x_input是包含输入数据的标量值或数组。

就我而言,还必须提供sess

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

收藏
评论

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

收藏
评论

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

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)
收藏
评论

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

就如此容易!

收藏
评论

你需要:

  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
收藏
评论

TensorFlow 2.x

急切执行默认情况下.numpy()启用状态,因此只需在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数组可以与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的映射。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号