siamese-triplet

Siamese network

可参考代码地址:github


背景

在人脸识别中,存在所谓的one-shot问题。举例来说,就是对公司员工进行人脸识别,每个员工只给你一张照片(训练集样本少),并且员工会离职、入职(每次变动都要重新训练模型)。有这样的问题存在,就没办法直接训练模型来解决这样的分类问题了。

为了解决one-shot问题,我们会训练一个模型来输出给定两张图像的相似度,所以模型学习得到的是similarity函数。

哪些模型能通过学习得到similarity函数呢?Siamese网络就是这样的一种模型。

Siamese网络原理

简单来说,Siamese network就是“连体的神经网络”,神经网络的“连体”是通过共享权值来实现的,如下图所示。

这里的Net1,Net2可以是lstm,cnn等等,都可以。 这里的关键是它们的权值是共享的。

Triplet network

Siamese network的基础上又出现了Triplet network。论文是《Deep metric learning using Triplet network》

目标

  • 使具有相同标签的样本在embedding空间尽量接近。

  • 使具有不同标签的样本在embedding空间尽量远离。

如果只遵循以上两点,最后embedding空间中相同类别的样本间距离很小,不同类别的样本之间距离也会偏小。因此,需要加入margin。

这里我们希望不同类的距离大,但也不是越大越好

Siamese network loss function一般用哪一种呢?

这里的损失函数主要是用于衡量两个样本之间的相似度。

常用的就是欧式距离,交叉熵,余弦距离,很多论文也提出了比较复杂的损失函数。

下面给出一些参看论文:

这篇论文主要是提出了siamese network 和 其使用的损失函数

Learning a Similarity Metric Discriminatively, with Application to Face Verification

这篇论文在siamese network的基础上提出了triplet network和相关的损失函数。

FaceNet: A Unified Embedding for Face Recognition and Clustering

0%