Tensorflow2.0—FaceNet网络原理及代码解析(二)--- Triplet loss函数

该博客详细介绍了FaceNet中使用的TripletLoss原理,包括其输入参数a(基准图片特征)、p(正样本特征)和n(负样本特征),以及如何通过设置margin(α)来优化损失函数。代码实现部分展示了如何在TensorFlow2.0中计算并应用TripletLoss,包括计算欧氏距离和损失,并进行最大值操作确保loss的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# Tensorflow2.0—FaceNet网络原理及代码解析(二)— Triplet loss函数

Facenet使用的是Triplet loss~

一、原理

在这里插入图片描述

Triplet Loss的输入是三个相同长度的向量(这里为128):
a:anchor,基准图片获得的128维人脸特征向量
p:positive,与基准图片属于同一张人脸的图片获得的128维人脸特征向量
n:negative,与基准图片不属于同一张人脸的图片获得的128维人脸特征向量


根据公式,可以看出来,为了让loss越低,那么就得让a与p的向量之间的欧式距离越短,同时让a与n的向量之间的欧式距离越长
,只有这样才能保证loss的总值越低。
这里,有个小疑问~

为什么要设置margin(α)?
答:
在这里插入图片描述
引用:https://zhuanlan.zhihu.com/p/171627918

二、代码实现

def _triplet_loss(y_true, y_pred):
	#提取a,p,n向量
    anchor, positive, negative = y_pred[:batch_size], y_pred[batch_size:int(2*batch_size)], y_pred[-batch_size:]

    pos_dist = K.sqrt(K.sum(K.square(anchor - positive), axis=-1)) #计算a与p向量之间的欧式距离
    neg_dist = K.sqrt(K.sum(K.square(anchor - negative), axis=-1)) #计算a与n向量之间的欧式距离

    basic_loss = pos_dist - neg_dist + alpha #公式
    
    idxs = tf.where(basic_loss > 0)
    select_loss = tf.gather_nd(basic_loss,idxs)

    loss = K.sum(K.maximum(basic_loss, 0)) / tf.cast(tf.maximum(1, tf.shape(select_loss)[0]), tf.float32)
    return loss
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进我的收藏吃灰吧~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值