4.3 Siamese 网络-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

Siamese 网络 (Siamese Network)

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

在这里插入图片描述

你经常看到这样的卷积网络,输入图片 x ( 1 ) x^{(1)} ,然后通过一些列卷积,池化和全连接层,最终得到这样的特征向量(编号1)。有时这个会被送进softmax单元来做分类,但在这个视频里我们不会这么做。我们关注的重点是这个向量(编号1),假如它有128个数,它是由网络深层的全连接层计算出来的,我要给这128个数命个名字,把它叫做 f ( x ( 1 ) ) f(x^{(1)}) 。你可以把 f ( x ( 1 ) ) f(x^{(1)}) 看作是输入图像 x ( 1 ) x^{(1)} 的编码,取这个输入图像(编号2),在这里是Kian的图片,然后表示成128维的向量。

在这里插入图片描述

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

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

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

在这里插入图片描述

怎么训练这个Siamese神经网络呢?不要忘了这两个网络有相同的参数,所以你实际要做的就是训练一个网络,它计算得到的编码可以用于函数 d d ,它可以告诉你两张图片是否是同一个人。更准确地说,神经网络的参数定义了一个编码函数 f ( x ( i ) ) f(x^{(i)}) ,如果给定输入图像 x ( i ) x^{(i)} ,这个网络会输出 x ( i ) x^{(i)} 的128维的编码。你要做的就是学习参数,使得如果两个图片 x ( i ) x^{(i)} x ( j ) x^{(j)} 是同一个人,那么你得到的两个编码的距离就小。前面几个幻灯片我都用的是 x ( 1 ) x^{(1)} x ( 2 ) x^{(2)} ,其实训练集里任意一对 x ( i ) x^{(i)} x ( j ) x^{(j)} 都可以。相反,如果 x ( i ) x^{(i)} x ( j ) x^{(j)} 是不同的人,那么你会想让它们之间的编码距离大一点。

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

你已经了解了Siamese网络架构,并且知道你想要网络输出什么,即什么是好的编码。但是如何定义实际的目标函数,能够让你的神经网络学习并做到我们刚才讨论的内容呢?在下一个视频里,我们会看到如何用三元组损失函数达到这个目的。

课程板书

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原创文章 297 获赞 12 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_36815313/article/details/105797680