我正在使用带有 anaconda 的 python 3,以及带有 eager eval 的tensorflow 1.12。
我正在使用它为暹罗网络创建三元组损失函数,并且需要计算不同数据样本之间的距离。
我创建了一个函数来创建距离计算,但无论我做什么,当我尝试计算它相对于网络输出的梯度时,它总是给我所有的纳米梯度。
这是代码:
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
s。
我查了一下y_pred
由合法的价值观组成 - 确实如此。
我尝试创建一个渐变y_pred * 2
相对于其自身并获得合法的梯度值。
我在这里缺少什么?创建距离矩阵时的索引是否有问题?
edit:
两者的 dtypey_pred
and loss
is tf.float32
编辑:找到一个打开错误报告 https://github.com/tensorflow/tensorflow/issues/12071在 tf - 这可能是问题所在吗?
edit:
当我将范数轴更改为 0 或 1 时,我得到了合法的值,但没有任何结果nan
。我正在使用规范进行的操作axis=2
是矩阵中行对之间的成对距离,我怀疑这可能与行到自身之间的距离为 0 有关,因此我用最小值 1e-7 剪裁了这些值,但没有任何运气。
Thanks