# 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