Как избежать fp16
промежуточного переполнения в tf.linalg.norm
, пока конечный результат не переполняется?
Я пытаюсь визуализировать поверхность оптимизации нейронной сети.Для этого я оцениваю потери тысяч настроек параметров по отношению к одинаковым x
и y
.Я использую fp16
(то есть половину точности) для большего размера партии.Проблема в том, что последний шаг, вычисляющий потери (т.е. tf.linalg.norm
), будет (почти всегда) переполняться и возвращать inf
:
>>> tf.linalg.norm(myArray, axes=(1,2))
[inf, inf, inf, ..., inf]
Одним из решений будет cast
всего массива до fp32
(то есть с одинарной точностью) до вычисления:
>>> tf.linalg.norm(tf.cast(myArray, tf.float32), axes=(1,2))
[~10k, ~10k, ~10k, ..., ~10k]
, но я считаю, что этот процесс пытается выделить массив памяти в два раза больше (и сохранить старый массив до тех пор, пока не будет cast
ing).Если память GPU недостаточно велика, процесс завершится ошибкой.Я думал, что должно быть больше эффективных для памяти (и более быстрых) способов, но я не уверен, как.