Wie kann ich in TensorFlow einen Tensor in ein Numpy-Array konvertieren?


180

Wie konvertiere ich einen Tensor in ein Numpy-Array, wenn ich Tensorflow mit Python-Bindungen verwende?

Antworten:


134

Jeder von Session.runoder zurückgegebene Tensor evalist 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.runoder 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'>

AttributeError: Modul 'tensorflow' hat kein Attribut 'Session'
Jürgen K.

77

Um vom Tensor zum Numpy-Array zurückzukehren, können Sie einfach .eval()den transformierten Tensor ausführen .


5
zur Verdeutlichung: yourtensor.eval ()
mrk

12
Ich bekomme 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?
Eduardo Pignatelli

@EduardoPignatelli Es funktioniert für mich in Theano ohne zusätzliche Arbeit. Ich bin mir nicht sicher über tf.
BallpointBen

5
@EduardoPignatelli Sie müssen den .eval()Methodenaufruf innerhalb einer Sitzung sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
ausführen

Wenn ich dies verwende,
erhalte

69

TensorFlow 2.x.

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.


2
Wie mache ich das INNERHALB einer TF-Funktion?
Mathtick

@mentalmushroom Es wurde keine Dokumentation gefunden, diese wird jedoch im Anpassungshandbuch erwähnt . Weitere Details finden Sie in der Quelle .
Nish-Ant

5
Ich erhalte den folgenden Fehler in TF 2.0: "'Tensor' Objekt hat kein Attribut 'numpy'"
Will.Evo

@ Will.Evo Es ist möglich, dass Sie die eifrige Ausführung deaktiviert haben, bevor Sie dies ausführen. Überprüfen Sie die zweite Hälfte meiner Antwort, wo Sie verwenden können eval().
cs95

2
Nein, ich habe die eifrige Hinrichtung nicht deaktiviert. Erhalten Sie immer noch AttributeError: 'Tensor'-Objekt hat kein Attribut' numpy '
Geoffrey Anderson

6

Du brauchst:

  1. Codieren Sie den Bildtensor in einem bestimmten Format (JPEG, PNG) in einen binären Tensor
  2. den binären Tensor in einer Sitzung auswerten (ausführen)
  3. Schalten Sie die Binärdatei zum Streamen
  4. Feed zum PIL-Bild
  5. (optional) Zeigen Sie das Bild mit matplotlib an

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

4

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)

2

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_inputist ein skalarer Wert oder ein Array, das Eingabedaten enthält.

In meinem Fall war auch die Bereitstellung sessobligatorisch.

Mein Beispiel behandelt auch den Teil der Matplotlib-Bildvisualisierung , aber dies ist OT.


1

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.
Vlad


0

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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.