Risposte:
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'>
Per riconvertire da tensore a matrice numpy puoi semplicemente eseguire .eval()sul tensore trasformato.
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?
.eval()chiamata del metodo dall'interno di una sessione: sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
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.
eval().
Devi:
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
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.
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
Stavo cercando giorni per questo comando.
Questo ha funzionato per me al di fuori di qualsiasi sessione o qualcosa del genere.
# 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
È 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!