Contrastive Loss

版权声明: https://blog.csdn.net/u013841196/article/details/89875889

对比损失函数,来自Yann LeCun的论文《Dimensionality Reduction by Learning an Invariant Mapping》,出发点:增大类间差异并且减小类内差异

公式如下:
在这里插入图片描述
在这里插入图片描述
Y=0表示x1和x2是相似的,Ls表示相似时候的度量,通常用距离的平方表示,用来惩罚相似时候预测距离变大的问题。Y=1表示x1和x2不相似,Ld表示不相似的距离,用hinge loss的平方表示,用来鼓励x1和x2不一致时,二者距离越大越好。公式4是L函数,其中的Ls和Ld如下图所示。

在这里插入图片描述
上图表示的就是损失函数L与样本特征的欧式距离之间的关系,其中红色虚线表示的是相似样本的损失值,蓝色实线表示的不相似样本的损失值。

Contrastive Loss实现

#注:label=1,同一人;label=0,不同人。
def contrastive_loss(model1, model2, y):
    margin = 5.0
    labels_t = y
    labels_f = tf.subtract(tf.to_int64(1), y, name="1-yi")

    eucd2 = tf.pow(tf.subtract(model1, model2), 2)
    eucd2 = tf.reduce_sum(eucd2, 1)
    eucd = tf.sqrt(eucd2+1e-6, name="eucd")
    C = tf.constant(margin, name="C")
    
    # yi*||CNN(p1i)-CNN(p2i)||^2 + (1-yi)*max(0, C-||CNN(p1i)-CNN(p2i)||)^2
    pos = tf.multiply(tf.to_float(labels_t), eucd2, name="yi_x_eucd2")
    neg = tf.multiply(tf.to_float(labels_f), tf.pow(tf.maximum(tf.subtract(C, eucd), 0), 2), name="Nyi_x_C-eucd_xx_2")
    losses = tf.add(pos, neg, name="losses")
    loss = 0.5*tf.reduce_mean(losses, name="loss")
    return model1, model2, loss       

注:博众家之所长,集群英之荟萃。

猜你喜欢

转载自blog.csdn.net/u013841196/article/details/89875889