Как объясняется в проблеме github , предоставленной @mikkola, проблема связана с внутренней реализацией tf.where
. В основном, обе альтернативы (и их градиент) вычисляются, и только умножение условной выборки выбирает только правильную часть. Увы, если градиент равен inf
или nan
для детали, которая не выбрана, даже при умножении на 0 вы получите nan
, который в конечном итоге распространяется на результат.
Поскольку проблема была подана в мае 2016 года (это тензор потока v0.7!) И с тех пор не исправлена, можно смело предположить, что это произойдет не скоро, и начать искать обходной путь.
Самый простой способ исправить это - изменить ваши операторы так, чтобы они всегда были действительными и дифференцируемыми даже для значений, которые не предназначены для выбора.
Общий метод заключается в том, чтобы обрезать входное значение внутри его допустимого домена. Так, в вашем случае, например, вы можете использовать
cond = tf.less(x, 0.0)
output = tf.where(cond,
-tf.log(-tf.where(cond, x, 0) + 1),
tf.log(tf.where(cond, 0, x) + 1))
В вашем конкретном случае, однако, было бы проще использовать
output = tf.sign(x) * tf.log(tf.abs(x) + 1)