Я пытаюсь реализовать предельные потери, представленные в статье [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_)
Однако через несколько эпох значение переходит в нан. Я не уверен, какую ошибку я сделал. Кроме того, я использовал 1 вместо эпсилон (описанного в статье), потому что его значение было неясным. Точно так же точное пороговое значение также неизвестно.
Спасибо за любую помощь.
[1] https://ibug.doc.ic.ac.uk/media/uploads/documents/deng_marginal_loss_for_cvpr_2017_paper.pdf