Wie konvertiere ich einen Tensor in ein Numpy-Array, wenn Sie Tensorflow mit Python-Bindungen verwenden?
Jeder von Session.run
oder eval
zurückgegebene Tensor ist ein NumPy-Array.
>>> print(type(tf.Session().run(tf.constant([1,2,3]))))
<class 'numpy.ndarray'>
Oder:
>>> sess = tf.InteractiveSession()
>>> print(type(tf.constant([1,2,3]).eval()))
<class 'numpy.ndarray'>
Oder gleichwertig:
>>> sess = tf.Session()
>>> with sess.as_default():
>>> print(type(tf.constant([1,2,3]).eval()))
<class 'numpy.ndarray'>
EDIT: Nicht any - von Session.run
oder eval()
zurückgegebener Tensor ist ein NumPy-Array. Sparse Tensors werden beispielsweise als SparseTensorValue zurückgegeben:
>>> print(type(tf.Session().run(tf.SparseTensor([[0, 0]],[1],[1,2]))))
<class 'tensorflow.python.framework.sparse_tensor.SparseTensorValue'>
Um vom Tensor wieder in ein Numpy-Array zu konvertieren, können Sie einfach .eval()
auf dem transformierten Tensor ausführen.
Du musst:
Code:
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)
Das hat bei mir funktioniert. Sie können es in einem ipython-Notebook ausprobieren. Vergessen Sie nicht, folgende Zeile hinzuzufügen:
%matplotlib inline
Eager Execution ist standardmäßig aktiviert, rufen Sie einfach .numpy()
auf dem Tensor-Objekt.
import tensorflow as tf
a = tf.constant([[1, 2], [3, 4]])
b = tf.add(a, 1)
tf.multiply(a, b).numpy()
# array([[ 2, 6],
# [12, 20]], dtype=int32)
Es ist erwähnenswert (aus den Dokumenten),
Numpy Array kann Speicher mit dem Tensor-Objekt gemeinsam nutzen. Änderungen an einem können sich im anderen widerspiegeln.
Meine kühne Betonung. Eine Kopie kann zurückgegeben werden oder nicht, und dies ist ein Implementierungsdetail.
Wenn Eager Execution deaktiviert ist, können Sie ein Diagramm erstellen und es dann über tf.compat.v1.Session
ausführen:
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)
Siehe auch TF 2.0 Symbols Map für eine Zuordnung der alten API zur neuen.
Vielleicht können Sie diese Methode ausprobieren:
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)
Ein einfaches Beispiel könnte sein,
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 jetzt, wenn wir wollen, dass dieser Tensor a in ein Numpy-Array umgewandelt wird
a_np=a.eval()
print(type(a_np))
#<class 'numpy.ndarray'>
So einfach ist das!
Ich habe die Umwandlung von tensor-> ndarray im speziellen Fall von Tensoren, die (kontradiktorische) Bilder repräsentieren, mit cleverhans Bibliothek/Tutorials erhalten.
Ich denke, dass meine Frage/Antwort ( hier ) auch für andere Fälle ein hilfreiches Beispiel sein kann.
Ich bin neu bei TensorFlow, meine ist eine empirische Schlussfolgerung:
Es scheint, dass die tensor.eval () -Methode möglicherweise den Wert für die Eingabe Platzhalter benötigt, um erfolgreich zu sein. Tensor kann wie eine Funktion arbeiten, die ihre Eingabewerte benötigt (in feed_dict
bereitgestellt), um einen Ausgabewert, z.
array_out = tensor.eval(session=sess, feed_dict={x: x_input})
Bitte beachten Sie, dass der Platzhaltername in meinem Fall x ist, aber ich denke, Sie sollten den richtigen Namen für die Eingabe Platzhalter finden. x_input
ist ein Skalarwert oder ein Array, das Eingabedaten enthält.
In meinem Fall war auch die Angabe von sess
obligatorisch.
Mein Beispiel befasst sich auch mit der matplotlib Image-Visualisierung, dies ist jedoch OT.