Tensorflow: TF 2.0 'Tensor'-Objekt hat kein Attribut 'numpy', während .numpy() verwendet wird, obwohl die Eager-Ausführung standardmäßig aktiviert ist

Erstellt am 4. Apr. 2019  ·  54Kommentare  ·  Quelle: tensorflow/tensorflow

Obwohl Eager_execution standardmäßig in TF 2.0 aktiviert ist, erhalte ich Fehler bei der Verwendung von .numpy()

Bitte beachten Sie, dass ich den Code nicht im Kompatibilitätsmodus zu TF 1.0 verwende.

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)

erwartete_Werte = expt.numpy()

AttributeError: 'Tensor'-Objekt hat kein Attribut 'numpy'

CPU-TESTVERSION VON TENSORFLOW 2.0.

Fixed in Nightly TF 2.0 core awaiting response support

Hilfreichster Kommentar

Ich hatte das gleiche Problem. Es stellte sich heraus, dass ich versucht habe, .numpy() in einer @tf.function zu verwenden. Soweit ich weiß, wird tf.function nicht eifrig für Performance-Zwecke ausgeführt. Wenn ich den @tf.function-Dekorator entferne, funktioniert .numpy().

Alle 54 Kommentare

@Mainak431 Hast du dein Problem gelöst?

Ja.

was war deine lösung?

.Numpy wird nur im Eager-Modus unterstützt. Wenn Sie sich im Grafikmodus befinden, wird dieser nicht unterstützt. Um zu überprüfen, ob Sie sich im Eager-Modus befinden. Tun Sie, tf.eifrig(). Es gibt true oder false zurück. Im Graph-Modus müssen Sie eval in einer Sitzung verwenden, um den Wert des Tensors im numpy-Array zu erhalten.

@Mainak431
Modul 'tensorflow' hat kein Attribut 'eifrig'
Modul 'tensorflow.compat.v1' hat kein Attribut 'eifrig'

Ich verwende das Paket tensorflow-gpu==2.0.0-alpha0
.numpy() auf einem meiner Tensoren ergibt das 'Tensor'-Objekt hat kein Attribut 'numpy'

tf.eagerly() gibt das Modul 'tensorflow' hat kein Attribut 'eagerly'

tf.executing_eagerly() anstelle von tf.eagerly() hat bei mir funktioniert, um zu überprüfen, ob ich im Eifer-Modus bin

Hat dafür jemand eine Lösung gefunden?

gleiches Problem hier ... ich rufe ein Keras-Modell im Eager-Modus auf und bekomme einen Tensor, keinen EagerTensor, was Probleme mit OpenAI Gym verursacht

Führen Sie dieses tf.enable_eager_execution() aus und wenn Sie dann tf.executing_eagerly() versuchen, sollte es True ergeben. Danach können Sie etwas.numpy() verwenden, um die Werte anzuzeigen.

@AkashNagaraj Ich habe gerade ein Problem eingereicht, bei dem der Code eifrig ausgeführt wird (und sollte, da es sich um TF 2.0 handelt), aber ich habe das Problem, dass "numpy" fehlt. Möchten Sie einen Blick darauf werfen? https://github.com/tensorflow/tensorflow/issues/32842

Danke!

Ich hatte das gleiche Problem. Es stellte sich heraus, dass ich versucht habe, .numpy() in einer @tf.function zu verwenden. Soweit ich weiß, wird tf.function nicht eifrig für Performance-Zwecke ausgeführt. Wenn ich den @tf.function-Dekorator entferne, funktioniert .numpy().

Ich hatte das gleiche Problem. Es stellte sich heraus, dass ich versucht habe, .numpy() in einer @tf.function zu verwenden. Soweit ich weiß, wird tf.function nicht eifrig für Performance-Zwecke ausgeführt. Wenn ich den @tf.function-Dekorator entferne, funktioniert .numpy().

Das funktioniert bei mir, @tf.function hat die ganze Funktion in den Graphenmodus verwandelt

Warum wird in diesem Thread keine einzige Lösung erwähnt =.=

Meine Funktion hat keinen Decorator, aber .numpy() schlägt immer noch fehl, wie von früheren Postern beschrieben. Hat jemand eine Lösung dafür gefunden?

Ich habe festgestellt, dass mein Problem behoben ist, nachdem ich tf.compat.v1.enable_eager_execution() oben in mein Skript eingefügt habe (sehr ähnlich wie in früheren Postern, aber das funktioniert für TF 2.0) ...

Ich habe das gleiche Problem und keine der oben genannten Lösungen hat bei mir funktioniert.

Ich verwende TF 2.0, meine Funktion hat keinen Dekorator, tf.eagerly() gibt True zurück und ich erhalte immer noch den gleichen AttributeError: 'Tensor'-Objekt hat kein Attribut 'numpy'.

Gleiches Problem.

Ich habe dafür gesorgt, dass ich eifrig ausgeführt werde und keinen Dekorateur für meine benutzerdefinierte Verlustfunktion habe. Ich habe auch Michaels Lösung mit zwei Kommentaren ausprobiert, die nicht funktioniert hat.

Ich erhalte die Fehlermeldung: AttributeError: 'Tensor'-Objekt hat kein Attribut 'numpy'

Mir ist aufgefallen, dass dieser Fehler nur auftritt, wenn ich während einer Modellanpassung versuche, Tensoren in numpy umzuwandeln. Meine beste Vermutung ist, dass es ein Formproblem zu sein scheint.

Zum Beispiel der folgende Tensor

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

ist mit .numpy() konvertierbar. Wenn jedoch versucht wird, eine benutzerdefinierte Metrik für ein Klassifizierungsproblem zu implementieren, erhöhen sowohl y_true.numpy() als auch y_pred.numpy()

AttributeError: 'Tensor'-Objekt hat kein Attribut 'numpy'.

Hier ist ein Beispiel für beide y's:

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

y_pred:
print(y_pred): Tensor("dense/ Identity:0 ", shape=(None, None, 6), dtype=float32)
drucken (typ (pred)):

@renatomello Ich habe das gleiche Problem wie du. Ich habe eine neue Ausgabe geöffnet: #35393.

@renatomello Das Problem besteht weiterhin, wenn versucht wird, eine benutzerdefinierte Metrik zu implementieren. Haben Sie einen Workaround gefunden?

@renatomello Das Problem besteht weiterhin, wenn versucht wird, eine benutzerdefinierte Metrik zu implementieren. Haben Sie einen Workaround gefunden?

Nein, habe ich nicht. Ich versuche zu sehen, ob es eine TF/Keras-Backend-Funktion gibt, die etwas Ähnliches tut, mit der ich arbeiten kann. Ansonsten muss ich nur selbst eine erstellen.

Ich bin auf diesen Bereich gestoßen, als ich die Regex-Funktionen in der Datenvorverarbeitung verwendet habe. Die Verwendung von Python-Logik erfordert die Verwendung von tf.py_function wie in den Dokumenten und diesem StackOverflow-Thread erwähnt (Hinweis tf.py_func() ist jetzt tf.py_function() )

Sobald ich meinen Code geändert habe von
data = fnames.map(process_path)
zu
data = fnames.map(lambda x: tf.py_function(process_path, [x], [tf.string]))
der Code wurde korrekt ausgeführt.

Ich bin auf dieses Problem gestoßen, als ich die TextVectorization Ebene in TF2.1 mit einem sehr benutzerdefinierten split ausprobiert habe. Was für mich behoben wurde, war die Übergabe von dynamic=True an die TextVectorization Konstruktion.

Mir ist aufgefallen, dass dieser Fehler nur auftritt, wenn ich während einer Modellanpassung versuche, Tensoren in numpy umzuwandeln. Meine beste Vermutung ist, dass es ein Formproblem zu sein scheint.

Zum Beispiel der folgende Tensor

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

ist mit .numpy() konvertierbar. Wenn jedoch versucht wird, eine benutzerdefinierte Metrik für ein Klassifizierungsproblem zu implementieren, erhöhen sowohl y_true.numpy() als auch y_pred.numpy()

AttributeError: 'Tensor'-Objekt hat kein Attribut 'numpy'.

Hier ist ein Beispiel für beide y's:

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

y_pred:
print(y_pred): Tensor("dense/ Identity:0 ", shape=(None, None, 6), dtype=float32)
drucken (typ (pred)):

Ich kenne den Grund nicht, aber ich habe ein solches Problem gelöst, indem ich hinzugefügt habe
experimental_run_tf_function=False
in der Kompilierfunktion meines Modells.

Mir ist aufgefallen, dass dieser Fehler nur auftritt, wenn ich während einer Modellanpassung versuche, Tensoren in numpy umzuwandeln. Meine beste Vermutung ist, dass es ein Formproblem zu sein scheint.
Zum Beispiel der folgende Tensor

tf.Tensor([[1 3] [0 4]], shape=(2, 2), dtype=int64)
ist mit .numpy() konvertierbar. Wenn jedoch versucht wird, eine benutzerdefinierte Metrik für ein Klassifizierungsproblem zu implementieren, erhöhen sowohl y_true.numpy() als auch y_pred.numpy()
AttributeError: 'Tensor'-Objekt hat kein Attribut 'numpy'.
Hier ist ein Beispiel für beide y's:
y_wahr:
print(y_true): Tensor("dense_ target:0 ", shape=(None, None, None), dtype=float32)
print(type(y_true)):
y_pred:
print(y_pred): Tensor("dense/ Identity:0 ", shape=(None, None, 6), dtype=float32)
drucken (typ (pred)):

Ich kenne den Grund nicht, aber ich habe ein solches Problem gelöst, indem ich hinzugefügt habe
experimental_run_tf_function=False
in der Kompilierfunktion meines Modells.

In meinem Fall scheint es keinen Unterschied zu machen

Ich bin auf dieses Problem gestoßen, als ich die TextVectorization Ebene in TF2.1 mit einem sehr benutzerdefinierten split ausprobiert habe. Was für mich behoben wurde, war die Übergabe von dynamic=True an die TextVectorization Konstruktion.

Wie hast du das genau gemacht?

Zuerst sollten Sie die Sitzung wie folgt registrieren:
sess=tf.Session()
dann benutze :
erwartete_Werte = expt.eval(session=sess)
das ergebnis sollte sein:
print(erwartete_Werte)
Aus[41]:
Array([[[ 0, 0, 0],
[ 4, 71, 141],
[ 0, 0, 0]]])
danken

Ich bin auf dieses Problem gestoßen, als ich die TextVectorization Ebene in TF2.1 mit einem sehr benutzerdefinierten split ausprobiert habe. Was für mich behoben wurde, war die Übergabe von dynamic=True an die TextVectorization Konstruktion.

Wie hast du das genau gemacht?

So was. Ich lerne immer noch ML/TF im Allgemeinen, daher war dies möglicherweise das Falsche. Es ist alles schwarze Magie, bis es „einfach funktioniert“.

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
)

Dieses Problem besteht bei mir immer noch. Ich verwende keine Annotation @tf.function und führe sie eifrig aus. Die Problemumgehung, die ich jetzt verwende, ist np.array(yourtensor.to_list())

Dieses Problem besteht bei mir immer noch. Ich verwende keine Annotation @tf.function und führe sie eifrig aus. Die Problemumgehung, die ich jetzt verwende, ist np.array(yourtensor.to_list())

Das bekomme ich
AttributeError: 'Tensor' object has no attribute 'to_list'

Gemäß den Codes in tensorflow können wir tesnsorObj.numpy() aufrufen, wenn sich das Tensorobjekt im Eager-Modus befindet tensor(tensorflow.python.framework.ops.EagerTensor).
diese Methode ist in tensorflow/python/framework/ops.py implementiert
Aber wenn das Tensor-Objekt ein allgemeiner Tensor ist, zB zu tensorflow.python.framework.ops.Tensor gehört, dann hat es keine numpy()-Methode, der Implementierungscode befindet sich auch in tensorflow/python/framework/ops.py
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/framework/ops.py

Dies bedeutet, dass alle Tensor-Objekte, die in @tf.function ausgeführt werden, tensorObj.numpy() nicht aufrufen konnten
Der Eifer-Laufmodus fügt TF2.0 die Flexibilität und Komplexität hinzu.

Gemäß den Codes in tensorflow können wir tesnsorObj.numpy() aufrufen, wenn sich das Tensorobjekt im Eager-Modus befindet tensor(tensorflow.python.framework.ops.EagerTensor).
diese Methode ist in tensorflow/python/framework/ops.py implementiert
Aber wenn das Tensor-Objekt ein allgemeiner Tensor ist, zB zu tensorflow.python.framework.ops.Tensor gehört, dann hat es keine numpy()-Methode, der Implementierungscode befindet sich auch in tensorflow/python/framework/ops.py
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/framework/ops.py

Dies bedeutet, dass alle Tensor-Objekte, die in @tf.function ausgeführt werden, tensorObj.numpy() nicht aufrufen konnten
Der Eifer-Laufmodus fügt TF2.0 die Flexibilität und Komplexität hinzu.

Danke für die ausführliche Erklärung.

Dieses Problem wird jedoch in der stabilen Version 2.1.0 nicht behoben. In der #38038 wurde mir darauf hingewiesen, dass es in der tf-nightly Version 2.2.0 gelöst ist.

@renatomello Ich bin ein kompletter Neuling auf TF. Daher bin ich mir nicht sicher, ob die folgenden Schritte zur Lösung Ihres Problems beitragen.
Ich löse den Fehler AttributeError: 'Tensor' object has no attribute 'numpy' , indem ich experimentell_run_functions_eagerly(True) verwende .
Ich verwende TF-Ver. 2.1 (Detaillierte Versionsinformationen finden Sie in der folgenden Konsolenausgabe). Ich erlaube zu erklären, was ich mit diesem Code mache:

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)

Den obigen Code führe ich in der Konsole des Editors Spyder (Spyder Version 4.0.1) aus. Die entsprechende Konsolenausgabe ist (nur Teile der Ausgabe):

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

Sehen Sie nun in der Konsolenausgabe unten test(run_eagerly=False) : Alle drei MyDense.call()-Aufrufe geben an, dass input.numpy() nicht verfügbar ist (Randnotiz: Wenn ich es richtig verstehe, die ersten beiden MyDense.call ()-Aufrufe dienen nur zum Erstellen des Modells. Daher ist es sinnvoll, dass sie nicht input.numpy() zur Verfügung haben. Das ist also sinnvoll.
Siehe in der Konsolenausgabe unten test(run_eagerly=True) : Im fünften MyDense.call() steht input.numpy() zur Verfügung. Das ist also auch sinnvoll. Und es behebt den Fehler.

Ich hatte das gleiche Problem. Es stellte sich heraus, dass ich versucht habe, .numpy() in einer @tf.function zu verwenden. Soweit ich weiß, wird tf.function nicht eifrig für Performance-Zwecke ausgeführt. Wenn ich den @tf.function-Dekorator entferne, funktioniert .numpy().

Für mich geht das.

Ich habe alle in diesem Thread erwähnten Lösungen ausprobiert, aber keine davon hat bei mir funktioniert. Ich bin auf 2.2.0-rc2.

Es scheint in meinem Fall kein Problem mit der eifrigen Ausführung zu sein. Der Fehler kommt von diesen Zeilen, als ich keras.backend.get_value() aufgerufen habe:

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

Hatte das gleiche Problem. Es stellt sich heraus, dass die Eiferly-Ausführung standardmäßig deaktiviert ist, wenn die Fit-Funktion auf einem Modell ausgeführt wird. Um dem entgegenzuwirken, können Sie Folgendes ausführen: model.run_eagerly = True bevor model.fit ausgeführt wird.
Das hat für mich auf Tensorflow 2.2 wie ein Zauber funktioniert

model.compile(..., run_eagerly=True) hat für mich beim Erstellen einer benutzerdefinierten Metrik funktioniert

Ich hatte ein ähnliches Problem bei der Arbeit mit Keras.
Ich weiß nicht, ob das anderen hilft, aber Folgendes hat mir geholfen:
Ich habe verwendet:
model = Sequential() vorher und geändert in
model = tf.keras.Sequential()
Und bei mir hat es funktioniert.

@ Mainak431 würde es Ihnen etwas

Ich hatte ein ähnliches Problem bei der Arbeit mit Keras.
Ich weiß nicht, ob das anderen hilft, aber Folgendes hat mir geholfen:
Ich habe verwendet:
model = Sequential() vorher und geändert in
model = tf.keras.Sequential()
Und bei mir hat es funktioniert.

Das war eigentlich die Lösung für mich, ich habe alten Code wiederverwendet, der direkt aus keras importiert wurde, nicht tensorflow.keras-Layer usw. Das Ändern der Importanweisungen hat den Attributfehler behoben.

@Blubbaa Das gleiche hier. Es war nur das, was für mich funktionierte.

Wenn ich den Wert im Tensor überprüfen möchte, aber den Eager-Modus wegen der tf.placeholder Kompatibilität deaktivieren muss, wie soll ich vorgehen? Ich habe versucht, tf.enable_eager_execution ohne tf.placeholder tf.enable_eager_execution zwischen den Ebenen hinzuzufügen, nur um diesen Fehler zu erhalten ValueError: tf.enable_eager_execution must be called at program startup.

Folgender Code hat funktioniert:

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

Parse-Funktion aufrufen:

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 Der ursprüngliche Code funktionierte wie erwartet. Hier ist das Wesentliche.

@ tu1258 Sie müssen die Eager-Ausführung nicht deaktivieren. Importieren Sie es einfach als tf.compat.v1.placeholder statt als tf.placeholder . Wenn es immer noch nicht funktioniert, teilen Sie bitte einen eigenständigen Code mit, um das Problem zu reproduzieren.

Bitte lassen Sie es mich wissen, wenn es weitere Fragen gibt. Danke!

Ich hatte das gleiche Problem. Es stellte sich heraus, dass ich versucht habe, .numpy() in einer @tf.function zu verwenden. Soweit ich weiß, wird tf.function nicht eifrig für Performance-Zwecke ausgeführt. Wenn ich den @tf.function-Dekorator entferne, funktioniert .numpy().

Ich denke, die folgende Option in Tensorflow2.x kann helfen
tf.config.run_functions_eagerly

An der Stelle, an der Sie tf.function aufrufen, können Sie versuchen, es eifrig auszuführen und dann die eifrige Ausführung für tf.function deaktivieren.

Ich bin neu bei Tensorflow, aber nach diesem Tutorial (auf Jupyter Notebook) https://www.tensorflow.org/tutorials/quickstart/beginner?hl=en erhalten Sie den Fehler

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

@louisnot Ich kann den Fehler nicht reproduzieren. Bitte überprüfen Sie das Wesentliche hier . Danke!

Wenn der Fehler auftritt, können Sie uns bitte eine Zusammenfassung mitteilen? Danke!

Ich hatte keine Probleme mit dem Kern.

Ich schließe dieses Problem, da es in tf-nightly gelöst wurde. Bitte zögern Sie nicht, wieder zu öffnen, wenn das Problem weiterhin besteht. Danke!

@bhupendrathore Können Sie bitte ein neues Problem mit einem einfachen eigenständigen Code öffnen, um den Fehler zu reproduzieren? Danke!

Ich habe das gleiche Problem; Wenn ich es in Ihrer Lösung mit pip install tf-nightly behebe, treten die Fehler auf:

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 Ich sehe, du hast ein weiteres neues Problem geöffnet. wir werden es dort lösen. Danke

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen