繁体   English   中英

在 keras 中实现三元组损失的准确性

[英]Implementing accuracy for triplet loss in keras

我想为三元组损失网络实现一个准确度函数,以便我知道算法在训练过程中是如何工作的。 到目前为止,我已经尝试了一些东西,但我不确定它是否真的可以工作,而且我在 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] < y_pred[1]),同时考虑到批次维度。 请注意,我没有使用mean ,因此它将支持样本权重。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM