我正在将 python 3 与 anaconda 一起使用,并将 tensorflow 1.12 与eager eval 一起使用。
我正在使用它为孪生网络创建三元组损失函数,并且需要计算不同数据样本之间的距离。
我创建了一个函数来创建距离计算,但是无论我做什么,当我尝试计算它相对于网络输出的梯度时,它一直给我所有的 nan 梯度。
这是代码:
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)
并且 grad 都是nans。我检查过它y_pred是由合法值组成的 - 确实如此。我试图创建一个y_pred * 2相对于自身的梯度并获得合法的梯度值。
我在这里缺少什么?创建距离矩阵时的索引是否有问题?
编辑:
两者的D型y_pred和lossIStf.float32
编辑:在 tf 中发现了一个打开的错误报告- 这可能是问题吗?
编辑:
当我将范数轴更改为 0 或 1 时,我得到了合法的值,而nan. 我使用 norm with 的操作axis=2是矩阵中行对之间的成对距离,我怀疑这可能与行与自身之间的距离为 0 有关,所以我剪掉了最小值为 1e-7 的值没有任何运气。
谢谢
慕尼黑的夜晚无繁华
相关分类