Я запускал 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. Тем не менее, я вычисляю количество, положительное (парное эвклидовое расстояние), а затем квадратное укоренение. Таким образом, я бы не видел, как конкретно данные будут проблемой.