Convertir un tenseur en tableau numpy dans Tensorflow?

206

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

mathetes
la source

Réponses:

91

TensorFlow 2.x

Eager Execution est activé par défaut, il vous suffit donc d'appeler .numpy()l'objet 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)

Voir Compatibilité NumPy pour plus d'informations. Il convient de noter (à partir de la documentation),

Le tableau Numpy peut partager la mémoire avec l'objet Tensor. Toute modification de l'un peut être reflétée dans l'autre.

Je souligne le mien. Une copie peut être retournée ou non, et il s'agit d'un détail d'implémentation basé sur le fait que les données sont dans le CPU ou le GPU (dans ce dernier cas, une copie doit être faite du GPU vers la mémoire hôte).

Mais pourquoi est-ce que je reçois AttributeError: 'Tensor' object has no attribute 'numpy'? .
Beaucoup de gens ont commenté ce problème, il y a plusieurs raisons possibles:

  • TF 2.0 n'est pas correctement installé (dans ce cas, essayez de réinstaller), ou
  • TF 2.0 est installé, mais l'exécution hâtive est désactivée pour une raison quelconque. Dans de tels cas, appelez tf.compat.v1.enable_eager_execution()pour l'activer ou voyez ci-dessous.

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.0 pour un mappage de l'ancienne API vers la nouvelle.

cs95
la source
3
Comment faire cela à l'intérieur d'une fonction tf?
mathtick
@mentalmushroom Impossible de trouver une documentation mais elle est mentionnée dans le manuel des personnalisations . Plus de détails peuvent être trouvés dans la source .
nish-ant
10
J'obtiens l'erreur suivante dans TF 2.0: "L'objet 'Tensor' n'a pas d'attribut 'numpy'"
Will.Evo
4
Non, je n'ai pas désactivé l'exécution impatiente. Toujours obtenir AttributeError: l'objet 'Tensor' n'a pas d'attribut 'numpy'
Geoffrey Anderson le
1
pourquoi est-ce que j'obtiens une AttributeError: l'objet 'Tensor' n'a pas d'attribut 'numpy'
zheyuanWang
137

Tout tenseur renvoyé par Session.runou evalest 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 tout tenseur retourné par Session.runou eval()est un tableau NumPy. Par exemple, les Sparse Tensors sont renvoyés en tant que SparseTensorValue:

>>> print(type(tf.Session().run(tf.SparseTensor([[0, 0]],[1],[1,2]))))
<class 'tensorflow.python.framework.sparse_tensor.SparseTensorValue'>
Lenar Hoyt
la source
2
AttributeError: le module 'tensorflow' n'a pas d'attribut 'Session'
Jürgen K.
Si eval seul suffit, quelle est la raison pour laquelle Session.run ou InteractiveSession dans toutes ces options?
Ceph
78

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

Rafał Józefowicz
la source
5
pour clarifier: yourtensor.eval ()
mrk
14
Je reçois 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)'Est-ce utilisable uniquement pendant une session tensoflow?
Eduardo Pignatelli
@EduardoPignatelli Cela fonctionne pour moi à Theano sans travail supplémentaire. Pas sûr de tf.
BallpointBen
5
@EduardoPignatelli vous devez exécuter l' .eval()appel de méthode depuis l'intérieur d'une session: sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
duhaime
En utilisant cela, j'obtiens une erreur comme AttributeError: l'objet 'Tensor' n'a pas d'attribut 'eval'
Aakash aggarwal
6

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 en flux
  4. alimenter l'image PIL
  5. (facultatif) 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 notebook ipython. N'oubliez pas d'ajouter la ligne suivante:

%matplotlib inline
Gooshan
la source
4

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)
lovychen
la source
3

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

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

Je suis nouveau avec TensorFlow, la mienne est une conclusion empirique:

Il semble que la méthode tensor.eval () peut avoir besoin, pour réussir, également de la valeur des espaces réservés d' entrée . Tensor peut fonctionner comme une fonction qui a besoin de ses valeurs d'entrée (fournies dans feed_dict) afin de renvoyer une valeur de sortie, par exemple

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

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

Dans mon cas, la fourniture sessétait également obligatoire.

Mon exemple couvre également la partie visualisation d'images matplotlib , mais c'est OT.

Fabiano Tarlao
la source
1

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 soit converti en un tableau numpy

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

Aussi simple que cela!

Saurabh Kumar
la source
//n'est pas pour commenter en python. Veuillez modifier votre réponse.
Vlad
0

Vous pouvez utiliser la fonction backend de 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'>

J'espère que ça aide!

Ebin Zacharias
la source
0

Si vous voyez qu'il existe une méthode _numpy () , par exemple pour un EagerTensor, appelez simplement la méthode ci-dessus et vous obtiendrez un ndarray.

Dhnesh Dhingra
la source