特殊应用:人脸识别和神经风格转换
这周是卷积神经网络的第二个应用内容——人脸识别
4.1 什么是人脸识别?
比如进某个公司需要刷脸才能进入,机器可以识别出你是否是该公司的一员,且具体是哪一个人。
人脸验证和人脸识别是不一样的,验证是1对1,指定验证是否为某一个人,而识别是1对多,需要识别出具体是一群人里的哪一个人,后者难度更大。
4.2 One-Shot学习
一次学习就是指数据库中每个人的图片只有一张,每个人都仅通过一个样本来完成训练,最后用softmax输出所有图片的识别结果,但一个样本实际上根本无法训练出健壮的神经网络。且如果公司又添加了新员工,全部重新训练就太过冗余。
因此引入相似函数,只需要对比两张图片相似度,相似度小于阈值则认为是一个人,若某图片与数据库中所有图片相似度均大于阈值,则此人不在数据库中。若有新员工加入,只需将图片放入数据库即可。上述方法解决一次学习问题。
4.3 Siamese网络
要实现上节所说的相似函数,需要用到Siamese网络,它是一个卷积网络,输入为图像特征,输出为全连接层的128维编码。
将第一张图片x1放入该网络,生成f(x1)的编码;再将第二张图片x2放入该网络,生成f(x2)的编码,最后用计算其差的范数,来评判相似性。
而这个卷积网络的参数需要学习得到,按照如下准则学习:
- 若两张图片是同一个人,范数应该很小
- 若两张图片不是同一个人,范数应该很大
4.4 Triplet损失
承接上节所说的编码,需要确定一个损失函数来学习人脸识别卷积网络参数。
具体来说就是需要确定很多个三元组(A,P,N),A表示原图片,P表示和原图片是同一个人的图片,N表示和原图片不是同一个人的图片。则A和P的编码差距应该远大于A和N的编码差距,衍生出一个式子如下图:
由此式子也能确定Triplet损失函数形式:
然后就是训练时三元组如何确定,主要应该是去训练那些非常难学习的样本,比如两个人长的比较像的这种情况,这样才能让网络学习的更好。(具体怎么弄这也没说)
4.5 面部验证与二分类
除了用上节所说的Triplet损失函数,人脸识别还可以用一种二分类的方式。
训练集为成对的图片,标签为1或0。
4.6 什么是神经风格转换?
神经风格转换就是将一张图片的风格与另一张图片融合,生成一张转换后的全新图片,如下:
4.7 深度卷积网络在学什么?
该节主要讲卷积网络学习的细节,对每一层隐藏单元计算结果进行了可视化,用一个9图块表示某一隐藏单元的检测结果,这个9图块最大限度激活了该单元。
每一层的单元都这样进行可视化,会发现浅层的单元其9图块检测到的比较简单,往往都是物体边缘颜色等等,随着层数增加, 检测越来越复杂,到后面能检测到整个物体。
4.8 代价函数
要实现神经风格转换,需要一个代价函数J(G),并利用梯度下降法最小化J(G),从而生成转换后的图片。
代价函数由两部分组成:内容代价函数(提供内容的图片和生成图片的相似度)和风格代价函数(提供风格的图片和生成图片的相似度)
两步:
- 随机初始化G
- 梯度下降
4.9 内容代价函数
内容代价计算步骤如下:
- 选定一个隐含层来计算内容代价,通常选取网络的中间层
- 使用预训练的网络模型
- 计算两张图片对应该层激活值之差的平方和,即为内容代价
4.10 风格损失函数
把风格定义为不同通道的激活值之间的相关度。
用一个风格矩阵来计算这种相关度,也就是某一隐含层每两个通道相同位置的激活值相乘后再累和作为一个元素,任意两个通道均作此运算(同一个通道好像也要做一次,待续…)
最后再把所有层的结果累和起来得到风格代价函数。
4.11 一维到三维推广
这个卷积思想不管是1D的数据和3D的数据实际上都是可以通用的。
3D数据同理。