当使用Tensorflow与Python绑定时,如何将一个张量转换为numpy数组?
当前回答
你需要:
将图像张量以某种格式(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)
这对我很管用。你可以在ippython笔记本上试试。别忘了加上下面这行:
%matplotlib inline
其他回答
TensorFlow 1.倍
文件夹特遣部队。1、只需使用以下命令:
a = tf.constant([[1, 2], [3, 4]])
b = tf.add(a, 1)
out = tf.multiply(a, b)
out.eval(session=tf.Session())
输出将是:
# array([[ 2, 6],
# [12, 20]], dtype=int32)
要将张量转换回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'>
关于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,但这将影响模型的性能。
我已经面对并解决了张量->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。
推荐文章
- 如何动态加载Python类
- 有没有办法在python中做HTTP PUT
- “foo Is None”和“foo == None”之间有什么区别吗?
- 类没有对象成员
- Django模型“没有显式声明app_label”
- 熊猫能自动从CSV文件中读取日期吗?
- 在python中zip的逆函数是什么?
- 有效的方法应用多个过滤器的熊猫数据框架或系列
- 如何检索插入id后插入行在SQLite使用Python?
- 我如何在Django中添加一个CharField占位符?
- 如何在Python中获取当前执行文件的路径?
- 我如何得到“id”后插入到MySQL数据库与Python?
- super()失败,错误:TypeError "参数1必须是类型,而不是classobj"当父不继承对象
- Python内存泄漏
- 实现嵌套字典的最佳方法是什么?