web-dev-qa-db-fra.com

Comment convertir un tenseur en tableau numpy dans TensorFlow?

Comment convertir un tenseur en tableau numpy lors de l'utilisation de liaisons Tensorflow avec Python?

101
mathetes

Tout tenseur renvoyé par Session.run ou eval est un tableau NumPy.

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

Ou:

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

Ou équivalent:

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

EDIT: Pas aucun tenseur renvoyé par Session.run ou eval() est un tableau NumPy. Les tenseurs fragmentés, par exemple, sont renvoyés sous la forme SparseTensorValue:

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

Pour reconvertir tableau de tenseur en tableau numpy, vous pouvez simplement exécuter .eval() sur le tenseur transformé.

66
Rafał Józefowicz

Tu dois: 

  1. encoder le tenseur d'image dans un format (jpeg, png) en tenseur binaire 
  2. évaluer (exécuter) le tenseur binaire dans une session 
  3. tourner le binaire pour diffuser 
  4. nourrir à l'image PIL 
  5. (optionnel) afficher l'image avec 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)

Cela a fonctionné pour moi. Vous pouvez l'essayer dans un cahier ipython. N'oubliez pas d'ajouter la ligne suivante:

%matplotlib inline
4
Gooshan

TensorFlow 2.0

Eager Execution est activé par défaut, il suffit donc d'appeler .numpy() sur l'objet Tensor.

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)

Il est à noter (de la documentation),

Numpy array peut partager la mémoire avec l'objet Tensor. Toute modification de l'un peut être répercutée dans l'autre.

Gras accent mien. Une copie peut ou peut ne pas être renvoyée et il s'agit d'un détail d'implémentation.


Si Eager Execution est désactivé, vous pouvez créer un graphique, puis l'exécuter via 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)

Voir aussi Carte des symboles TF 2. pour un mappage de l'ancienne API sur la nouvelle.

4
cs95

Peut-être que vous pouvez essayer cette méthode:

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

Un exemple simple pourrait être,

    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 maintenant si nous voulons que ce tenseur a être converti en un tableau numpy

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

Aussi simple que cela!

0
Saurabh Kumar

J'ai confronté et résolu la conversion de {tensor> ndarray dans le cas spécifique de tenseurs représentant des images (contradictoires), obtenus avec cleverhans bibliothèque/tutoriels.

Je pense que ma question/réponse ( ici ) peut être un exemple utile également pour d'autres cas.

Je suis nouveau chez TensorFlow, le mien est une conclusion empirique:

Il semble que la méthode tensor.eval () puisse avoir besoin, pour réussir, de la valeur pour l’entrée espaces réservés. Le tenseur peut fonctionner comme une fonction nécessitant ses valeurs d'entrée (fournies dans feed_dict) afin de renvoyer une valeur de sortie, par ex.

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

Veuillez noter que le nom d’espace réservé est x dans mon cas, mais je suppose que vous devriez trouver le bon nom pour l’entrée espace réservé. x_input est une valeur scalaire ou un tableau contenant des données d'entrée.

Dans mon cas, fournir sess était obligatoire.

Mon exemple couvre également la partie de visualisation d'image matplotlib, mais il s'agit de OT.

0
Fabiano Tarlao