Module 04 · Special Applications: Face recognition & Neural Style Transfer
Siamese Network孪生网络
在前一个视频中,我们探讨了函数 d 的作用,即输入两张面部照片并告知它们有多相似或多不同。一种常见的解决方案是使用 Siamese 网络(孪生网络)。接下来,我们将深入了解这种网络架构。
传统卷积神经网络 vs. Siamese 网络
你可能已经熟悉这样的 卷积神经网络(CNN) 结构:
- 输入一张图片(例如:x₁),通过一系列的卷积层、池化层以及全连接层,最终得到一个特征向量。
- 该特征向量通常会传递给 softmax 单元进行分类,但在本视频中我们不使用分类。
我们将重点关注由网络中较深层的全连接层计算出的 128维特征向量。
我们可以把这个向量称作 f(x₁),你可以将它视为输入图像 x₁ 的一种 编码。这意味着,网络将 x₁(例如 Kian 的照片)转化为一个包含 128 个数值的向量。
如何使用 Siamese 网络进行面部识别
为了比较两张图片,假设第一张图片为 x₁,第二张图片为 x₂,你可以这样做:
- 将第二张图片 x₂ 输入同一个神经网络,并通过相同的网络参数,计算出另一组 128维编码向量,我们称其为 f(x₂)。
- 这两张图片的编码是 f(x₁) 和 f(x₂),表示两张图片的特征。
计算图片相似度:距离度量
- 如果你认为这些编码是对图片的良好表示,那么接下来的步骤就是计算 x₁ 和 x₂ 之间的距离度量。
- 这个距离度量可以通过计算它们的 编码差异的范数 来实现。
我们用公式表示:
其中,d(x₁, x₂) 表示 x₁ 和 x₂ 之间的距离,通常用向量的欧几里得范数表示。

Siamese 网络架构
这种方法,即对 两个不同输入 使用 相同的卷积神经网络 并进行比较,有时被称为 Siamese 网络架构。
许多关于这个想法的研究来源于 Yaniv Taigman、Ming Yang、Marc'Aurelio Ranzato 和 Lior Wolf 所开发的 DeepFace 系统。
训练 Siamese 网络:目标函数
要训练这种 Siamese 网络,我们需要确保 两个神经网络的参数相同。
目标是通过训练使得网络 编码出的特征向量 能够有效地计算出一个 距离函数 d,从而判断两张图片是否属于同一个人。
目标:
- 给定任意输入图片 xᵢ,神经网络输出 128维的编码 f(xᵢ)。
- 如果两张图片 xᵢ 和 xⱼ 属于同一个人,那么它们的 编码之间的距离应该较小。
- 如果两张图片属于不同的人,编码之间的 距离应该较大。
通过不断调整神经网络中所有层的参数,并使用 反向传播 算法,我们可以优化这些参数,使得 相似度函数 满足上述条件。
下一步:如何定义目标函数
你已经了解了 Siamese 网络架构,并对神经网络应该如何输出有效的 编码 有了初步了解。那么,接下来如何定义一个 目标函数 来训练神经网络,实现上述功能呢?
我们将在下一个视频中探讨如何使用 三元组损失函数(triplet loss function)来实现这一目标。
总结
在本视频中,我们探讨了如何利用 Siamese 网络 来解决面部识别中的 一-shot学习 问题。
通过学习图像的 128维编码 和计算 编码之间的距离,我们能够判断两张图片是否为同一个人。
在接下来的视频中,我们将继续深入了解如何使用 三元组损失函数 来训练网络并优化这一过程。