吴恩达深度学习笔记之卷积神经网络(特殊应用)
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 网络。
具体如下:
我们将图片
Parameters on NN define an encoding
learn parameters so that :
if
x(i) andx(j) are the same person,∥∥f(x(i))−f(x(j))∥∥22 is small
ifx(i) andx(j) are the different person,∥∥f(x(i))−f(x(j))∥∥22 is large
4.4 Triplet loss
要想通过学习神经网络的参数,来得到优质的人脸图片编码,方法之一就是定义三元组损失函数,然后应用梯度下降。为了应用三元组损失函数,我们需要比较成对的图片,如下:
我么想要左边的编码相似,因为这是同一个人,我们希望右边的编码差异大,因为他是不同的人。
三元组损失就是,我们希望anchor图片和positive图片更近,anchor图片和negative图片更远。我们可以用以下公式表示:
其中
三元素损失函数的定义基于三张图片,分别是A,P,N,其中A,P是同一个人,A,N是不同的人。损失函数如下:
通过最小化上述的代价函数,达到的效果就是
注意:
为了定义三元组的数据集,我们需要成对的A和P,如果说训练1000个人,我们可能需要10000张照片,组成整个数据集,如果一个人只有一张照片那么根本无法训练系统。当然,训练完这个系统之后,就可以应用到一次学习问题上了。对于人脸识别系统,可能只有想要的某个人的一张照片,但是对于训练集,我们要确保有同一个人的多张照片。
其次还有一个问题,就是该如何选择训练集,在这个问题上,我们应该尽量选择难训练的三元组A,P,N。所谓难,就是我们的A,P和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的方法。最后输出
在这里提一个技巧,可以帮我们显著提高部署效果。还是采用上面那幅图片为例。
假设第一张人脸为新图片,下面是数据库中的图片,我们不需要每次都计算下面那张图片的特征,我们可以提前计算好,当一个新员工进来时,对新员工进行编码,然后和预先计算好的编码进行比较,然后再输出预测值
总结一下:
可以将人脸验证当作一个监督学习,创建一个只有成对图片的训练集,不是三个一组而是成对的照片,目标标签是1表示一对照片是同一个人,目标标签是0表示图片中是不同的人。如下图所示:
4.6 什么是神经风格转换(what is neural style transfer ?)
简而言之,就是利用一张内容图片和一张风格图片,生成一张新的图片,这张图片有一种艺术风格,如图所示:
4.7 代价函数(cost function)
要构建一个神经风格迁移系统,我们需要定义一个代价函数,通过最小化代价函数,生成我们想要的任何图像。我们的问题是,给订一个内容图像C,和一个风格图像S,生成一下新图象G。其中代价函数分为两部分,一部分是内容代价,一部分是风格代价。内容代价是用来衡量生成图片的内容和内容图片C的相似度,风格代价用来衡量图片G的风格和和图片S的风格的相似度,最后利用两个超参数来确定内容代价和风格代价之间的权重。代价函数如下:
4.8 内容代价函数(content cost function)
假如我们我们用隐藏层来计算内容代价函数,如果l是很小的数,这个代价函数就会使我们的生成图片像素上非常接近内容图片,然而如果用很深的层,那么如果内容图片有一只狗,他就会确保生成图片有一只狗,所以在实际中,这个层l在网络中既不会选的太浅,也不会选的太深,通常l会选在中间层,然后用一个与训练的卷积模型如VGG,其他的也可以。内容代价函数如下:
4.9 风格损失函数(style cost function)
图片的风格到底是什么?这么说吧,比如我们有下面一张图片。
它能算出这里是否含有不同的隐藏层,现在我们随机选择某一层l如下图所示:
在该层我们去为风格的定义一个深度测量,现在我们需要做的是将图片的风格定义为l层各个通道之间**项的相关系数。如上图他就是一个
style matrix
对于两个图像,也就是风格图像和生成图像,我们需要计算一个风格矩阵,更具体一点,就是用l层来测量风格我们设a(i,j,k)为隐藏层中(i,j,k)位置的**项,i,j,k分别代表位置的高,宽,以及通道数。现在我们要做的就是去计算一个关于l层和风格图像的矩阵如图所示:
同样的我们对生成的图像也进行这个操作。我们先来定义风格图像,设这个关于l层和风格图像的G是一个矩阵,这个矩阵的宽度和高度都是l层的通道数,在这个矩阵中,
上面就是输入的风格图像所构成的风格矩阵。
然后我们对生成图像做同样的操作故其风格矩阵如下:
这里其实还可以采用归一化操作,不在赘述。
如果我们对各层都使用风格代价函数的话,会让效果变得更好,此时可以定义如下代价函数。
4.10 一维到三维推广(1D and 3D generations of models)
对于2维的数据那就很多了,比如对图像进行卷积之类的,这里就不说了。
对于一维数据的处理,我们可以将其转化为一个序列,如下所示,是对一个电极信号的处理。
3维数据的处理,比如CT扫描,他是一种X光扫描,通过CT扫描,可以输出身体的3D模型。如图所示:
对于三维的数据我们就用三维的过滤器,对其进行卷积。