Tensorflow 我如何实施边际损失?

Tensorflow 我如何实施边际损失?,tensorflow,deep-learning,loss-function,Tensorflow,Deep Learning,Loss Function,我试图实现文[1]中介绍的边际损失。 到目前为止,这就是我所做的 def marginal_loss(model1, model2, y, margin, threshold): margin_ = 1/(tf.pow(margin,2)-margin) tmp = (1. - y) euc_dist = tf.sqrt(tf.reduce_sum(tf.pow(model1-model2, 2), 1, keep_dims=True)) thres_dist =

我试图实现文[1]中介绍的边际损失。 到目前为止,这就是我所做的

def marginal_loss(model1, model2, y, margin, threshold):
    margin_ = 1/(tf.pow(margin,2)-margin)
    tmp = (1. - y)
    euc_dist = tf.sqrt(tf.reduce_sum(tf.pow(model1-model2, 2), 1, keep_dims=True))
    thres_dist = threshold - euc_dist
    mul_val = tf.multiply(tmp, thres_dist)
    sum_ = tf.reduce_sum(mul_val)
    return tf.multiply(margin_, sum_)
然而,经过一段时间后,该值变为nan。我不确定我犯了什么错误。此外,我用1代替了ε(本文中描述的),因为它的值不清楚。类似地,也不知道确切的阈值

谢谢你的帮助


[1]

这看起来非常类似于由提出的问题。问题可能来自于使用
tf.sqrt
,它有一个坏特性,即当你接近零时梯度会趋于无穷大,当你的模型收敛时会带来不稳定性

试着消除你损失中的
tf.sqrt
,例如,最小化当前损失的平方


或者,您可以依赖现有的内置函数,如(但不适用于多维输出)。

如果没有tf.sqrt,则损失在-ve中。主要问题不是nan,可能是由于错误的实现。这是执行。你能看看我的实现是否正确吗?这些负值可能是由于阈值造成的;我不确定确切的阈值是多少。我将其设置为1(导致负值),当我将其更改为0(这是正常的)时,两种情况下的损失都会减少。但我不确定实施情况如何。