深度学习(四)卷积神经网络-人脸识别和神经风格转换(4) -Andrew Ng

一、基础知识

1.1 什么是人脸识别?

首先简单介绍一下人脸验证(face verification)和人脸识别(face recognition)的区别。

人脸验证:输入一张人脸图片,验证输出与模板是否为同一人,即一对一问题。

人脸识别:输入一张人脸图片,验证输出是否为K个模板中的某一个,即一对多问题。

一般地,人脸识别比人脸验证更难一些。因为假设人脸验证系统的错误率是1%,那么在人脸识别中,输出分别与K个模板都进行比较,则相应的错误率就会增加,约K%。模板个数越多,错误率越大一些。

如果我们有一个 100 人的数据库,正确率可 能需要远大于 99%,才能得到很好的效果。

人脸验证之所以难,原因之一 在于要解决“一次学”(one-shot learning problem)问题。

1.2 One-Shot 学习

One-shot learning就是说数据库中每个人的训练样本只包含一张照片,然后训练一个CNN模型来进行人脸识别。若数据库有K个人,则CNN模型输出softmax层就是K维的。

但是One-shot learning的性能并不好,其包含了两个缺点:

  • 每个人只有一张图片,训练样本少,构建的CNN网络不够健壮。
  • 若数据库增加另一个人,输出层softmax的维度就要发生变化,相当于要重新构建CNN网络,使模型计算量大大增加,不够灵活。

为了解决One-shot learning的问题,我们先来介绍相似函数(similarity function)。相似函数表示两张图片的相似程度,用d(img1,img2)来表示。若d(img1,img2)较小,则表示两张图片相似;若d(img1,img2)较大,则表示两张图片不是同一个人。相似函数可以在人脸验证中使用:

  • d(img1,img2)≤τ: 一样
  • d(img1,img2)>τ: 不一样

对于人脸识别问题,则只需计算测试图片与数据库中K个目标的相似函数,取其中d(img1,img2)最小的目标为匹配对象。若所有的d(img1,img2)都很大,则表示数据库没有这个人。

                             
1.3 Siamese 网络

前面你学到的函数 d 的作用就是输入两张人脸,然后告诉你它们的相似度。实现这个功能的一个方式就是用 Siamese 网络,我们看一下:

若一张图片经过一般的CNN网络(包括CONV层、POOL层、FC层),最终得到全连接层FC,该FC层可以看成是原始图片的编码encoding,表征了原始图片的关键特征。这个网络结构我们称之为Siamese network。也就是说每张图片经过Siamese network后,由FC层每个神经元来表征。

                                           

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

建立Siamese network后,两张图片x(1) 和 x(2)的相似度函数可由各自FC层 f(x(1)) 与 f(x(2)) 之差的范数来表示:

                                                                    

值得一提的是,不同图片的CNN网络所有结构和参数都是一样的。我们的目标就是利用梯度下降算法,不断调整网络参数,使得属于同一人的图片之间d(x(1),x(2)) 很小,而不同人的图片之间d(x(1),x(2)) 很大。  

具体网络构建和训练参数方法我们下一节再详细介绍。

1.4 Triplet 损失

构建人脸识别的CNN模型,需要定义合适的损失函数(三元组损失函数),这里我们将引入Triplet Loss。

                               

用三元组损失的术语来说,你要做的通常是看一个 anchor 图片,你想让 anchor 图片 和 positive 图片(positive 意味着是同一个人)的距离很接近。然而,当 anchor 图片与 negative 图片(negative 意味着是非同一个人)对比时,你会想让他们的距离离得更远一点。

这就是为什么叫做三元组损失,它代表你通常会同时看三张图片,你需要看 anchor 图 片、postive 图片,还有 negative 图片,我要把 anchor 图片、positive 图片和 negative 图片 简写成𝐴、𝑃、𝑁。

我们希望上一小节构建的CNN网络输出编码f(A) 接近f(D) ,即尽可能小,而尽可能大,数学上满足

                                                                    

根据上面的不等式,如果所有的图片都是零向量,即f(A)=0,f(P)=0,f(N)=0 那么上述不等式也满足。但是这对我们进行人脸识别没有任何作用,是不希望看到的。我们希望得到 。所以,我们添加一个超参数α,且α>0 ,对上述不等式做出如下修改:

                                                                   

顺便提一下,这里的α 也被称为边界margin,类似与支持向量机中的margin。举个例子,若d(A,P)=0.5 5,α=0.2 ,则d(A,N)≥0.7。

接下来,我们根据A,P,N三张图片,就可以定义Loss function为:

                                                      

相应地,对于m组训练样本,cost function为:

                                                                                     

关于训练样本,必须保证同一人包含多张照片,否则无法使用这种方法。例如10k张照片包含1k个不同的人脸,则平均一个人包含10张照片。这个训练样本是满足要求的。

然后,就可以使用梯度下降算法,不断训练优化CNN网络参数,让J不断减小接近0。

同一组训练样本,A,P,N的选择尽可能不要使用随机选取方法。因为随机选择的A与P一般比较接近,A与N相差也较大,毕竟是两个不同人脸。这样的话,也许模型不需要经过复杂训练就能实现这种明显识别,但是抓不住关键区别。所以,最好的做法是人为选择A与P相差较大(例如换发型,留胡须等),A与N相差较小(例如发型一致,肤色一致等)。这种人为地增加难度和混淆度会让模型本身去寻找学习不同人脸之间关键的差异,“尽力”让d(A,P) 更小,让d(A,N) 更大,即让模型性能更好。

下面给出一些A,P,N的例子:

                                                           

值得一提的是,现在许多商业公司构建的大型人脸识别模型都需要百万级别甚至上亿的训练样本。如此之大的训练样本我们一般很难获取。但是一些公司将他们训练的人脸识别模型发布在了网上,可供我们使用。

1.5 面部验证与二分类

除了构造triplet loss来解决人脸识别问题之外,还可以使用二分类结构。做法是将两个siamese网络组合在一起,将各自的编码层输出经过一个逻辑输出单元,该神经元使用sigmoid函数,输出1则表示识别为同一人,输出0则表示识别为不同人。结构如下:

                                

每组训练样本包含两张图片,每个siamese网络结构和参数完全相同。这样就把人脸识别问题转化成了一个二分类问题。引入逻辑输出层参数w和b,输出ŷ 表达式为:

                                                                      

其中参数 wk 和 b 都是通过梯度下降算法迭代训练得到。

 y^的另外一种表达式为:

                                                                         

上式被称为χ方公式,也叫χ方相似度。

在训练好网络之后,进行人脸识别的常规方法是测试图片与模板分别进行网络计算,编码层输出比较,计算逻辑输出单元。为了减少计算量,可以使用预计算的方式在训练时就将数据库每个模板的编码层输出f(x) 保存下来。因为编码层输出f(x)比原始图片数据量少很多,所以无须保存模板图片,只要保存每个模板的f(x)即可,节约存储空间。而且,测试过程中,无须计算模板的siamese网络,只要计算测试图片的siamese网络,得到的f(x(i)) 直接与存储的模板f(x(j)) 进行下一步的逻辑输出单元计算即可,计算时间减小了接近一半。这种方法也可以应用在上一节的triplet loss网络中。

1.6 什么是神经风格转换?

神经风格迁移是CNN模型一个非常有趣的应用。它可以实现将一张图片的风格“迁移”到另外一张图片中,生成具有其特色的图片。比如我们可以将毕加索的绘画风格迁移到我们自己做的图中,生成类似的“大师作品”,很酷不是吗?

下面列出几个神经风格迁移的例子:

                               

一般用C表示内容图片,S表示风格图片,G表示生成的图片。

下面你将学到如何自己生成这样的图片。为了实现神经风格迁移,你需要知道卷积网络提取的特征,在不同的神经网络,深层的、 浅层的。在深入了解如何实现神经风格迁移之前,我将在下面直观地介绍卷积神经网络不同层之间的具体运算。

1.7 什么是深度卷积网络?

在进行神经风格迁移之前,我们先来从可视化的角度看一下卷积神经网络每一层到底是什么样子?它们各自学习了哪些东西。

典型的CNN网络如下所示:

                            

 首先来看第一层隐藏层,遍历所有训练样本,找出让该层激活函数输出最大的9块图像区域;然后再找出该层的其它单元(不同的滤波器通道)激活函数输出最大的9块图像区域;最后共找9次,得到9 x 9的图像如下所示,其中每个3 x 3区域表示一个运算单元。

            

可以看出,第一层隐藏层一般检测的是原始图像的边缘和颜色阴影等简单信息。

继续看CNN的更深隐藏层,随着层数的增加,捕捉的区域更大,特征更加复杂,从边缘到纹理再到具体物体。

                

1.8 代价函数

神经风格迁移生成图片G的cost function由两部分组成:C与G的相似程度和S与G的相似程度。

                                                            

其中,α,β 是超参数,用来调整Jcontent(C,G) 与Jstyle(S,G) 的相对比重。

                                                     

神经风格迁移的基本算法流程是:首先令G为随机像素点,然后使用梯度下降算法,不断修正G的所有像素点,使得J(G)J(G)不断减小,从而使G逐渐有C的内容和G的风格,如下图所示。

                                   

1.9 内容代价函数

我们先来看J(G)的第一部分Jcontent(C,G),它表示内容图片C与生成图片G之间的相似度。

使用的CNN网络是之前训练好的模型,例如Alex-Net。C,S,G共用相同模型和参数。首先,需要选择合适的层数 l 来计算Jcontent(C,G)。根据上一小节的内容,CNN的每个隐藏层分别提取原始图片的不同深度特征,由简单到复杂。如果l 太小,则G与C在像素上会非常接近,没有迁移效果;如果l 太深,则G上某个区域将直接会出现C中的物体。因此,l 既不能太浅也不能太深,一般选择网络中间层。

 

然后比较C和G在ll层的激活函数输出  相应的Jcontent(C,G) 的表达式为:

                                                                       

   。方法就是使用梯度下降算法,不断迭代修正G的像素值,使 Jcontent(C,G) 不断减小。

1.10 风格代价函数

什么是图片的风格?利用CNN网络模型,图片的风格可以定义成第ll层隐藏层不同通道间激活函数的乘积(相关性)。

        

例如我们选取第ll层隐藏层,其各通道使用不同颜色标注,如下图所示。因为每个通道提取图片的特征不同,比如1通道(红色)提取的是图片的垂直纹理特征,2通道(黄色)提取的是图片的橙色背景特征。那么计算这两个通道的相关性大小,相关性越大,表示原始图片及既包含了垂直纹理也包含了该橙色背景;相关性越小,表示原始图片并没有同时包含这两个特征。也就是说,计算不同通道的相关性,反映了原始图片特征间的相互关系,从某种程度上刻画了图片的“风格”。
 

                                

接下来我们就可以定义图片的风格矩阵(style matrix)为:

                                                                           

其中,[l] 表示第l 层隐藏层,k,k’分别表示不同通道,总共通道数为  。i,j分别表示该隐藏层的高度和宽度。风格矩阵 

计算第l 层隐藏层不同通道对应的所有激活函数输出和。

的维度为 ,若两个通道之间相似性高,则对应的  较大;若两个通道之间相似性低,则对应的 

较小。

 风格矩阵表征了风格图片S第 l 层隐藏层的“风格”。相应地,生成图片G也有。那么, 越相近,则表示G的风格越接近S。这样,我们就可以定义出的表达式:

                                                         

定义完之后,我们的目标就是使用梯度下降算法,不断迭代修正G的像素值,使不断减小。 

值得一提的是,以上我们只比较计算了一层隐藏层ll。为了提取的“风格”更多,也可以使用多层隐藏层,然后相加,表达式为:

                                                                    

其中,表示累加过程中各层 的权重系数,为超参数。

根据以上两小节的推导,最终的cost function为:

                                                              

使用梯度下降算法进行迭代优化。

1.11 一维到三维推广

我们之前介绍的CNN网络处理的都是2D图片,举例来介绍2D卷积的规则:

                                                                 

  • 输入图片维度:14 x 14 x 3

  • 滤波器尺寸:5 x 5 x 3,滤波器个数:16

  • 输出图片维度:10 x 10 x 16

将2D卷积推广到1D卷积,举例来介绍1D卷积的规则:

                                                                 

  • 输入时间序列维度:14 x 1

  • 滤波器尺寸:5 x 1,滤波器个数:16

  • 输出时间序列维度:10 x 16

对于3D卷积,举例来介绍其规则:

                                                                    

  • 输入3D图片维度:14 x 14 x 14 x 1

  • 滤波器尺寸:5 x 5 x 5 x 1,滤波器个数:16

  • 输出3D图片维度:10 x 10 x 10 x 16

二、测验

1. 面部验证只需要将新图片与1个人的面部进行比较,而面部识别则需要将新图片与K个人的面部进行比较。 true

2. 在人脸验证中函数d(img1,img2)起什么作用?

  1. 只需要给出一个人的图片就可以让网络认识这个人。
  2. 为了解决一次学习的问题。
  3. 这可以让我们使用softmax函数来学习预测一个人的身份,在这个单元中分类的数量等于数据库中的人的数量加1。

1,2 

3. 为了训练人脸识别系统的参数,使用包含了10万个不同的人的10万张图片的数据集进行训练是合理的。

错误。

4. 下面哪个是三元组损失的正确定义(请把 α也考虑进去)?

                                                

5. 在下图中的孪生卷积网络(Siamese network)结构图中,上下两个神经网络拥有不同的输入图像,但是其中的网络参数是完全相同的。

                               

正确。

6.你在一个拥有100种不同的分类的数据集上训练一个卷积神经网络,你想要知道是否能够找到一个对猫的图片很敏感的隐藏节点(即在能够强烈激活该节点的图像大多数都是猫的图片的节点),你更有可能在第4层找到该节点而不是在第1层更有可能找到。

正确。

7. 神经风格转换被训练为有监督的学习任务,其中的目标是输入两个图像 (x),并训练一个能够输出一个新的合成图像(y)的网络。

错误。(不是有监督)

8.在一个卷积网络的深层,每个通道对应一个不同的特征检测器,风格矩阵G[l]度量了l层中不同的特征探测器的激活(或相关)程度。

正确。

9. 在神经风格转换中,在优化算法的每次迭代中更新的是什么?

  1. 神经网络的参数
  2. 生成图像G的像素值
  3. 正则化参数
  4. 内容图像C的像素值

2。

10. 你现在用拥有的是3D的数据,现在构建一个网络层,其输入的卷积是32×32×32×16(此卷积有16个通道),对其使用32个3×3×3的过滤器(无填充,步伐为1)进行卷积操作,请问输出的卷积是多少?

30*30*30*32

三、编程

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值