2

我想为三元组损失网络实现一个准确度函数,以便我知道该算法在训练期间是如何工作的。到目前为止,我已经尝试了一些东西,但我不确定它是否真的可以工作,而且我在 keras 中实现它也遇到了麻烦。我的想法是比较预测的anchor-positive和anchor-negative距离(in 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)

这个问题是我无法弄清楚如何and在 keras 中实现这个条件。

然后我试图找到关于三元组损失准确性的主题。一种方法是将精度定义为三元组数量的比例,其中锚图像和正图像之间的预测距离小于锚图像和负图像之间的距离。有了这个,我在 keras 中实现它时遇到了更大的问题。

我试过这个(虽然我不知道它是否符合我的描述):

K.mean(y_pred[0] < y_pred[1])

这让我的准确度一直在 0.5 左右(可能是一些随机的东西)。所以我仍然不知道是模型不好还是精度功能不好。

所以我的问题是如何在 keras 中实现任何合理的精度函数?是否会是这两个中的一个,我真的不在乎。

4

1 回答 1

0

这就是我使用的(条件 y_pred[0] < y_pred[1]),同时考虑到批处理维度。请注意,我没有使用 a 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
于 2019-02-21T21:49:43.090 回答