Wie konvertiere ich einen Tensor in Tensorflow 2.1.0 in einen Eager-Tensor?

Oct 17 2020

Ich habe versucht, einen Tensor vom Typ zu konvertieren:

tensorflow.python.framework.ops.Tensor

zu einem eifrigen:

<class 'tensorflow.python.framework.ops.EagerTensor'>

Ich habe nach einer Lösung gesucht, aber keine gefunden. Jede Hilfe wäre dankbar.

Kontext:

Ich habe den Tensor mithilfe der Merkmalsextraktionsmethode aus einem Keras Sequential-Modell erhalten. Die Ausgabe war ein Tensor des erstgenannten Typs. Als ich jedoch versuchte, es mit .numpy () in numpy zu konvertieren, funktionierte es nicht mit dem folgenden Fehler:

'Tensor' object has no attribute 'numpy'

Aber wenn ich dann versuche, einen Tensor mit tf.constant zu erstellen und ihn dann mit .numpy () zu konvertieren, funktioniert das einwandfrei!

Der einzige Unterschied, den ich festgestellt habe, besteht darin, dass die Tensortypen unterschiedlich sind: Der von Keras sequentiell erzeugte Tensor ist vom oben genannten ersten Typ, während der zweite Tensor, den ich manuell erstellt habe, vom zweiten Typ ist (eifriger Tensor).

Antworten

1 TFer Oct 22 2020 at 01:01

Wenn Sie eine weitere Antwort schreiben, wird derselbe Fehler in einem anderen Szenario angezeigt.

Der Fehler, den Sie erhalten, ist auf das Versionsproblem .ie zurückzuführen tensorflow version 2.1.0. Ich lief den Code durch die ersten 2 Ziffern Skipping , die zu installieren ist tensorflow==2.1.0und keras==2.3.1und der Fehler wieder nicht.

Ihr Problem verschwindet in der neuesten Version von tensorflow version 2.3.0. Führen Sie das Programm auf den neuesten Versionen aus. Das bedeutet, dass Sie Tensorflow und Keras nicht erneut installieren, da in Google Colab bereits die neueste und stabile Version vorinstalliert ist.

features.numpy()

Ausgabe -

array([[0.       , 0.3728346, 0.       , ..., 1.0103987, 0.       ,
        0.4194043]], dtype=float32)
1 TFer Oct 20 2020 at 16:32

Hätte besser antworten können, wenn Sie den reproduzierbaren Code geteilt hätten.

Unten ist ein einfaches Szenario, in dem ich Ihren Fehler neu erstellt habe. Hier lese ich den Pfad einer Bilddatei.

Code zum erneuten Erstellen des Fehlers:

%tensorflow_version 2.x
import tensorflow as tf
import numpy as np

def get_path(file_path):
    print("file_path: ", bytes.decode(file_path.numpy()),type(bytes.decode(file_path.numpy())))
    return file_path

train_dataset = tf.data.Dataset.list_files('/content/bird.png')
train_dataset = train_dataset.map(lambda x: (get_path(x)))

for one_element in train_dataset:
    print(one_element)

Ausgabe:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-8-2d5db8425f67> in <module>()
      8 
      9 train_dataset = tf.data.Dataset.list_files('/content/bird.png')
---> 10 train_dataset = train_dataset.map(lambda x: (get_path(x)))
     11 
     12 for one_element in train_dataset:

10 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/autograph/impl/api.py in wrapper(*args, **kwargs)
    256       except Exception as e:  # pylint:disable=broad-except
    257         if hasattr(e, 'ag_error_metadata'):
--> 258           raise e.ag_error_metadata.to_exception(e)
    259         else:
    260           raise

AttributeError: in user code:

    <ipython-input-8-2d5db8425f67>:10 None  *
        train_dataset = train_dataset.map(lambda x: (get_path(x)))
    <ipython-input-8-2d5db8425f67>:6 get_path  *
        print("file_path: ", bytes.decode(file_path.numpy()),type(bytes.decode(file_path.numpy())))

    AttributeError: 'Tensor' object has no attribute 'numpy'

Im Folgenden sind die Schritte aufgeführt, die ich im Code implementiert habe, um diesen Fehler zu beheben.

  1. Habe die Kartenfunktion mit dekoriert tf.py_function(get_path, [x], [tf.string]). Mehr über tf.py_function finden Sie hier .
  2. Jetzt kann ich den String-Teil mithilfe der bytes.decode(file_path.numpy())Map-Funktion abrufen.

Fester Code:

%tensorflow_version 2.x
import tensorflow as tf
import numpy as np

def get_path(file_path):
    print("file_path: ",bytes.decode(file_path.numpy()),type(bytes.decode(file_path.numpy())))
    return file_path

train_dataset = tf.data.Dataset.list_files('/content/bird.jpg')
train_dataset = train_dataset.map(lambda x: tf.py_function(get_path, [x], [tf.string]))

for one_element in train_dataset:
    print(one_element)

Ausgabe:

file_path:  /content/bird.jpg <class 'str'>
(<tf.Tensor: shape=(), dtype=string, numpy=b'/content/bird.jpg'>,)

Hoffe das beantwortet deine Frage.