【61】Siamese网络

上篇笔记里提到的函数d的作用:

输入两张人脸,然后告诉它们的相似度

实现这个功能的一个方式就是用Siamese网络

经常看到这样的卷积网络,输入图片x(1)
然后通过一些列卷积,池化和全连接层
最终得到这样的特征向量(编号1)

有时这个会被送进softmax单元来做分类,但在这里不会这么做
关注的重点是这个向量(编号1),假如它有128个数,它是由网络深层的全连接层计算出来的
要给这128个数命个名字,把它叫做f(x(1))
可以把f(x(1))看作是输入图像x(1)的编码,取这个输入图像(编号2)
在这里是大雄的图片,然后表示成128维的向量

2. 建立人脸识别系统
建立一个人脸识别系统的方法:

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

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

对于两个不同的输入,运行相同的卷积神经网络,然后比较它们
这一般叫做Siamese网络架构

这里提到的很多观点,都来自于Yaniv Taigman,Ming Yang,Marc’ Aurelio Ranzato,Lior Wolf的论文
他们开发的系统叫做DeepFace

3. 训练网络
不要忘了这两个网络有相同的参数,所以实际要做的就是训练一个网络
它计算得到的编码可以用于函数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)是不同的人,那么会想让它们之间的编码距离大一点

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

猜你喜欢

转载自www.cnblogs.com/lau1997/p/12384901.html
61