深度学习——特殊应用:人脸识别和神经风格转换[13]

目录

  • 人脸验证和人脸识别
  • one-shot learning problem
  • Siamese网络
  • 深度学习可视化
  • 神经风格转移
  • 一维到三维的推广

一、人脸验证和人脸识别

verification: 输入图像,姓名/ID  输出输入的图像就是给定的人

recognition: 包含K个人的数据库,输入一张图  输出一个ID(如果输入的图像存在于数据库中)

二、one-shot learning problem

  • 什么是one-shot(一次学习

比如人脸识别,数据库中每个人只有一张图.对于一个输入,需要只根据一个example来判断输入是否在数据库中

  • 学习方案:学习相似函数d

不可行:把人脸放到一个CNN网络中,然后输出softmax结果(5个人,6个结果,一个表示都不是),但是因为数据集太小

可行的方法:学习相似函数

输入两个图,然后d函数(similarity function)输出它们之间的差异(d(img1,img2)=degree of difference between images),如果差值小于一定值,则表示相同,否则表示不同(人脸验证)

三、Siamese网络

[Taigman et. al., 2014. DeepFace closing the gap to human level performance]

  • Siamese网络结构:如何学习d函数

把两张图img1和img2输入相同结构相同参数的网络,分别得到编码后的结果(一个128维的向量)

d函数:$d(x^{(i)},x^{(j)})=||f(x^{(i)})-f(x^{(j)})||_2^2$

  • Siamese网络学习

学习网络中的参数使得

    • 若$x^{(i)}$和$x^{(j)}$是同一个人,则$d(x^{(i)},x^{(j)})=||f(x^{(i)})-f(x^{(j)})||_2^2$较小
    • 若$x^{(i)}$和$x^{(j)}$不是同一个人,则$d(x^{(i)},x^{(j)})=||f(x^{(i)})-f(x^{(j)})||_2^2$较大
  • 如何训练Siamese网络:Triplet loss

[Schroff et al., 2015, FaceNet: A unified embedding for face recognition and clustering]

定义Triplet loss,利用梯度下降来优化

    • 输入

anchor是目标(A),positive(P)和anchor一样,而negative(N)是不同的

    • 基本目标

anchor和positive的差值比anchor与negative的小

也就是:$||f(A)-f(P)||^2+alpha leq ||f(A)-f(N)||^2 \ ||f(A)-f(P)||^2+alpha - ||f(A)-f(N)||^2leq 0$

为什么要加$alpha$:$a-b leq 0$,若$a=b=0$,并不能说明问题,所以加一个超参数

    • 损失函数

$L(A,P,N)=max(||f(A)-f(P)||^2+alpha - ||f(A)-f(N)||^2, 0)\J=sum_{i=1}^mL(A^{(i)},P^{(i)},N^{(i)})$

训练集:对于1k个人的10k张照片,从10k里面产生的三元对(A,P,N),并计算loss

    • 如何选择A,N,P对

不要随机选,因为可能很容易满足条件。应该选择不容易训练的三元组,也就是$d(A,P)approx d(A,N)$

  • 面部验证与二分类

把验证问题转换成二分类问题,相同为1,不同为0

将Siamese网络对输入图像的编码结果作为逻辑回归的输入,输出为$widehat{y}=sigma (sum_{k=1}^128w_{i}|f(x^{(i)}_k)-f(x^{(j)})_k|+b$

四、深度学习可视化

 方式:遍历layer i层的隐藏单元,找出最大地激活每个隐藏单元激活函数的输入图片块

每一层找出了3x3个隐藏单元,对应每个隐藏单元罗列了9个最大激活函数的图片块

越靠后的层能看到的图片内容越多,所识别的特征也越复杂

 [Zeiler and Fergus., 2013, Visualizing and understanding convolutional networks]

 五、神经风格转移

 [Gatys et al., 2015, A neural algorithm of artistic style]

把两张图进行融合,一张提供内容,另一个提供风格

 

  [Images generated by Justin Johnson]

  • 代价函数

包含两个部分,一个用于评估生成的图片与内容图片的差异,一个评估生成图片与风格图片的差异

$J(G)=alpha J_{content}(C,G)+eta J_{style}(S,G)$

一般步骤:随机生成一张图,然后用梯度下降法来最小化代价$J(G)$

  • 内容代价函数
    • 找一个预训练好的ConvNet(如VGG)
    • 用隐藏层$l$来计算内容代价
    • $a^{[l](C)}$和$a^{[l](G)}$分别表示图像在$l$层的激活值
    • 代价为两个图像激活值的范数$J_{content}(C,G)=frac{1}{2}||a^{[l](C)}-a^{[l](G)}||^2$
  • 风格代价函数

什么是风格:不同通道激活值间的关联程度

怎么评估通道的关联度:各个通道激活值的相关系数。不同的通道会识别出不同的特征结果,相关系数表示当一个位置出现某特征时同时出现另一特征的可能性。比如出现条纹的时候也是橙色

代价函数计算

    • (i,j,k)位置的激活值,对应(H,W,c)。$a^{[l]}_{i,j,k}=activation at(i,j,k)$
    • 风格矩阵$G^{[l]}$是任意两通道间的相关系数,是$n_{c}^{[l]}xn_{c}^{[l]}$的矩阵。这里采用的是非标准形式,没有减去均值。$k$和$k'$表示第几通道
      • 风格图的风格矩阵$G_{kk'}^{[l](S)}=sum_{i=1}^{n_H^{[l]}}sum_{k=1}^{n_W^{[l]}}a_{ijk}^{[l](S)}a_{ijk'}^{[l](S)}$
      • 生成图的风格矩阵$G_{kk'}^{[l](G)}=sum_{i=1}^{n_H^{[l]}}sum_{k=1}^{n_W^{[l]}}a_{ijk}^{[l](G)}a_{ijk'}^{[l](G)}$
    • 用$l$层的激活值来计算风格代价$J_{style}^{[l]}=frac{1}{(2n_H^{[l]}n_W^{[l]}n_c^{[l]})^2}||G^{[l](S)}-G^{[l](G)}||_F^2=frac{1}{(2n_H^{[l]}n_W^{[l]}n_c^{[l]})^2}sum_ksum_k'(G^{[l](S)}_{kk'}-G^{[l](G)}_{kk'})^2$
    • 考虑所有层的结果,并设置权重超参数$lambda$$J_{style}(S,G)=sum_llambda^{[l]}J_{style}^{[l]}(S,G)$

六、一维到三维的推广

一维应用:电子信号

14x1($n_c$)

*

5x1

=10x16(个filter)

三维应用:CT检查,切片数据是三维的。相当于是1通道

14x14x14x1($n_c$)

*

5x5x5x1

=10x10x10x10x16(个filter)

原文地址:https://www.cnblogs.com/coolqiyu/p/8849847.html