¿Cómo se depuran los valores de NaN en TensorFlow?
Estaba ejecutando TensorFlow y tengo algo que produce un NaN. Me gustaría saber qué es, pero no sé cómo hacerlo. El problema principal es que en un programa procesal "normal" simplemente escribiría una declaración de impresión justo antes de que se ejecute la operación. El problema con TensorFlow es que no puedo hacer eso porque primero declaro (o defino) el gráfico, por lo que agregar declaraciones de impresión a la definición del gráfico no ayuda. ¿Hay alguna regla, consejo, heurística, algo para rastrear lo que podría estar causando el NaN?
En este caso, sé con más precisión qué línea mirar porque tengo lo siguiente:
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)
cuando esta línea está presente, tengo que devuelve NaN según lo declarado por mis escritores de resumen. ¿Por qué es esto? ¿Hay alguna manera de al menos explorar qué valor tiene Z después de ser enraizado?
Para el ejemplo específico que publiqué, intentétf.Print(0,Z)
pero sin éxito no imprimió nada. Como en:
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)
En realidad no entiendo quétf.Print
se supone que debe hacer. ¿Por qué necesita dos argumentos? Si quiero imprimir 1 tensor, ¿por qué necesitaría pasar 2? Me parece extraño.
Estaba mirando la funcióntf.add_check_numerics_ops () pero no dice cómo usarlo (además los documentos parecen no ser muy útiles). ¿Alguien sabe cómo usar esto?
Como he recibido comentarios que abordan los datos pueden ser malos, estoy usando MNIST estándar. Sin embargo, estoy calculando una cantidad que es positiva (distancia euclediana por pares) y luego enraizamiento cuadrado. Por lo tanto, no vería cómo los datos específicamente serían un problema.