Ich lief TensorFlow und ich habe zufällig etwas, das ein NaN ergibt. Ich würde gerne wissen, was es ist, aber ich weiß nicht, wie ich das machen soll. Das Hauptproblem ist, dass ich in einem "normalen" prozeduralen Programm nur eine Druckanweisung schreiben würde, kurz bevor die Operation ausgeführt wird. Das Problem mit TensorFlow ist, dass ich das nicht tun kann, weil ich zuerst das Diagramm deklariere (oder definiere), also hilft das Hinzufügen von Druckanweisungen zur Diagrammdefinition nicht. Gibt es irgendwelche Regeln, Ratschläge, Heuristiken, irgendetwas, um herauszufinden, was das NaN verursachen könnte?Wie kann man NaN-Werte in TensorFlow debuggen?
In diesem Fall habe ich mehr genau wissen, was Linie zu sehen, weil ich habe folgendes:
Delta_tilde = 2.0*tf.matmul(x,W) - tf.add(WW, XX) #note this quantity should always be positive because its pair-wise euclidian distance
Z = tf.sqrt(Delta_tilde)
Z = Transform(Z) # potentially some transform, currently I have it to return Z for debugging (the identity)
Z = tf.pow(Z, 2.0)
A = tf.exp(Z)
wenn diese Zeile vorhanden ist, habe ich es, dass es NaN zurück, wie durch meine Zusammenfassung Schriftsteller erklärt . Warum ist das? Gibt es eine Möglichkeit, zumindest zu erforschen, welchen Wert Z hat, nachdem er quadratisch wurzelt?
Für das spezielle Beispiel, das ich geschrieben habe ich versucht, tf.Print(0,Z)
aber ohne Erfolg es gedruckt nichts. Wie in:
Delta_tilde = 2.0*tf.matmul(x,W) - tf.add(WW, XX) #note this quantity should always be positive because its pair-wise euclidian distance
Z = tf.sqrt(Delta_tilde)
tf.Print(0,[Z]) # <-------- TF PRINT STATMENT
Z = Transform(Z) # potentially some transform, currently I have it to return Z for debugging (the identity)
Z = tf.pow(Z, 2.0)
A = tf.exp(Z)
Ich verstehe wirklich nicht, was zu tun tf.Print
annehmen wird. Warum braucht es zwei Argumente? Wenn ich 1 Tensor drucken möchte, warum müsste ich 2 übergeben? Es scheint mir bizarr.
ich in der Funktion tf.add_check_numerics_ops() war auf der Suche, aber es sagt nicht, wie es zu benutzen (plus die Docs scheinen nicht super hilfreich zu sein). Weiß jemand wie man das benutzt?
Da ich Kommentare hatte, die die Daten möglicherweise schlecht adressieren, verwende ich Standard-MNIST. Ich berechne jedoch eine Menge, die positiv ist (paarweise euklidische Entfernung) und dann Quadratwurzel. So würde ich nicht sehen, wie die Daten speziell ein Problem sein würden.
FYI diese vermisst einige ops wenn Optimizern verwendet - https://github.com/tensorflow/tensorflow/issues/2288 –