wake-up-neo.net

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

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

101
mathetes

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'>
83
Lenar Hoyt

Um vom Tensor wieder in ein Numpy-Array zu konvertieren, können Sie einfach .eval() auf dem transformierten Tensor ausführen.

66

Du musst: 

  1. kodieren Sie den Bildtensor in einem bestimmten Format (jpeg, png) in binären Tensor 
  2. den binären Tensor in einer Sitzung auswerten (ausführen) 
  3. drehen Sie die Binärdatei zum Streamen 
  4. feed zum PIL-Bild 
  5. (optional) Anzeige des Bildes mit Matplotlib

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
4
Gooshan

TensorFlow 2.0

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.

4
cs95

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)
1
lovychen

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!

0
Saurabh Kumar

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.

0
Fabiano Tarlao