Facenet在线三联体生成

时间:2017-08-05 19:48:29

标签: machine-learning neural-network conv-neural-network

文章here提到了一种为卷积神经网络生成三元组的智能方法(为了生成面嵌入)。

对于包含n张图像的小批量,只有半硬三联用于学习(包含半硬阴影的三元组,它们是负图像足够接近锚图像。)

  1. 如何创建训练集?批处理包含什么?
  2.   

    在我们的实验中,我们对训练数据进行采样,大约40个   每个小批量的每个标识选择面。另外,   随机抽样的负面被添加到每个小批量。

    我做了什么

    我在Wild数据集中使用Labeled Faces进行训练(13233个图像,5749个人,1680个人有两个或更多图像,每个批次我选择了一个锚点,一些正面(意思是我)只能使用 1680批次,因为我需要一个人的多个图像)和负片 - 随机选择的其他人的图像。

    我的训练集出了点问题。迷你批次是否应包含更多锚点?

      

    我们使用所有锚定阳性,而不是选择最难的阳性   在小批量中配对,同时仍然选择硬底片

    1. 在线三联体生成?怎么做? (欢迎提供技术细节)
    2.   

      在线生成三元组。这可以通过选择硬盘来完成   小批量内的正/负样本。

      要选择我需要计算三胞胎嵌入的半硬底片。所以我需要通过三重神经网络进行传递,并比较嵌入。然后,我需要使用硬三元组计算损失函数 。这就是我认为我必须做的事情。

      我使用三个卷积神经网络共享参数(四个具有最大池和一个完全连接层的卷积层)。 我没有使用在线三元组生成,因为我无法理解它是如何完成的。它导致精度不超过70%。

1 个答案:

答案 0 :(得分:1)

这个三元组网络不是最先进的方法,但绝对是该领域最好的里程碑之一。这不是那么直观,但我们开始了:

的意思是正确的:在训练期间,在您定义的每个“时期”之后,您使用您的嵌入模型来计算您的图库和查询的嵌入。然后,您想要创建那些“半硬”三元组。因此,假设您有 person1,即锚点,您尝试将其与其他所有人(person2、3 等)匹配。然后,你想取一个离他最近的,也许用一个阈值来定义它足够接近,这样你就可以称之为难。那是消极的。对于积极的,你也可以尝试采取离他最远的一个,但这不一定是好的。对不良数据要谨慎。你至少需要有一个积极的。

所以现在每个人都有一个三元组:1 个锚点、1 个否定(最接近)和 1 个肯定。你可以在整个数据集上预先计算这个,或者随机选择足够大的列表,这样你就有足够的时间来填充一个纪元。完成此操作后,您就可以使用这些三元组并填充一个批次。

您在每个时期重复该计算以生成新的三元组以用于下一个时期。您这样做的次数越多,您获得的“在线”就越多。 必须重复的原因是嵌入模型发生了变化。所以你可能已经改进了以前的“困难”,但现在模型处理得更好,其他情况因此变得“困难”。所以它一定是一个迭代的过程。您可以将其视为某种期望最大化,其中期望是您计算数据距离的地方,而最大化是最小化嵌入模型的损失(最大化可能性/准确性)。然后重复。

作者在论文中提到的另一件事是批处理的一部分是这样完成的(负挖掘),而其他的只是通过随机选择的负样本(从负池中)来完成,以保持嵌入空间的完整性。一旦你的模型训练得足够多,这实际上是一种浪费,因为如果负样本很远,由于边际损失,损失可能为 0,对网络没有任何梯度。这就是为什么你没有得到很好的准确度的部分原因——模型看到了他正确处理的东西。仅通过随机选择遇到“硬”三元组的概率相对较低(想想三元组空间的复杂性)。

所以基本上这个想法是有三元组的批次会导致损失,所以你将最小化改进模型的东西,而不是每隔很长一段时间都会遇到一个硬三元组。这对于将此类模型提高到它实际上值得信赖的准确度水平(FRR@FAR-wise)极其重要。

最后,关于此使用批次中的所有正数 - 您也可以使用所有负数。因此,您可能在一批中拥有同一个人的两个主播,或者甚至一个主播对另一个主播是负面的。您可以批量计算所有成对距离,然后将它们用作样本。不过也需要平衡一下。编码也更复杂,因为您需要小心,考虑哪个嵌入属于谁,相应地将其称为正面或负面。

相关问题