我想为三重态损失网络实现精度功能,以便我知道算法在训练过程中如何工作。到目前为止,我已经尝试过一些东西,但是我不确定它是否真的可以工作,而且在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中实现任何合理的精度函数?我不在乎这是否是这两个之一。
这就是我所使用的(条件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
您能够找到您的准确性问题的答案吗?让我知道你是否有,因为我也确实需要帮助