Wie konvertiere ich einen Tensor in Tensorflow 2.1.0 in einen Eager-Tensor?
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
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)
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.
- Habe die Kartenfunktion mit dekoriert
tf.py_function(get_path, [x], [tf.string]). Mehr über tf.py_function finden Sie hier . - 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.