在Tensorflow中实现全局三重态损失

时间:2019-05-04 11:26:01

标签: python tensorflow keras triplet

首先,感谢您阅读我的问题。我正在我的项目中尝试实现本文(https://arxiv.org/pdf/1512.09272.pdf)中描述的全局三元组损失。损失函数的主要思想可以概括为:

“ ...... 1)最小化两个分布的方差和匹配对之间的距离的平均值,以及2)最大化距离的平均值 在不匹配的对之间...“

对于我当前的三重态损失函数,我只是最小化了匹配对的批次之间的距离,而最大化了不匹配对的批次之间的距离。对于整体三元组损失,我需要记录两个距离并计算损失函数的两个分布的方差和均值。据我了解,应该在所有先前的训练数据中计算方差和均值。

当前,我可以使用以下不令人满意的代码来打印相关距离。

def global_triplet_loss():
    anchor = anchor_positive_negative_tensor[:, :, 0]
    positive = anchor_positive_negative_tensor[:, :, 1]
    negative = anchor_positive_negative_tensor[:, :, 2]

    Dp = K.sqrt(K.sum(K.square((anchor - positive)), axis=1))
    Dn = K.sqrt(K.sum(K.square((anchor - negative)), axis=1))

    Dp1 = K.mean(Dp)
    Dp1 = K.print_tensor(Dp1, message='mean dist between A and P = ')

    Dn1 = K.mean(Dn)
    Dn1 = K.print_tensor(Dn1, message='mean dist between A and N = ')

    b = Dp - Dn + Dn1 - Dn1 + Dp1 - Dp1

    return K.maximum(0.0, 1 + K.mean(b))

我尝试了多种方法,例如将距离张量值转换为整数并将其附加到外部列表中,该列表可用于存储距离并在损失函数中进行相关计算。任何关于如何实现这一点的想法都会受到赞赏,我到目前为止所做的一切都是完全无效,缓慢和低效的。

0 个答案:

没有答案