Как отлаживать значения NaN в TensorFlow?
Я использовал TensorFlow, и у меня есть что-то, приносящее NaN. Я хотел бы знать, что это такое, но я не знаю, как это сделать. Основная проблема заключается в том, что в «нормальной» процедурной программе я бы просто написал оператор печати непосредственно перед выполнением операции. Проблема с TensorFlow заключается в том, что я не могу этого сделать, потому что сначала объявляю (или определяю) граф, поэтому добавление операторов печати к определению графа не помогает. Есть ли какие-либо правила, советы, эвристика, что-нибудь, чтобы отследить, что может быть причиной NaN?
В этом случае я знаю более точно, на какую строку смотреть, потому что у меня есть следующее:
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)
когда эта строка присутствует, у меня есть то, что она возвращает NaN, как объявлено моими авторами резюме. Почему это? Есть ли способ, по крайней мере, исследовать, какое значение Z имеет после его квадратного корня?
Для конкретного примера, который я разместил, я попыталсяtf.Print(0,Z)
но безуспешно ничего не печаталось. Как в:
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)
Я на самом деле не понимаю, чтоtf.Print
это должно делать. Зачем ему два аргумента? Если я хочу напечатать 1 тензор, зачем мне проходить 2? Мне кажется странным.
Я смотрел на функциюtf.add_check_numerics_ops () но там не сказано, как его использовать (плюс документы, кажется, не очень полезны). Кто-нибудь знает, как это использовать?
Поскольку у меня были комментарии по поводу данных, которые могут быть плохими, я использую стандартный MNIST. Тем не менее, я вычисляю положительную величину (расстояние по Евклиану), а затем укореню ее в квадрат. Таким образом, я не вижу, как именно данные будут проблемой.