Я использую Python 3 с Anaconda и TenSerflow 1.12 с нетерпением Eval.
Я использую его для создания функции потери триплета для сиамской сети, и мне нужно рассчитать расстояние между различными выборками данных.
Я создал функцию для расчета расстояния, но независимо от того, что я делаю, когда я пытаюсь вычислить его градиент по отношению к выходу сети, он продолжает давать мне весь нано градиент.
Это код:
def matrix_row_wise_norm(matrix):
import tensorflow as tf
tensor = tf.expand_dims(matrix, -1)
tensor = tf.transpose(tensor, [0, 2, 1]) - tf.transpose(tensor, [2, 0, 1])
norm = tf.norm(tensor, axis=2)
return norm
В функции потерь я использую
def loss(y_true, p_pred):
with tf.GradientTape() as t:
t.watch(y_pred)
distance_matrix = matrix_row_wise_norm(y_pred)
grad = t.gradient(distance_matrix, y_pred)
И все грады nan
с.Я проверил, что y_pred
состоит из допустимых значений - и это так.Я попытался создать градиент y_pred * 2
относительно себя и получил допустимые значения градиента.
Что мне здесь не хватает?Проблематично ли индексирование при создании матрицы расстояний?
edit:
dtype для y_pred
и loss
равен tf.float32
edit: обнаружил открытый отчет об ошибках в tf - может ли это быть проблемой?
edit:
Когда я изменяю ось нормы на 0 или 1, я получаю допустимые значения, и ничто не идет к nan
.Операция, которую я получаю, используя норму с axis=2
, представляет собой попарное расстояние между парами строк в матрице. Я подозревал, что это может быть связано с расстоянием 0 между строкой, так что я обрезал значения с минимальным значением:1e-7 без удачи.
Спасибо