吴恩达深度学习笔记之卷积神经网络(特殊应用)

4.1 人脸识别

Verification

(1) Input image,name/ID
(2) Output whether the input image is that of the claimed person

Recognition

(1) Has a database of k persons
(2) Get an input image
(3) Output ID if the image is any of the k persons

人脸识别之所以难事因为要解决一次学习问题。

4.2 one-shot 学习

上一小节末尾,我们已经知道人脸识别所面临的挑战就是需要解决一次性学习问题。
这意味着在绝大多数人脸识别应用中,我们需要通过单单一张图片或者单单一张人脸就能是识别这个人。
这里我们应该学习一个similarity函数,详细地说,我们想神经网络学习下面一个用d表示的函数,如下所示:

这里写图片描述

它以两张图片作为输入,然后输出这两张图片的差异值,如果是同一个人的两张照片,我们希望这个差异值很小,不同人的照片则希望差异值很大。所以在识别过程中,我们需要设置一个阈值 τ ,这个阈值是一个超参数,如果小于这个阈值,就判定是同一个人,否则不是。这就是一次学习的核心。

4.3 siamese 网络

函数d的作用就是输入两个人脸,然后告诉我们,他们的相似度,实现这个功能的方式是siamese 网络。
具体如下:

这里写图片描述

我们将图片 x(1) 输入一个网络得到一行编码 f(x(1)) ,然后将图片 x(2) 输入一个与上面网络具有同样参数的网络,也就是同一个网络得到 f(x(2)) ,最后定义编码之差的范数即 d(x(1),x(2))=f(x(1))f(x(2))22 对于两个不同的输入,运行相同的网络,然后比较他们,一般叫做Siamese网络。
Parameters on NN define an encoding f(x(i))
learn parameters so that :

if x(i) and x(j) are the same person, f(x(i))f(x(j))22 is small
if x(i) and x(j) are the different person, f(x(i))f(x(j))22 is large

4.4 Triplet loss

要想通过学习神经网络的参数,来得到优质的人脸图片编码,方法之一就是定义三元组损失函数,然后应用梯度下降。为了应用三元组损失函数,我们需要比较成对的图片,如下:

这里写图片描述

我么想要左边的编码相似,因为这是同一个人,我们希望右边的编码差异大,因为他是不同的人。
三元组损失就是,我们希望anchor图片和positive图片更近,anchor图片和negative图片更远。我们可以用以下公式表示:

这里写图片描述

其中 是超参数,它不小于0.2,这个 是为了确保网络对于所有的编码不会总是输出0而设置的,也为了确保它不会把所有的编码都设成互相相等的。
三元素损失函数的定义基于三张图片,分别是A,P,N,其中A,P是同一个人,A,N是不同的人。损失函数如下:

L(A,P,N)=max(f(A)f(P)2f(A)f(N)2+α,0)

通过最小化上述的代价函数,达到的效果就是 L(A,P,N) =0,整个网络的代价函数应该是训练集中这些单个元组的损失的总和。如下:
J=i=1mL(A,P,N)

注意:

为了定义三元组的数据集,我们需要成对的A和P,如果说训练1000个人,我们可能需要10000张照片,组成整个数据集,如果一个人只有一张照片那么根本无法训练系统。当然,训练完这个系统之后,就可以应用到一次学习问题上了。对于人脸识别系统,可能只有想要的某个人的一张照片,但是对于训练集,我们要确保有同一个人的多张照片。

其次还有一个问题,就是该如何选择训练集,在这个问题上,我们应该尽量选择难训练的三元组A,P,N。所谓难,就是我们的A,P和N的选择使得d(A,P)很接近d(A,N)即:

d(A,P)d(A,N)

这样学习算法会竭尽全力使d(A,P)变大,使d(A,N)变小,这样左右两边至少有一个∂的间隔,其次选择这样的三元组,可以提高学习算法的计算效率。如果随机的选择这些三元组,其中有太多会很简单,此时梯度算法不会有什么效果,因为网络很轻松就能得到正确的结果。只有选择难得三元组,梯度下降才能发挥作用,使得两边离得尽可能远。

总结一下:

训练这个三元组损失,我们要取我们的训练集,然后把它做成很多三元组。

4.5 面部验证与二分类(Face verification and binary classification)

三元组损失是一个学习人脸识别卷积网络参数的好方法,还有其他学习参数的方法。例如,我们可以将人脸识别当作一个而分类问题。如下所示:

这里写图片描述

我们首先选取siamese网络,然后计算图片的嵌入,如128维或者更高维,然后将其输入到逻辑回归单元,然后进行预测,如果是相同的人则输出1,否则输出0,这就把人脸识别问题转化为一个二分类问题,训练这种系统时,可以替换Triplet loss的方法。最后输出 y^ ,如下:

y^=σ(k=1128wif(x(i))kf(x(j))k+b)
f(x(i))k 是图片 x(i) 的编码,下标k代表选择这个向量的第k个元素,对这两个编码,取元素差的绝对值。与之前类似,我们训练的也是一个siamese网络,这意味着上面的那个神经网络和下面的网络具有相同的参数,这样的系统效果也很好。
在这里提一个 技巧,可以帮我们显著提高部署效果。还是采用上面那幅图片为例。

这里写图片描述

假设第一张人脸为新图片,下面是数据库中的图片,我们不需要每次都计算下面那张图片的特征,我们可以提前计算好,当一个新员工进来时,对新员工进行编码,然后和预先计算好的编码进行比较,然后再输出预测值 y^

总结一下:

可以将人脸验证当作一个监督学习,创建一个只有成对图片的训练集,不是三个一组而是成对的照片,目标标签是1表示一对照片是同一个人,目标标签是0表示图片中是不同的人。如下图所示:

这里写图片描述

4.6 什么是神经风格转换(what is neural style transfer ?)

简而言之,就是利用一张内容图片和一张风格图片,生成一张新的图片,这张图片有一种艺术风格,如图所示:

这里写图片描述

4.7 代价函数(cost function)

要构建一个神经风格迁移系统,我们需要定义一个代价函数,通过最小化代价函数,生成我们想要的任何图像。我们的问题是,给订一个内容图像C,和一个风格图像S,生成一下新图象G。其中代价函数分为两部分,一部分是内容代价,一部分是风格代价。内容代价是用来衡量生成图片的内容和内容图片C的相似度,风格代价用来衡量图片G的风格和和图片S的风格的相似度,最后利用两个超参数来确定内容代价和风格代价之间的权重。代价函数如下:

J(G)=α×Jcontent(C,G)+β×Jstyle(S,G)

4.8 内容代价函数(content cost function)

假如我们我们用隐藏层来计算内容代价函数,如果l是很小的数,这个代价函数就会使我们的生成图片像素上非常接近内容图片,然而如果用很深的层,那么如果内容图片有一只狗,他就会确保生成图片有一只狗,所以在实际中,这个层l在网络中既不会选的太浅,也不会选的太深,通常l会选在中间层,然后用一个与训练的卷积模型如VGG,其他的也可以。内容代价函数如下:

Jcontent(C,G)=12a[l](C)a[l](G)2
其中 a[l](C) 表示内容图片在l层的激活值,从公式可以看出,如果这两个激活值相似,那么就意味着两个图片的内容相似。

4.9 风格损失函数(style cost function)

图片的风格到底是什么?这么说吧,比如我们有下面一张图片。

这里写图片描述

它能算出这里是否含有不同的隐藏层,现在我们随机选择某一层l如下图所示:

这里写图片描述

在该层我们去为风格的定义一个深度测量,现在我们需要做的是将图片的风格定义为l层各个通道之间激活项的相关系数。如上图他就是一个 nH×nW×nC 的激活项,他是一个三维的数据块。

style matrix

对于两个图像,也就是风格图像和生成图像,我们需要计算一个风格矩阵,更具体一点,就是用l层来测量风格我们设a(i,j,k)为隐藏层中(i,j,k)位置的激活项,i,j,k分别代表位置的高,宽,以及通道数。现在我们要做的就是去计算一个关于l层和风格图像的矩阵如图所示:

这里写图片描述

同样的我们对生成的图像也进行这个操作。我们先来定义风格图像,设这个关于l层和风格图像的G是一个矩阵,这个矩阵的宽度和高度都是l层的通道数,在这个矩阵中, k k 被用来描述 k 通道和 k 通道之间的相关系数,具体的用符号i,j表示下界,对i,j,k位置的激活项乘以同样位置的激活项,也就是i,j, k 位置的激活项,将它们相层,然后i和j分别到l层的高度和宽度,将这不同位置的激活项加起来,如下公式所示:

G[l](s)kk=i=1n[l]Hj=1n[l]wa[l](s)ijka[l](s)ijk

上面就是输入的风格图像所构成的风格矩阵。
然后我们对生成图像做同样的操作故其风格矩阵如下:
G[l](G)kk=i=1n[l]Hj=1n[l]wa[l](G)ijka[l](G)ijk

G[l]kk 可以用来测量k通道与 k 通道中的相关系数,k和 k 在1到n_c之间取值。其实 G[l]kk=n[l]Hi=1n[l]wj=1a[l]ijka[l]ijk 是一种非标准的互协方差,因为我们并没有减去均值,而是直接将他们相乘。这就是计算风格的方法。由上述我们就可以定义l层风格损失函数了。如下所示:
J[l]style(S,G)=G[l](S)G[l](G)2F

这里其实还可以采用归一化操作,不在赘述。
如果我们对各层都使用风格代价函数的话,会让效果变得更好,此时可以定义如下代价函数。
Jstyle(S,G)=lλlJ[l]style(S,G)

4.10 一维到三维推广(1D and 3D generations of models)

对于2维的数据那就很多了,比如对图像进行卷积之类的,这里就不说了。
对于一维数据的处理,我们可以将其转化为一个序列,如下所示,是对一个电极信号的处理。

这里写图片描述

3维数据的处理,比如CT扫描,他是一种X光扫描,通过CT扫描,可以输出身体的3D模型。如图所示:

这里写图片描述

对于三维的数据我们就用三维的过滤器,对其进行卷积。

猜你喜欢

转载自blog.csdn.net/liushao123456789/article/details/78855934