首页 文章

实现keras中三重态丢失的准确性

提问于
浏览
2

我想为三重损耗网络实现精确度函数,以便我知道,算法在训练期间如何工作 . 到目前为止,我已经尝试了一些东西,但我不确定它是否真的可以工作,而且我在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中实现任何合理的准确度函数?是否会是这两个中的一个,我真的不在乎 .

1 回答

  • 0

    那个's what I use (condition y_pred[0] < y_pred[1]), while taking into account the batch dimension. Note that I'我没有使用 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
    

相关问题