Wie kann man NaN-Werte in TensorFlow debuggen?

Ich habe TensorFlow ausgeführt und ich habe zufällig etwas mit einem NaN. 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 print-Anweisung schreiben würde, bevor die Operation ausgeführt wird. Das Problem mit TensorFlow ist, dass ich das nicht tun kann, weil ich das Diagramm zuerst deklariere (oder definiere), so dass das Hinzufügen von Druckanweisungen zur Diagrammdefinition nicht hilft. Gibt es irgendwelche Regeln, Ratschläge, Heuristiken, um herauszufinden, was das NaN verursachen könnte?

In diesem Fall weiß ich genauer, auf welche Zeile ich schauen soll, weil ich Folgendes habe:

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ückgibt, wie von meinen Zusammenfassungsautoren deklariert. Warum ist das? Gibt es eine Möglichkeit, zumindest zu untersuchen, welchen Wert Z nach seiner Quadratwurzelbildung hat?

Für das spezifische Beispiel, das ich gepostet habe, habe ich versucht,tf.Print(0,Z) aber ohne Erfolg druckte es 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 eigentlich nicht, wastf.Print soll wohl tun. Warum braucht es zwei Argumente? Wenn ich 1 Tensor drucken möchte, warum muss ich dann 2 bestehen? Scheint mir bizarr.

Ich habe mir die Funktion angeschaut tf.add_check_numerics_ops () aber es sagt nicht, wie man es benutzt (außerdem scheinen die Dokumente nicht besonders hilfreich zu sein). Weiß jemand, wie man das benutzt?

Da ich Kommentare zu den Daten hatte, die möglicherweise schlecht sind, verwende ich Standard-MNIST. Ich berechne jedoch eine positive Größe (paarweise eukledische Distanz) und verwurzele sie dann quadratisch. Daher würde ich nicht sehen, wie die Daten speziell ein Problem darstellen würden.

Antworten auf die Frage(14)

Ihre Antwort auf die Frage