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