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

Отладка nans в обратном проходе

Я пытаюсь отлаживать несколько сложную и неканоническую NN-архитектуру. Вычисление форвардного прохода прекрасное и дает мне ожидаемые результаты, но когда я пытаюсь оптимизировать использование Адама или любого из стандартных оптимизаторов, даже после одной итерации с очень небольшой скоростью обучения я получаю повсеместно. Я пытаюсь их локализовать и задавался вопросом, есть ли способ поймать первое появление нана и обнаружить, в каком случае он возник? Я пробовал tf.add_check_numerics_ops(), но он, кажется, ничего не делает, или, возможно, я использую его неправильно.

4b9b3361

Ответ 1

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

train_op = ...
check_op = tf.add_check_numerics_ops()

sess = tf.Session()
sess.run([train_op, check_op])  # Runs training and checks for NaNs

Ответ 2

Возможно, вы могли бы добавить Print ops для подозрительных значений печати ops, что-то вроде этого

print_ops = []
for op in ops:
  print_ops.append(tf.Print(op, [op],
                   message='%s :' % op.name, summarize=10))
print_op = tf.group(*print_ops)
sess.run([train_op, print_op])

Чтобы добавить ко всем операциям, вы можете сделать цикл по строкам add_check_numerics_ops.