我想为三重态丢失网络实现精确度函数,以便我知道算法在训练期间如何工作。到目前为止,我已经尝试了一些东西,但我不确定它是否真的可以工作,而且我在keras中实现它也很麻烦。我的想法是比较预测的锚定阳性和锚定负距离(在y_pred
中),这样正的距离应该足够低而负的距离足够大:
def accuracy(_, y_pred):
pos_treshold = 0.4
neg_treshold = 0.6
return K.mean(y_pred[0] < pos_treshold and y_pred[1] > neg_treshold)
这个问题是我无法弄清楚如何在keras中实现这个and
条件。
然后我试图找到关于三重损失准确度的话题。一种方法是将精度定义为三元组数量的比例,其中锚图像和正图像之间的预测距离小于锚图像和负图像之间的预测距离。有了这个,我在keras中实现它时遇到了更大的问题。
我尝试了这个(虽然我不知道它是否符合我的描述):
K.mean(y_pred[0] < y_pred[1])
这使我的精度始终保持在0.5左右(可能是一些随机的东西)。所以我仍然不知道模型是坏还是精确度函数不好。
所以我的问题是如何在keras中实现任何合理的准确度函数?是否会是这两个中的一个,我真的不在乎。
答案 0 :(得分:0)
这就是我使用的(条件y_pred [0]
def triplet_accuracy(_, y_pred):
'''
Input: y_pred shape is (batch_size, 2)
[pos, neg]
Output: shape (batch_size, 1)
loss[i] = 1 if y_pred[i, 0] < y_pred[i, 1] else 0
'''
subtraction = K.constant([-1, 1], shape=(2, 1))
diff = K.dot(y_pred, subtraction)
loss = K.maximum(K.sign(diff), K.constant(0))
return loss