来源:Coursera吴恩达深度学习课程
上个文章One-Shot学习/一次学习(One-shot learning)中函数d的作用就是输入两张人脸图片,然后输出相似度。实现这个功能的一个方式就是用Siamese网络。
上图是常见的卷积网络,输入图片x^(1),然后经过卷积层、池化层和全连接层,最终得到特征向量。假如它有128个数,它是由网络深层的全连接层计算出来的,给这128个数命个名字,f(x^(1)),可以看成是图像x^(1)的编码。建立一个人脸识别系统的方法就是:如果要比较两个图片的话,把第二张图片x^(2)喂给有同样参数的神经网络,然后得到一个不同的128维向量。这里x^(1)和x^(2)仅代表两个输入图片,是任意两个图片。
接下来定义d,将x^(1)和x^(2)的距离定义为这两种图片编码之差的范数:
对于两个不同的输入,运行相同的卷积神经网络,然后比较它们,这一般叫做Siamese网络架构(Siamese neural network architecture)。这里提到的很多观点,都来自于Yaniv Taigman,Ming Yang,Marc’ Aurelio Ranzato,Lior Wolf的这篇论文DeepFace closing the gap to human level performance,他们开发的系统叫做DeepFace。怎么训练这个Siamese神经网络呢?
由于两个网络有相同的参数,因此就是训练一个网络。我们要做的就是学习参数,如果两张图片是同一个人,那两个编码的距离就很小;如果是不同的人,编码距离就大一些。如果你改变这个网络所有层的参数,你会得到不同的编码结果,你要做的就是用反向传播(back propagation)来改变这些所有的参数,以确保满足这些条件。
现在我们已经了解了Siamese网络架构,并且知道想要网络输出什么,即什么是好的编码。但是如何定义实际的目标函数(define an objective function),能够让神经网络学习并做到我们刚才讨论的内容呢?在下一个文章里,我们会看到如何用三元组损失函数达到这个目的。
说明:记录学习笔记,如果错误欢迎指正!转载请联系我。