Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Существует несколько причин, почему вы можете получить результат NaN, часто из-за слишком высокой скорости обучения, но возможны и другие причины, например, например, поврежденные данные в вашей входной очереди или журнал из 0 вычислений.

Как бы то ни было, отладка с печатью по описанию не может быть выполнена простой печатью (так как это приведет только к печати тензорной информации внутри графика и не распечатывает никаких реальных значений).

Однако, если вы используете tf.print как op при расширении графика (tf.print), то, когда график будет выполнен, вы получите фактические значения, напечатанные (и это хорошее упражнение, чтобы наблюдать за этими значениями для отладки и понимания поведения вашей сети).

Однако вы используете инструкцию печати не совсем правильно. Это op, поэтому вам нужно передать ему тензор и запросить тензор результата, с которым вам нужно работать позже, на графике выполнения. В противном случае op не будет выполнен и печать не будет выполнена. Попробуйте следующее:

Z = tf.sqrt(Delta_tilde)
Z = tf.Print(Z,[Z], message="my Z-values:") # <-------- 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)

Ответ 2

Похоже, вы можете вызвать его после завершения создания графика.

check = tf.add_check_numerics_ops()

Я думаю, что это добавит проверку для всех операций с плавающей запятой. Затем в функции запуска сеанса вы можете добавить операцию проверки.

sess.run([check, ...])

Ответ 3

Начиная с версии 0.12, TensorFlow поставляется со встроенным отладчиком под названием tfdbg. Он оптимизирует рабочий процесс отладки этого типа проблем с плохой численной стоимостью (например, inf и nan). Документация находится по адресу: https://www.tensorflow.org/programmers_guide/debugger

Ответ 4

Прежде всего, вам нужно правильно проверить входные данные. В большинстве случаев это и есть причина. Но не всегда, конечно.

Я обычно использую Tensorboard, чтобы видеть, что происходит во время обучения. Таким образом, вы можете увидеть значения на каждом шаге с помощью

Z = tf.pow(Z, 2.0)    
summary_z = tf.scalar_summary('z', Z) 
#etc..
summary_merge = tf.merge_all_summaries()
#on each desired step save: 
    summary_str = sess.run(summary_merge)
    summary_writer.add_summary(summary_str, i)

Также вы можете просто просмотреть и распечатать текущее значение:

 print(sess.run(Z))

Ответ 5

Ответы уже хорошие. Если вы ищете общие методы отладки (т.е. Не относится к Tensorflow), этот документ очень полезен: http://russellsstewart.com/notes/0.html