Tensorflow: L'objet TF 2.0 'Tensor' n'a pas d'attribut 'numpy' lors de l'utilisation de .numpy() bien que l'exécution rapide soit activée par défaut

Créé le 4 avr. 2019  ·  54Commentaires  ·  Source: tensorflow/tensorflow

Bien que Eager_execution soit activé par défaut dans TF 2.0, j'obtiens des erreurs lors de l'utilisation de .numpy()

Veuillez noter que je n'utilise pas le code en mode de compatibilité avec TF 1.0.

expt = [[[ 0, 0, 0],
[ 4, 71, 141],
[ 0, 0, 0]],

       [[ 83,  25,  85],
        [ 90, 190, 143],
        [  4, 141,  49]],

       [[  0,   0,   0],
        [  4,  71,  49],
        [  0,   0,   0]]]

expt = tf.convert_to_tensor(expt)

valeurs_attendues = expt.numpy()

AttributeError : l'objet 'Tensor' n'a pas d'attribut 'numpy'

VERSION DE TEST DU CPU DE TENSORFLOW 2.0.

Fixed in Nightly TF 2.0 core awaiting response support

Commentaire le plus utile

J'ai eu le même problème. Il s'est avéré que j'essayais d'utiliser .numpy() dans une @tf.function. Autant que je sache, tf.function n'est pas exécuté avec empressement à des fins de performances. Si je supprime le décorateur @tf.function .numpy() fonctionne.

Tous les 54 commentaires

@ Mainak431 Avez-vous résolu votre problème ?

Oui.

quelle a été ta solution ?

.Numpy n'est pris en charge qu'en mode avide. Si vous êtes en mode graphique, il ne sera pas pris en charge. A vérifier, si vous êtes en mode avide. Faites, tf.avidement(). Il retourne vrai ou faux. En mode graphique, vous devez utiliser eval dans une session pour obtenir la valeur du tenseur dans le tableau numpy.

@Mainak431
le module 'tensorflow' n'a pas d'attribut 'avidement'
le module 'tensorflow.compat.v1' n'a pas d'attribut 'avidement'

J'utilise le package tensorflow-gpu==2.0.0-alpha0
.numpy() sur l'un de mes tenseurs donne l'objet 'Tensor' n'a pas d'attribut 'numpy'

tf.eagerly() donne le module 'tensorflow' n'a pas d'attribut 'avidement'

tf.executing_eagerly() au lieu de tf.eagerly() a fonctionné pour moi de vérifier si je suis en mode impatient

Quelqu'un a-t-il trouvé une solution pour cela ?

même problème ici ... j'invoque un modèle keras en mode impatient et j'obtiens un Tensor, pas un EagerTensor, ce qui provoque des problèmes avec OpenAI Gym

Exécutez ce tf.enable_eager_execution(), puis lorsque vous essayez tf.executing_eagerly(), il devrait donner True. Après cela, vous pouvez utiliser quelque chose.numpy() pour afficher les valeurs.

J'ai eu le même problème. Il s'est avéré que j'essayais d'utiliser .numpy() dans une @tf.function. Autant que je sache, tf.function n'est pas exécuté avec empressement à des fins de performances. Si je supprime le décorateur @tf.function .numpy() fonctionne.

J'ai eu le même problème. Il s'est avéré que j'essayais d'utiliser .numpy() dans une @tf.function. Autant que je sache, tf.function n'est pas exécuté avec empressement à des fins de performances. Si je supprime le décorateur @tf.function .numpy() fonctionne.

Cela fonctionne pour moi, @tf.function a transformé toute la fonction en mode graphique

Pourquoi n'y a-t-il pas une seule solution mentionnée dans ce fil =.=

Ma fonction n'a pas de décorateur mais .numpy() échoue toujours comme décrit par les affiches précédentes. Quelqu'un a-t-il trouvé une solution à cela ?

J'ai constaté que mon problème s'éclaircissait après avoir inséré tf.compat.v1.enable_eager_execution() en haut de mon script (très similaire à ce que les affiches précédentes ont dit, mais cela fonctionne pour TF 2.0)...

J'ai le même problème et aucune des solutions ci-dessus n'a fonctionné pour moi.

J'utilise TF 2.0, ma fonction n'a pas de décorateur, tf.eagerly() renvoie True et j'obtiens toujours le même AttributeError : l'objet 'Tensor' n'a pas d'attribut 'numpy'.

Même problème.

Je me suis assuré que j'exécutais avec impatience et que je n'avais pas de décorateur sur ma fonction de perte personnalisée. J'ai également essayé la solution de Michael avec deux commentaires qui n'ont pas fonctionné.

J'obtiens l'erreur : AttributeError : l'objet 'Tensor' n'a pas d'attribut 'numpy'

J'ai remarqué que cette erreur n'apparaît que lorsque j'essaie de convertir des tenseurs en numpy lors d'un ajustement de modèle. Ma meilleure supposition est que cela semble être un problème de forme.

Par exemple, le tenseur suivant

tf.Tensor([[1 3] [0 4]], shape=(2, 2), dtype=int64)

est convertible en utilisant .numpy(). Cependant, lorsque vous essayez d'implémenter une métrique personnalisée pour un problème de classification, y_true.numpy() et y_pred.numpy() augmentent

AttributeError : l'objet 'Tensor' n'a pas d'attribut 'numpy'.

Voici un exemple des deux y :

y_true :
print(y_true): Tensor("dense_ target:0 ", shape=(Aucun, Aucun, Aucun), dtype=float32)
print(type(y_true)):

y_pred :
print(y_pred): Tensor("dense/ Identity:0 ", shape=(Aucun, Aucun, 6), dtype=float32)
print(type(pred)):

@renatomello J'ai le même problème que toi. J'ai ouvert un nouveau numéro : #35393.

@renatomello, le problème persiste lorsque vous essayez d'implémenter une métrique personnalisée. Avez-vous trouvé une solution de contournement ?

@renatomello, le problème persiste lorsque vous essayez d'implémenter une métrique personnalisée. Avez-vous trouvé une solution de contournement ?

Non je ne l'ai pas fait. J'essaie de voir s'il existe une fonction backend TF/Keras qui fait quelque chose de similaire avec laquelle je peux travailler. Sinon, je n'aurai qu'à en créer un moi-même.

J'ai rencontré cette zone lors de l'utilisation des fonctions regex dans le prétraitement des données. L'utilisation de la logique python nécessite l'utilisation de tf.py_function comme mentionné dans la documentation et ce thread StackOverflow (Remarque tf.py_func() est maintenant tf.py_function() )

Une fois que j'ai changé mon code de
data = fnames.map(process_path)
à
data = fnames.map(lambda x: tf.py_function(process_path, [x], [tf.string]))
le code exécuté correctement.

J'ai rencontré ce problème en essayant la couche TextVectorization dans TF2.1 avec un split très personnalisé. Ce qui l'a arrangé pour moi était de passer en dynamic=True à la construction TextVectorization .

J'ai remarqué que cette erreur n'apparaît que lorsque j'essaie de convertir des tenseurs en numpy lors d'un ajustement de modèle. Ma meilleure supposition est que cela semble être un problème de forme.

Par exemple, le tenseur suivant

tf.Tensor([[1 3] [0 4]], shape=(2, 2), dtype=int64)

est convertible en utilisant .numpy(). Cependant, lorsque vous essayez d'implémenter une métrique personnalisée pour un problème de classification, y_true.numpy() et y_pred.numpy() augmentent

AttributeError : l'objet 'Tensor' n'a pas d'attribut 'numpy'.

Voici un exemple des deux y :

y_true :
print(y_true): Tensor("dense_ target:0 ", shape=(Aucun, Aucun, Aucun), dtype=float32)
print(type(y_true)):

y_pred :
print(y_pred): Tensor("dense/ Identity:0 ", shape=(Aucun, Aucun, 6), dtype=float32)
print(type(pred)):

Je ne connais pas la raison, mais j'ai résolu ce problème en ajoutant
experimental_run_tf_function=False
en fonction de compilation de mon modèle.

J'ai remarqué que cette erreur n'apparaît que lorsque j'essaie de convertir des tenseurs en numpy lors d'un ajustement de modèle. Ma meilleure supposition est que cela semble être un problème de forme.
Par exemple, le tenseur suivant

tf.Tensor([[1 3] [0 4]], shape=(2, 2), dtype=int64)
est convertible en utilisant .numpy(). Cependant, lorsque vous essayez d'implémenter une métrique personnalisée pour un problème de classification, y_true.numpy() et y_pred.numpy() augmentent
AttributeError : l'objet 'Tensor' n'a pas d'attribut 'numpy'.
Voici un exemple des deux y :
y_true :
print(y_true): Tensor("dense_ target:0 ", shape=(Aucun, Aucun, Aucun), dtype=float32)
print(type(y_true)):
y_pred :
print(y_pred): Tensor("dense/ Identity:0 ", shape=(Aucun, Aucun, 6), dtype=float32)
print(type(pred)):

Je ne connais pas la raison, mais j'ai résolu ce problème en ajoutant
experimental_run_tf_function=False
en fonction de compilation de mon modèle.

Cela ne semble pas faire de différence dans mon cas

J'ai rencontré ce problème en essayant la couche TextVectorization dans TF2.1 avec un split très personnalisé. Ce qui l'a arrangé pour moi était de passer en dynamic=True à la construction TextVectorization .

Comment as-tu fait exactement ?

tout d'abord, vous devez enregistrer la session comme suit :
sess=tf.Session()
puis..utiliser :
valeurs_attendues = expt.eval(session=sess)
le résultat doit être :
print(expected_values)
Sorti[41] :
tableau([[[ 0, 0, 0],
[ 4, 71, 141],
[ 0, 0, 0]]])
remercier

J'ai rencontré ce problème en essayant la couche TextVectorization dans TF2.1 avec un split très personnalisé. Ce qui l'a arrangé pour moi était de passer en dynamic=True à la construction TextVectorization .

Comment as-tu fait exactement ?

Comme ça. J'apprends toujours le ML/TF en général, donc c'était peut-être la mauvaise chose à faire. C'est de la magie noire jusqu'à ce que ça "fonctionne".

vectorize_layer = tf.keras.layers.experimental.preprocessing.TextVectorization(
    standardize=tf_custom_standardize,
    split=tf_custom_split,
    max_tokens=len(vocab)+1,
    output_mode='int',
    dynamic=True
)

Ce problème persiste toujours pour moi. Je n'utilise pas l'annotation @tf.function et je m'exécute avec impatience. La solution de contournement que j'utilise maintenant est np.array(yourtensor.to_list())

Ce problème persiste toujours pour moi. Je n'utilise pas l'annotation @tf.function et je m'exécute avec impatience. La solution de contournement que j'utilise maintenant est np.array(yourtensor.to_list())

C'est ce que j'obtiens
AttributeError: 'Tensor' object has no attribute 'to_list'

Selon les codes dans tensorflow, lorsque l'objet tensor est en mode tensor impatient(tensorflow.python.framework.ops.EagerTensor), nous pourrions appeler tesnsorObj.numpy()
cette méthode est implémentée dans tensorflow/python/framework/ops.py
Mais si l'objet tenseur est un tenseur général, par exemple appartenant à tensorflow.python.framework.ops.Tensor, alors il n'aura pas de méthode numpy(), les codes d'implémentation sont également dans tensorflow/python/framework/ops.py
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/framework/ops.py

Cela signifie que tous les objets tenseurs exécutés dans @tf.function n'ont pas pu appeler tensorObj.numpy()
Le mode d'exécution avide ajoute de la flexibilité à TF2.0 et lui ajoute également de la complexité.

Selon les codes dans tensorflow, lorsque l'objet tensor est en mode tensor impatient(tensorflow.python.framework.ops.EagerTensor), nous pourrions appeler tesnsorObj.numpy()
cette méthode est implémentée dans tensorflow/python/framework/ops.py
Mais si l'objet tenseur est un tenseur général, par exemple appartenant à tensorflow.python.framework.ops.Tensor, alors il n'aura pas de méthode numpy(), les codes d'implémentation sont également dans tensorflow/python/framework/ops.py
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/framework/ops.py

Cela signifie que tous les objets tenseurs exécutés dans @tf.function n'ont pas pu appeler tensorObj.numpy()
Le mode d'exécution avide ajoute de la flexibilité à TF2.0 et lui ajoute également de la complexité.

Merci pour l'explication détaillée.

Cependant, ce problème n'est pas résolu dans la version stable 2.1.0. Il m'a été signalé dans le #38038 que c'est résolu dans la version tf-nightly 2.2.0.

@renatomello Je suis un débutant complet sur TF. Donc, je ne sais pas si ce qui suit aidera à résoudre votre problème.
Je résous l'erreur AttributeError: 'Tensor' object has no attribute 'numpy' , en utilisant experimental_run_functions_eagerly(True) .
J'utilise TF ver. 2.1 (Pour les informations détaillées sur la version, voir la sortie de la console ci-dessous). Je me permets d'expliquer ce que je fais avec ce code :

import sys
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np

counter=0

class MyDense(layers.Dense):
  def __init__(self, units, activation,input_shape):
    super().__init__(units=units, activation=activation,input_shape=input_shape)

  def call(self, inputs):
      global counter

      counter += 1
      print('\n{}. inputs.numpy()='.format(counter))
      if hasattr(inputs,'numpy'):
          print('{}'.format(inputs.numpy()))
      else:
          print('not available.')

      return super().call(inputs)

def test(run_eagerly):
    print('\n*** *** *** test(run_eagerly={})'.format(run_eagerly))
    tf.config.experimental_run_functions_eagerly(run_eagerly)

    dim0=256
    dim1=24
    train = np.arange(dim0*dim1).reshape(dim0,dim1)
    label = np.ones(dim0)

    model = tf.keras.Sequential()
    model.add(MyDense(10,activation='softmax',input_shape=(dim1,)))

    model.compile(optimizer=tf.keras.optimizers.SGD(),
                  loss=tf.keras.losses.SparseCategoricalCrossentropy())

    model.fit(train,
              label,
              batch_size=dim0,
              epochs=1)

print("Python version")
print (sys.version)
print("TensorFlow version")
print(tf.__version__)
print('\n\n')

test(False)
test(True)

J'exécute le code ci-dessus dans la console de l'éditeur Spyder (Spyder Version 4.0.1). La sortie de console correspondante est (juste des parties de la sortie) :

Python version
3.7.6 (default, Jan  8 2020, 19:59:22) 
[GCC 7.3.0]
TensorFlow version
2.1.0

*** *** *** test(run_eagerly=False)

1. inputs.numpy()=
not available.
Train on 256 samples

2. inputs.numpy()=
not available.

3. inputs.numpy()=
not available.
256/256 [==============================] - 0s 899us/sample - loss: 6344.8682

*** *** *** test(run_eagerly=True)

4. inputs.numpy()=
not available.
Train on 256 samples

5. inputs.numpy()=
[[2328. 2329. 2330. ... 2349. 2350. 2351.]
 [5280. 5281. 5282. ... 5301. 5302. 5303.]
 [2208. 2209. 2210. ... 2229. 2230. 2231.]
 ...
 [5160. 5161. 5162. ... 5181. 5182. 5183.]
 [ 840.  841.  842. ...  861.  862.  863.]
 [6048. 6049. 6050. ... 6069. 6070. 6071.]]
256/256 [==============================] - 0s 132us/sample - loss: 16.1181

Maintenant, voyez dans la sortie de la console ci-dessous test(run_eagerly=False) : Les trois appels MyDense.call() indiquent que input.numpy() n'est pas disponible (Note latérale : quand je comprends bien, les deux premiers MyDense.call () les appels servent uniquement à construire le modèle. Il est donc significatif qu'ils n'aient pas input.numpy() disponible.). Donc, c'est significatif.
Voir dans la sortie de la console ci-dessous test(run_eagerly=True) : Dans le cinquième MyDense.call() est input.numpy() disponible. Donc, cela a aussi un sens. Et cela résout l'erreur.

J'ai eu le même problème. Il s'est avéré que j'essayais d'utiliser .numpy() dans une @tf.function. Autant que je sache, tf.function n'est pas exécuté avec empressement à des fins de performances. Si je supprime le décorateur @tf.function .numpy() fonctionne.

Ça marche pour moi.

J'ai essayé toutes les solutions mentionnées dans ce fil, et aucune d'entre elles n'a fonctionné pour moi. Je suis sur 2.2.0-rc2.

Cela ne semble pas être un problème avec une exécution impatiente dans mon cas. L'erreur vient de ces lignes lorsque j'ai appelé keras.backend.get_value() :

  if context.executing_eagerly() or isinstance(x, ops.EagerTensor):
    return x.numpy()

A eu le même problème. Il s'avère que par défaut, l'exécution rapide est désactivée lors de l'exécution de la fonction fit sur un modèle. Pour contrer cela, vous pouvez exécuter : model.run_eagerly = True avant d'exécuter model.fit.
Cela a fonctionné comme un charme pour moi sur Tensorflow 2.2

model.compile(..., run_eagerly=True) a fonctionné pour moi lors de la création d'une métrique personnalisée

J'ai eu un problème similaire en travaillant avec Keras.
Je ne sais pas si cela en aidera d'autres, mais ce qui suit m'a aidé:
J'utilisais :
model = Sequential() avant et a changé cela en
modèle = tf.keras.Sequential()
Et cela a fonctionné pour moi.

@ Mainak431 voudriez-vous rouvrir le problème ?

J'ai eu un problème similaire en travaillant avec Keras.
Je ne sais pas si cela en aidera d'autres, mais ce qui suit m'a aidé:
J'utilisais :
model = Sequential() avant et a changé cela en
modèle = tf.keras.Sequential()
Et cela a fonctionné pour moi.

C'était en fait la solution pour moi, j'ai réutilisé un ancien code importé directement de keras, pas des couches tensorflow.keras, etc. la modification des instructions d'importation a résolu l'erreur d'attribut.

@Blubbaa Idem ici. C'est la seule chose qui a fonctionné pour moi.

Si je veux vérifier la valeur dans le tenseur mais que je dois désactiver le mode impatient à cause de la compatibilité tf.placeholder , comment dois-je faire ? J'ai essayé d'ajouter tf.enable_eager_execution entre le calque sans tf.placeholder uniquement pour obtenir cette erreur ValueError: tf.enable_eager_execution must be called at program startup.

Le code suivant a fonctionné :

def parse_str(str_tensor):
    raw_string = str_tensor.numpy().decode("utf-8") 

    # play with raw string
    raw_string = 'AAA'+raw_string     
    return raw_string

Appeler la fonction d'analyse :

def tf_pre_processing(row):
  return tf.py_function(parse_str, [row['context']], [tf.string])


train = t.map(tf_pre_processing).batch(1).take(1)

list(train)

@ Mainak431 Le code d'origine fonctionnait comme prévu. Voici l'essentiel.

@ tu1258 Vous n'avez pas besoin de désactiver l'exécution tf.compat.v1.placeholder au lieu de tf.placeholder . Si cela ne fonctionne toujours pas, veuillez partager un code autonome pour reproduire le problème.

S'il vous plaît laissez-moi savoir s'il y a d'autres questions. Merci!

J'ai eu le même problème. Il s'est avéré que j'essayais d'utiliser .numpy() dans une @tf.function. Autant que je sache, tf.function n'est pas exécuté avec empressement à des fins de performances. Si je supprime le décorateur @tf.function .numpy() fonctionne.

Je pense que l'option suivante dans Tensorflow2.x peut aider
tf.config.run_functions_eagerly

Là où vous appelez tf.function, vous pouvez essayer de l'exécuter avec impatience, puis désactiver l'exécution rapide pour tf.function.

Je suis nouveau sur tensorflow mais suivre ce tutoriel (sur Jupyter Notebook) https://www.tensorflow.org/tutorials/quickstart/beginner?hl=en vous donnera l'erreur

predictions = model(x_train[:1]).numpy()
Tensor object has no attribute 'numpy'

@louisnot je ne peux pas reproduire l'erreur. Veuillez vérifier l' essentiel ici . Merci!

Si vous rencontrez l'erreur, pouvez-vous s'il vous plaît partager un aperçu ? Merci!

Je n'ai rencontré aucun problème en utilisant l'essentiel.

Je ferme ce problème car cela a été résolu dans tf-nightly . N'hésitez pas à rouvrir si le problème persiste. Merci!

@bhupendrathore Pouvez-vous s'il vous plaît ouvrir un nouveau problème avec un simple code autonome pour reproduire l'erreur ? Merci!

J'obtiens le même problème ; lorsque je le corrige dans votre solution avec pip install tf-nightly , les erreurs se produisent :

ERROR: Could not find a version that satisfies the requirement tf-nightly (from versions: none)
ERROR: No matching distribution found for tf-nightly

@jvishnuvardhan

@liangzelang, je vois que vous avez ouvert un autre nouveau numéro. nous le résoudrons là-bas. Merci

Cette page vous a été utile?
0 / 5 - 0 notes