Konvertieren des TensorFlow-Tensors in ein Numpy-Array

Sep 13 2020

Problembeschreibung

Ich versuche, eine benutzerdefinierte Verlustfunktion in TensorFlow 2.3.0 zu schreiben. Um den Verlust zu berechnen, muss der y_predParameter in ein Numpy-Array konvertiert werden. Ich kann jedoch keine Möglichkeit finden, es von <class 'tensorflow.python.framework.ops.Tensor'>einem Numpy-Array zu konvertieren , obwohl TensorFlow-Funktionen dies zu tun scheinen.

Codebeispiel

def custom_loss(y_true, y_pred):
    print(type(y_pred))
    npa = y_pred.make_ndarray()
    ...
    

if __name__ == '__main__':
    ...
    model.compile(loss=custom_loss, optimizer="adam")
    model.fit(x=train_data, y=train_data, epochs=10)

gibt die Fehlermeldung aus: AttributeError: 'Tensor' object has no attribute 'make_ndarraynach dem Drucken den Typ des y_predParameters:<class 'tensorflow.python.framework.ops.Tensor'>

Was ich bisher versucht habe

Auf der Suche nach einer Lösung fand ich, dass dies ein häufiges Problem zu sein scheint und es einige Vorschläge gibt, aber sie haben bisher bei mir nicht funktioniert:

1. "... rufen Sie einfach .numpy () für das Tensor-Objekt auf.": Wie kann ich einen Tensor in TensorFlow in ein Numpy-Array konvertieren?

Also habe ich versucht:

def custom_loss(y_true, y_pred):
    npa = y_pred.numpy()
    ...

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

2. "Verwenden Sie tensorflow.Tensor.eval (), um einen Tensor in ein Array zu konvertieren ": So konvertieren Sie einen TensorFlow-Tensor in ein NumPy-Array in Python

Also habe ich versucht:

def custom_loss(y_true, y_pred):
    npa = y_pred.eval(session=tf.compat.v1.Session())
    ...

Geben Sie mir eine der längsten Spuren von Fehlermeldungen, die ich je gesehen habe, mit dem Kern:

InvalidArgumentError: 2 root error(s) found.
      (0) Invalid argument: You must feed a value for placeholder tensor 'functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource' with dtype resource
         [[node functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource (defined at main.py:303) ]]
         [[functional_1/cropping2d/strided_slice/_1]]
      (1) Invalid argument: You must feed a value for placeholder tensor 'functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource' with dtype resource
         [[node functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource (defined at main.py:303) ]]

Auch das Aufrufen von TensorFlow-Kompatibilitätsfunktionen ab Version 1.x ist nicht sehr zukunftssicher, daher gefällt mir dieser Ansatz sowieso nicht besonders gut.

3. Beim Betrachten der TensorFlow-Dokumente schien es die Funktion zu geben, auf die ich nur warten musste: tf.make_ndarray Erstellen Sie ein numpy ndarray aus einem Tensor.

Also habe ich versucht:

def custom_loss(y_true, y_pred):
    npa = tf.make_ndarray(y_pred)
    ...

gibt mir AttributeError: 'Tensor' object has no attribute 'tensor_shape'

Wenn ich mir das Beispiel in der TF-Dokumentation ansehe, das sie auf einem proto_tensor verwenden, habe ich zuerst versucht, es in ein proto zu konvertieren:

def custom_loss(y_true, y_pred):
    proto_tensor = tf.make_tensor_proto(y_pred)
    npa = tf.make_ndarray(proto_tensor)
    ...

aber schon tf.make_tensor_proto(y_pred)wirft das den fehler auf:TypeError: Expected any non-tensor type, got a tensor instead.

Der Versuch, zuerst einen konstanten Tensor zu erstellen, führt zu demselben Fehler:

def custom_loss(y_true, y_pred):
    a = tf.constant(y_pred)
    proto_tensor = tf.make_tensor_proto(a)
    npa = tf.make_ndarray(proto_tensor)
    ...

Es gibt viel mehr Beiträge dazu, aber es scheint, dass sie alle auf diese drei Grundideen zurückkommen. Freue mich auf eure Vorschläge!

Antworten

runDOSrun Sep 13 2020 at 17:11

y_pred.numpy()funktioniert in TF 2, AttributeError: 'Tensor' object has no attribute 'make_ndarrayzeigt jedoch an, dass Teile Ihres Codes nicht im Eager-Modus ausgeführt werden, da Sie sonst kein TensorObjekt, sondern ein Objekt hätten EagerTensor.

Um den Eager-Modus zu aktivieren, setzen Sie diesen an den Anfang Ihres Codes, bevor etwas in der Grafik erstellt wird:

tf.config.experimental_run_functions_eagerly(True)

Zweitens, wenn Sie Ihr Modell kompilieren, fügen Sie diesen Parameter hinzu:

model.compile(..., run_eagerly=True, ...)

Jetzt werden Sie im Eager-Modus ausgeführt und alle Variablen enthalten Werte, mit denen Sie sowohl drucken als auch arbeiten können. Beachten Sie, dass auf Eager Modus umgeschaltet wird möglicherweise zusätzliche Anpassungen an Ihrem Code erforderlich (siehe hier für eine Übersicht).