深度学习笔记(四)(4)人脸识别和神经风格转换

    技术2025-02-05  3

    深度学习笔记(四)(4)人脸识别和神经风格转换

    返回目录

    4.1 什么是人脸识别?(What is face recognition?)

    主要讲了人脸识别与活体检测。 人脸识别问题比人脸验证问题难很多(书整理者注:1 对多问题(1:𝐾)) 人脸验证之所以难,原因之一在于要解决“一次学”(one-shot learning problem)问题。

    4.2 One-Shot 学习(One-shot learning)

    人脸识别所面临的一个挑战就是你需要解决一次学习问题,这意味着在大多数人脸识别应用中,你需要通过单单一张图片或者单单一个人脸样例就能去识别这个人。 有一种办法是,将人的照片放进卷积神经网络中,使用 softmax 单元来输出 4 种,或者说 5 种标签,分别对应这 4 个人,或者 4 个都不是,所以 softmax 里我们会有 5 种输出。但实际上这样效果并不好,因为如此小的训练集不足以去训练一个稳健的神经网络,并且如果数据库多了一个新的成员图片,这样就更不行了。 所以要让人脸识别能够做到一次学习,为了能有更好的效果,你现在要做的应该是学习Similarity 函数。 要将它应用于识别任务,你要做的是拿这张新图片(编号 6),然后用𝑑函数去比较这两张图片(编号 1 和编号 6),这样可能会输出一个非常大的数字,在该例中,比如说这个数字是 10。之后你再让它和数据库中第二张图(编号 2)片比较,因为这两张照片是同一个人,所以我们希望会输出一个很小的数。然后你再用它与数据库中的其他图片(编号 3、4)进行比较,通过这样的计算,最终你能够知道,这个人确实是 Danielle。对应的,如果某个人(编号 7)不在你的数据库中,你通过函数𝑑将他们的照片两两进行比较,最后我们希望𝑑会对所有的比较都输出一个很大的值,这就证明这个人并不是数据库中 4 个人的其中一个。

    4.3 Siamese 网络(Siamese network)

    的函数𝑑的作用就是输入两张人脸,然后告诉你它们的相似度。实现这个功能的一个方式就是用 Siamese 网络。 怎么训练这个 Siamese 神经网络呢?通过他的功能,它计算得到的编码可以用于函数𝑑,它可以告诉你两张图片是否是同一个人。更准确地说,神经网络的参数定义了一个编码函数𝑓(𝑥),如果给定输入图像𝑥,这个网络会输出𝑥的 128 维的编码。要做的就是学习参数,使得俩个图片如果是同一个人就让俩个编码的距离小,不然就大。 如果你改变这个网络所有层的参数,你会得到不同的编码结果,你要做的就是用反向传播来改变这些所有的参数,以确保满足这些条件。

    4.4 Triplet 损失(Triplet 损失)

    要想通过学习神经网络的参数来得到优质的人脸图片编码,方法之一就是定义三元组损失函数然后应用梯度下降。 这时要对公式做点小改变,防止出现两端都为0的恒等式子,因为这没有帮助。 更加公式化的表达: 对于一个: 对于多个: 这是一个三元组定义的损失,整个网络的代价函数应该是训练集中这些单个三元组损失的总和。假如你有一个 10000 个图片的训练集,里面是 1000 个不同的人的照片,你要做的就是取这 10000 个图片,然后生成这样的三元组,然后训练你的学习算法,对这种代价函数用梯度下降,这个代价函数就是定义在你数据集里的这样的三元组图片上。 注意,为了定义三元组的数据集你需要成对的𝐴和𝑃,即同一个人的成对的图片,为了训练你的系统你确实需要一个数据集,里面有同一个人的多个照片。这是为什么在这个例子中,我说假设你有 1000 个不同的人的 10000 张照片,也许是这 1000 个人平均每个人 10 张照片,组成了你整个数据集。如果你只有每个人一张照片,那么根本没法训练这个系统。当然,训练完这个系统之后,你可以应用到你的一次学习问题上,对于你的脸识别系统,可 能你只有想要识别的某个人的一张照片。但对于训练集,你需要确保有同一个人的多个图片,至少是你训练集里的一部分人,这样就有成对的 Anchor 和 Positive 图片了。 如何选择这些三元组来形成训练集? 若随机的选取,会导致𝐴和𝑁比𝐴和𝑃差别很大的概率很大,**所以为了构建一个数据集,你要做的就是尽可能选择难训练的三元组𝐴、𝑃和𝑁。**你想要所有的三元组都满足这个条件(𝑑(𝐴, 𝑃) + 𝑎 ≤ 𝑑(𝐴, 𝑁)),难训练的三元组就是,你的𝐴、𝑃和𝑁的选择使得𝑑(𝐴, 𝑃)很接近𝑑(𝐴, 𝑁),即𝑑(𝐴, 𝑃) ≈ 𝑑(𝐴, 𝑁),这样 你的学习算法会竭尽全力使右边这个式子变大(𝑑(𝐴, 𝑁)),或者使左边这个式子(𝑑(𝐴, 𝑃))变小,这样左右两边至少有一个𝑎的间隔。 顺便一提的深度学习算法命名 “某某”网络或者深度“某某”,是深度学习领域流行的命名算法的方式。 这一领域的一个实用操作就是下载别人的预训练模型,而不是一切都要从头开始。

    4.5 人 脸 验 证 与 二 分 类 ( Face verification and binary classification)

    Triplet loss 是一个学习人脸识别卷积网络参数的好方法,还有其他学习参数的方法,让我们看看如何将人脸识别当成一个二分类问题。 把人脸验证当作一个监督学习,创建一个只有成对图片的训练集,不是三个一组,而是成对的图片,目标标签是 1 表示一对图片是一个人,目标标签是 0 表示图片中是不同的人。利用不同的成对图片,使用反向传播算法去训练神经网络,训练 Siamese 神经网络。

    4.6 什么是神经风格迁移?(What is neural style transfer?)

    利用右边照片的风格来重新创造原本的照片

    4.7 深度卷积网络学习什么?(What are deep ConvNets learning?)

    对于第一层: 这是 9 个不同的代表性神经元(9个为1个空),每一个不同的图片块都最大化地激活了。你可以这样理解,第一层的隐藏单元通常会找一些简单的特征,比如说边缘或者颜色阴影。 在深层部分,一个隐藏单元会看到一张图片更大的部分,在极端的情况下,可以假设每一个像素都会影响到神经网络更深层的输出,靠后的隐藏单元可以看到更大的图片块。

    4.8 代价函数(Cost function)

    给你一个内容图像𝐶,给定一个风格图片𝑆,而你的目标是生成一个新 图片𝐺。为了实现神经风格迁移,你要做的是定义一个关于𝐺的代价函数𝐽用来评判某个生成图像的好坏,我们将使用梯度下降法去最小化𝐽(𝐺),以便于生成这个图像。 算法的运行

    4.9 内容代价函数(Content cost function)

    假如说,你用隐含层𝑙来计算内容代价,一般的l选择为适中,然后用一个预训练的卷积模型,可以是 VGG 网络或者其他的网络也可以。

    4.10 风格代价函数(Style cost function)

    格与输入的风格图像的相似程度。之所以用大写字母𝐺来代表这些风格矩阵,是因为在线性代数中这种矩阵有时也叫 Gram 矩阵,但在这里我只把它们叫做风格矩阵。你要做的就是计算出这张图像的风格矩阵,以便能够测量出刚才所说的这些相关系数。用ai,j,k表示相应位置的激活值。 要注意:若俩个通道中的激活项都很大,显然G值也很大,对应地,如果 他们不相关那么𝐺 就会很小,严格来讲,吴老师一直使用这个公式来表达直觉想法,但它其实是一种非标准的互协方差,因为我们并没有减去均值而只是把这些元素直接相乘,这就是计算图像风格的方法。 最后,这是对𝑙层定义的风格代价函数,和之前你见到的一样,这是两个矩阵间一个基本的 Frobenius 范数,也就是𝑆图像和𝐺图像之间的范数再乘上一个归一化常数,不过这不是很重要。 我们还需要对每个层定义权重,也就是一些额外的超参数,我们用𝜆[𝑙]来表示,这样将使你能够在神经网络中使用不同的层,包括之前的一些可以 测量类似边缘这样的低级特征的层,以及之后的一些能测量高级特征的层,使得我们的神经网络在计算风格时能够同时考虑到这些低级和高级特征的相关系数。这样,在基础的训练中你在定义超参数时,可以尽可能的得到更合理的选择。

    4.11 一维到三维推广(1D and 3D generalizations of models)

    不多说了,没有实际的东西,只是简单的介绍了一下。

    2020年7月4日

    返回目录

    Processed: 0.009, SQL: 9