吴恩达深度学习笔记(103)-人脸识别之Siamese网络

Siamese 网络(Siamese network)

上个笔记中你学到的函数d的作用就是输入两张人脸,然后告诉你它们的相似度。实现这个功能的一个方式就是用Siamese网络,我们看一下。

吴恩达深度学习笔记(103)-人脸识别之Siamese网络

你经常看到这样的卷积网络,输入图片x^(1),然后通过一些列卷积,池化和全连接层(还记得都有什么特点么?),最终得到这样的特征向量(编号1)。

有时这个会被送进softmax单元来做分类,但在这笔记里我们不会这么做。

我们关注的重点是这个向量(编号1),加如它有128个数,它是由网络深层的全连接层计算出来的,我要给这128个数命个名字,把它叫做f(x^(1))。你可以把f(x^((1)))看作是输入图像x^(1)的编码,取这个输入图像(编号2),在这里是Kian的图片,然后表示成128维的向量。

吴恩达深度学习笔记(103)-人脸识别之Siamese网络

建立一个人脸识别系统的方法就是,如果你要比较两个图片的话,例如这里的第一张(编号1)和第二张图片(编号2),你要做的就是把第二张图片喂给有同样参数的同样的神经网络,然后得到一个不同的128维的向量(编号3),这个向量代表或者编码第二个图片,我要把第二张图片的编码叫做f(x^(2))。这里我用x^(1)和x^(2)仅仅代表两个输入图片,他们没必要非是第一个和第二个训练样本,可以是任意两个图片。

最后如果你相信这些编码很好地代表了这两个图片,你要做的就是定义d,将x^(1)和x^(2)的距离定义为这两幅图片的编码之差的范数,d(x^(1),x^(2))=||f(x^(1))-f(x^(2))||_2^2。

吴恩达深度学习笔记(103)-人脸识别之Siamese网络

对于两个不同的输入,运行相同的卷积神经网络,然后比较它们,这一般叫做Siamese网络架构。这里提到的很多观点,都来自于Yaniv Taigman,Ming Yang,Marc’ Aurelio Ranzato,Lior Wolf的这篇论文,他们开发的系统叫做DeepFace。

吴恩达深度学习笔记(103)-人脸识别之Siamese网络

怎么训练这个Siamese神经网络呢?

不要忘了这两个网络有相同的参数

,所以你实际要做的就是训练一个网络,它计算得到的编码可以用于函数d,它可以告诉你两张图片是否是同一个人。更准确地说,神经网络的参数定义了一个编码函数f(x^(i)),如果给定输入图像x^(i),这个网络会输出x^(i)的128维的编码。

你要做的就是学习参数,使得如果两个图片x^(i)和x^(j)是同一个人,那么你得到的两个编码的距离就小。前面几个幻灯片我都用的是x^(1)和x^(2),其实训练集里任意一对x^(i)和x^(j)都可以。相反,如果x^(i)和x^(j)是不同的人,那么你会想让它们之间的编码距离大一点

如果你改变这个网络所有层的参数,你会得到不同的编码结果,你要做的就是用反向传播来改变这些所有的参数,以确保满足这些条件。

你已经了解了Siamese网络架构,并且知道你想要网络输出什么,即什么是好的编码。

但是如何定义实际的目标函数,能够让你的神经网络学习并做到我们刚才讨论的内容呢?

在下一个笔记里,我们会看到如何用三元组损失函数达到这个目的。


分享到:


相關文章: