Antworten:
Jeder von Session.run
oder zurückgegebene Tensor eval
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 jeder Tensor zurück durch Session.run
oder eval()
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 zum Numpy-Array zurückzukehren, können Sie einfach .eval()
den transformierten Tensor ausführen .
ValueError: Cannot evaluate tensor using 'eval()': No default session is registered. Use 'with sess.as_default()' or pass an explicit session to 'eval(session=sess)'
Ist dies nur während einer Tensoflow-Sitzung verwendbar?
.eval()
Methodenaufruf innerhalb einer Sitzung sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
Die eifrige Ausführung ist standardmäßig aktiviert. Rufen Sie einfach .numpy()
das Tensor-Objekt auf.
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)
Es ist erwähnenswert (aus den Dokumenten),
Numpy Array kann Speicher mit dem Tensor-Objekt teilen. Änderungen an einem können sich auf den anderen auswirken.
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 ausführen 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)
Siehe auch TF 2.0 Symbols Map für eine Zuordnung der alten API zur neuen.
eval()
.
Du brauchst:
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-Notizbuch versuchen. Vergessen Sie nicht, die folgende Zeile hinzuzufügen:
%matplotlib inline
Ich habe die Tensor-> ndarray- Konvertierung im speziellen Fall von Tensoren, die (gegnerische) Bilder darstellen, konfrontiert und gelöst , die mit der cleverhans- Bibliothek / den Tutorials erhalten wurden.
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 tensor.eval () -Methode müssen, um auch der Wert für die Eingabe erfolgreich zu sein Platzhalter . Tensor kann wie eine Funktion funktionieren, die ihre Eingabewerte (bereitgestellt in feed_dict
) benötigt, um einen Ausgabewert zurückzugeben, 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 nehme an, Sie sollten den richtigen Namen für den eingegebenen Platzhalter herausfinden .
x_input
ist ein skalarer Wert oder ein Array, das Eingabedaten enthält.
In meinem Fall war auch die Bereitstellung sess
obligatorisch.
Mein Beispiel behandelt auch den Teil der Matplotlib-Bildvisualisierung , aber dies ist OT.
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 Nun, 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!
//
ist nicht zum Kommentieren in Python. Bitte bearbeiten Sie Ihre Antwort.
Ich habe tagelang nach diesem Befehl gesucht.
Dies funktionierte für mich außerhalb einer Sitzung oder so etwas.
# 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
Sie können die Keras-Backend-Funktion verwenden.
import tensorflow as tf
from tensorflow.python.keras import backend
sess = backend.get_session()
array = sess.run(< Tensor >)
print(type(array))
<class 'numpy.ndarray'>
Ich hoffe, es hilft!