为了账号安全,请及时绑定邮箱和手机立即绑定

张量流梯度 - 获取所有 nan 值

张量流梯度 - 获取所有 nan 值

慕田峪9158850 2021-10-19 15:47:20
我正在将 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 的值没有任何运气。谢谢
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

似乎从数字不稳定性tf.norm患有作为解释这里


他们还建议使用更稳定的 l2 范数,所以我尝试了这一点,也得到了 nan 值,这要归功于 0 梯度。所以我将它们与梯度裁剪一起使用,到目前为止效果很好,损失函数正在工作并设法收敛。


def last_attempt(y_true, y_pred):

    import tensorflow as tf

    import numpy as np


    loss = tf.zeros(1)


    for i in range(y_pred.shape[0]):

        dist = tf.gather(y_pred, [i], axis=0)

        y = y_true.numpy().squeeze()

        norm = tf.map_fn(tf.nn.l2_loss, dist-y_pred)


        d = norm.numpy()

        d[np.where(y != y[i])] = 0.0

        max_pos = tf.gather(norm, np.argmax(d))


        d = norm.numpy()

        d[np.where(y == y[i])] = np.inf

        min_neg = tf.gather(norm, np.argmin(d))


        loss += tf.clip_by_value(max_pos - min_neg + tf.constant(1, dtype=tf.float32),

                                 1e-8, 1e1)


    return loss

优化该功能的空间很大,这里是对我的其他SO 问题的参考- 正在解决这个问题。


查看完整回答
反对 回复 2021-10-19
  • 1 回答
  • 0 关注
  • 215 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信