深度学习——特殊应用:人脸识别和神经风格转换[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)||^2\leq 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)+\beta 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_k\sum_k'(G^{[l](S)}_{kk'}-G^{[l](G)}_{kk'})^2$
- 考虑所有层的结果,并设置权重超参数$\lambda$$J_{style}(S,G)=\sum_l\lambda^{[l]}J_{style}^{[l]}(S,G)$
六、一维到三维的推广
一维应用:电子信号
14x1($n_c$) * 5x1 =10x16(个filter) |
三维应用:CT检查,切片数据是三维的。相当于是1通道
14x14x14x1($n_c$) * 5x5x5x1 =10x10x10x10x16(个filter) |