Como depurar valores de NaN no TensorFlow?
Eu estava executando o TensorFlow e, por acaso, tenho algo produzindo um NaN. Eu gostaria de saber o que é, mas não sei como fazer isso. A questão principal é que, em um programa processual "normal", eu escreveria apenas uma declaração de impressão antes da execução da operação. O problema com o TensorFlow é que não posso fazer isso porque primeiro declaro (ou defino) o gráfico, portanto, adicionar instruções de impressão à definição do gráfico não ajuda. Existem regras, conselhos, heurísticas, alguma coisa para rastrear o que pode estar causando o NaN?
Nesse caso, eu sei mais precisamente em que linha procurar, porque tenho o seguinte:
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)
quando esta linha está presente, tenho a devolução de NaN, conforme declarado pelos meus redatores de resumo. Por que é isso? Existe uma maneira de pelo menos explorar qual valor Z tem depois de ter uma raiz quadrada?
Para o exemplo específico que publiquei, tenteitf.Print(0,Z)
mas sem sucesso, não imprimiu nada. Como em:
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)
Na verdade, eu não entendo o quetf.Print
é suposto fazer. Por que ele precisa de dois argumentos? Se eu quiser imprimir 1 tensor, por que precisaria passar 2? Parece bizarro para mim.
Eu estava olhando para a funçãotf.add_check_numerics_ops () mas não diz como usá-lo (além disso, os documentos parecem não ser super úteis). Alguém sabe como usar isso?
Desde que eu tive comentários abordando os dados podem ser ruins, estou usando o MNIST padrão. No entanto, estou computando uma quantidade que é positiva (distância euclediana em pares) e depois a enraizando. Portanto, eu não veria como os dados especificamente seriam um problema.