Come posso convertire un tensore in una matrice numpy in TensorFlow?


181

Come convertire un tensore in un array intorpidito quando si utilizzano Tensorflow con collegamenti Python?

Risposte:


134

Qualsiasi tensore restituito da Session.runo evalè un array NumPy.

>>> print(type(tf.Session().run(tf.constant([1,2,3]))))
<class 'numpy.ndarray'>

O:

>>> sess = tf.InteractiveSession()
>>> print(type(tf.constant([1,2,3]).eval()))
<class 'numpy.ndarray'>

O, equivalentemente:

>>> sess = tf.Session()
>>> with sess.as_default():
>>>    print(type(tf.constant([1,2,3]).eval()))
<class 'numpy.ndarray'>

EDIT: Non qualsiasi tensore restituito da Session.runo eval()è una matrice NumPy. I tensori sparsi, ad esempio, vengono restituiti come SparseTensorValue:

>>> print(type(tf.Session().run(tf.SparseTensor([[0, 0]],[1],[1,2]))))
<class 'tensorflow.python.framework.sparse_tensor.SparseTensorValue'>

AttributeError: il modulo 'tensorflow' non ha alcun attributo 'Session'
Jürgen K.

77

Per riconvertire da tensore a matrice numpy puoi semplicemente eseguire .eval()sul tensore trasformato.


5
per chiarire: yourtensor.eval ()
mrk,

12
Ottengo 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)'È utilizzabile solo durante una sessione di tensoflow?
Eduardo Pignatelli,

@EduardoPignatelli Funziona per me a Theano senza lavoro extra. Non sono sicuro di tf.
BallpointBen

5
@EduardoPignatelli devi eseguire la .eval()chiamata del metodo dall'interno di una sessione: sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
duhaime,

Usando questo sto ricevendo un errore come AttributeError: l'oggetto 'Tensor' non ha alcun attributo 'eval'
Aakash aggarwal

73

TensorFlow 2.x

Eager Execution è abilitato di default, quindi basta chiamare .numpy()l'oggetto Tensor.

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)

Vale la pena notare (dai documenti),

L'array Numpy può condividere la memoria con l'oggetto Tensor. Eventuali modifiche a una possono essere riflesse nell'altra.

Enorme enfasi sulla mia. Una copia può o non può essere restituita, e questo è un dettaglio di implementazione.


Se l'esecuzione desiderosa è disabilitata, è possibile creare un grafico e quindi eseguirlo 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)

Vedi anche Mappa dei simboli TF 2.0 per una mappatura della vecchia API con quella nuova.


2
Come si fa a INSIDE a tf.function?
matematico

@mentalmushroom Impossibile trovare una documentazione ma è menzionata nel manuale delle personalizzazioni . Maggiori dettagli possono essere trovati nella fonte .
nish-ant,

5
Ottengo il seguente errore in TF 2.0: "L'oggetto 'Tensore' non ha attributo 'numpy'"
Will.Evo

@ Will.Evo è possibile che tu abbia disabilitato l'esecuzione impaziente prima di eseguire questo. Controlla la seconda metà della mia risposta dove puoi usare eval().
cs95,

2
No, non ho disabilitato l'esecuzione impaziente. Ottieni ancora AttributeError: l'oggetto 'Tensor' non ha attributo 'numpy'
Geoffrey Anderson,

6

Devi:

  1. codifica il tensore di immagine in un formato (jpeg, png) in tensore binario
  2. valutare (eseguire) il tensore binario in una sessione
  3. trasforma il binario in streaming
  4. feed all'immagine PIL
  5. (opzionale) visualizza l'immagine con matplotlib

Codice:

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)

Questo ha funzionato per me. Puoi provarlo su un notebook ipython. Non dimenticare di aggiungere la seguente riga:

%matplotlib inline

4

Forse puoi provare , questo metodo:

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

Ho affrontato e risolto la conversione tensoradarray nel caso specifico di tensori che rappresentano immagini (contraddittorie), ottenute con la libreria / tutorial di Cleverhans .

Penso che la mia domanda / risposta ( qui ) possa essere un esempio utile anche per altri casi.

Sono nuovo con TensorFlow, la mia è una conclusione empirica:

Sembra che il metodo tensor.eval () possa aver bisogno, per avere successo, anche del valore per i segnaposto di input . Il tensore può funzionare come una funzione che necessita dei suoi valori di input (forniti in feed_dict) per restituire un valore di output, ad es

array_out = tensor.eval(session=sess, feed_dict={x: x_input})

Nel mio caso il nome del segnaposto è x , ma suppongo che dovresti trovare il nome giusto per il segnaposto di input . x_inputè un valore scalare o un array contenente dati di input.

Nel mio caso anche fornire sessera obbligatorio.

Il mio esempio copre anche la parte di visualizzazione delle immagini matplotlib , ma questo è OT.


1

Un semplice esempio potrebbe essere,

    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 ora se vogliamo che questo tensore a sia convertito in una matrice numpy

    a_np=a.eval()
    print(type(a_np))
    #<class 'numpy.ndarray'>

Così semplice!


//non è per commentare in Python. Modifica la tua risposta
Vlad


0

È possibile utilizzare la funzione backend di keras.

import tensorflow as tf
from tensorflow.python.keras import backend 

sess = backend.get_session()
array = sess.run(< Tensor >)

print(type(array))

<class 'numpy.ndarray'>

Spero possa essere d'aiuto!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.