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

Posted

技术标签:

【中文标题】在 keras 中实现三元组损失的准确性【英文标题】:Implementing accuracy for triplet loss in keras 【发布时间】:2018-05-21 09:52:47 【问题描述】:

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

【问题讨论】:

如果我理解正确,您想实现一个代表网络准确性的指标,但您返回的是连续值,因此您不能使用 keras 的内置插件?这个准确度应该说明y_pred[0]&lt;pos_treshold and y_pred[1] &gt; neg_treshold 中的平均元素数是多少?我不知道您使用的是什么架构,您能否简要解释一下您的输出形状 @gionni 这是一个正常的三元组损失架构,在训练期间将三元组(锚、正、负)作为输入,为每个三元组计算一个特征向量,并存储两个距离作为输出在y_pred:anchor 和positive image 之间的距离以及anchor 和negative image 之间的距离。它经过训练,锚正距离接近0,锚负距离接近1。我需要一些准确性,以便我知道培训的效果(问题中的那些只是我没有工作的尝试)。 打印出平均锚正距离和平均锚负距离怎么样? 【参考方案1】:

这就是我使用的(条件 y_pred[0] 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

【讨论】:

以上是关于在 keras 中实现三元组损失的准确性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 keras 模型中实现汉明损失作为自定义指标

在具有条件的 keras 中实现自定义损失函数

在 cifar-10 上在 Keras 中实现 AlexNet 的准确性很差

在 Keras 中实现批次相关的损失

如何在 keras 中实现 ssim 的损失函数?

keras 和 scikit-learn 中 MLP 回归器的不同损失值和准确度