吴恩达Deeplearning.ai 知识点梳理(course 4,week 4)

本周是Special Application

Face Recognition

Face问题有两种,一种是Face Verification,另一种是Face Recognition。
问题定义如下

Verification

  • 输入是Image+name/ID
  • 输出是这个Image和name/ID是否匹配

Recoginition

  • 有K个人的数据库
  • 输入一个Image
  • 输出一个ID,这个ID是和这个Image匹配的,但是也可能未找到。

Recognition比Verification难很多,因为对于Verification来说,99%比方说,就是一个很好的正确率了。但是对于Recognition来说,K=100,99%的正确率就急剧下降,事实上,商用的正确率需要99.99…%很多个9才行。

One Shot Learning

One-Shot Learning是Face Verification的重点和难点。有以下几个原因:

  • 因为对于一般的神经网络来说,都是一个图片,塞进一个CNN,然后给一个softmax,比方说一共有5个员工,那么输出5维向量。
  • 当来了一个组织人员之后,拍照,然后给出来结果。但是问题在于神经网络没法在数据很少的情况下work well。
  • 而新组织人员来了,不可能提供一大堆的照片共训练。而且组织内人员也是有变动的,不可能每次都重新训练,所以一般性的CNN是不行的。

所以解决OneShot Learning的问题的方法是,学习一个similarity funciton,这个similarity function,可以告知两个照片是否相似,这样就可以解决OneShot Learning问题了。也就是:

d(img1,img2)

反映Degree of difference between images
d(img1,img2)τ 说明是同一个人, d(img1,img2)>τ 说明不是同一个人。

如何训练?使用Siamese network

一般的神经网络输出都有一个softmax之类的,在这里,我们直接把softmax去掉,然后用最后的FC层进行判断和计算。

假如对于 x(1) 图片而言,FC层输出的向量是 f(x(1)) ,对于于 x(2) 图片而言,FC层输出的向量是 f(x(2)) ,那么:

d(x(1),x(2))=f(x(1))f(x(2))2

那么最后的learning goal就是,如果是same person,那么d就小,如果是different person,d就大。

Triplet Loss

那么如何定义损失函数呢?使用的是triplet loss。

首先有一个Anchor图片,是某一个人的照片记为A;
然后在用一个Positive样本,也是这个人的照片,但是是另一张,记为P;
然后有一个negative样本,是别人的一张,记为N。

然后我们希望

d(A,P)d(A,N)0

但是这样网络可能学习到的是 d()c ,c是一个constant。
所以我们留有一定余量:
d(A,P)d(A,N)α, α>0

这样我们就有一定余量了。
所以最后的loss function就是:
L(A,P,N)=max(d(A,P)d(A,N)+α, 0)

这是因为如果max第一项如果是小于等于0,那么目的就达到了,如果大于0,就进行优化。

所以就训练而言,例如有10k个照片,里边有1k个人,平均每个人有10个照片。如果每个人只有一个照片,那这个就没法训练了。因为必须有AP组合。
而对于AN组合,如果是随机挑选负样本的话,那么神经网络很快就能达到目标,这样啥也没学到,所以还是得挑选一些相似的照片才行,称为Choose hard triplet。
商用系统一般都得用1 million数据库进行训练,有些是10 million,更有甚者是100 million,所以可以考虑开源的faceNet和DeepFace。

把face Verification做成一个Binary Classification

另外一些Loss function类型就是把需要对比的两个照片怼到sigmoid里边,这样就变成2分类问题。
或者还有一些其他形式,例如

(f(x(1))f(x(2)))2f(x(1))+f(x(2)

这个称为 χ2 form或者 χ squred similarity。

计算上的考虑

最后就是说因为最后比的都是那个FC输出的向量嘛,所以可以都预先计算好,不用每次都计算了。

Neural Style Transfer

什么是Neural Style Transfer?

Neural Style Transfer就是学习大师级艺术画作的风格,然后将一张普通的照片转化成大师级艺术的风格。
这里写图片描述

CNN每一层究竟学习什么?

[Zeiler and Fergus, 2013, Visualizing and understanding convolutional networks]
将Image丢进CNN,然后找到一些Image的部分小区域(Patches),然后找到使每一层的activation最大的patch,然后将其画出来,就可以了解这一层中的这个neuron是在看/检测什么。

可以看到layer1基本上是基本的边缘,或者是颜色区块,第二层就是一些基本的形状,例如圆形,或者是竖线pattern,或者是颜色区块,从第三层开始,就会检测一些更高层级的东西了,例如人、或者是轮子,或者是狗等等。但是仔细看,就会发现第四层会比第三层检测的更加复杂。第三层偏向于复杂一些的pattern,第4层则开始检测例如狗这样的复杂问题。然而第4层狗都长得差不多,而第五层的狗则是各种各样的。

Cost function

Neural sytle transfer的Cost Function是

J(G)=αJ(C,G)+βJ(S,G)

J(C,G) 是G和C之间的差距, J(S,G) 是S与C之间的差距。
那么具体的方法就是:
Step1 随机初始化G
Step2 使用梯度下降得到G
G:=GGJ(G)

Content Cost Function

如何定义两个图像有相同的Content?
假定 l 层的activation是 a[l](G) a[l](C) ,相同的内容,也就意味着activation相同,其实对于第一层就好理解,如果像素都一样,肯定是两个相同的图片嘛。那么由神经网络提取出特征(内容)之后,activation就是内容的一种表达。
所以:

J(C,G)=12n[l]Hn[l]Wn[l]Ca[l](G)a[l](C)

Style Cost Function

Style Cost Function则是每一层activation中channel与channel之间的Gram Matrix,也就是协方差矩阵。

G[l]kk=i=1n[l]Hj=1n[l]Wa[l]ijka[l]ijk

J(C,G)=14n[l]Hn[l]Wn[l]CkkG[l](S)G[l](G)

这两个地方需要用下面两张图来说明。
首先activation表达的是图像的特征,包括纹理、颜色、或者更高层级的特征,例如人像、内容等在空间上的分布(这个很好理解,就是右下角有个狼呗,然后狼检测器就在右下角activation比较大)
那么下面这个图中,表达的是内容一样,但是风格不一样,所以位置-特征这个关系保持不变

而对于下边这个图,表示的是内容不一样,但是风格一样。关键是如何理解“风格”,其实风格从这几个图片来讲,就是横的纹理是红色的,竖的或者斜的纹理是蓝色的……
所以其实就是,如果一个地方有横的纹理,那么颜色来讲一定是红色的,如果一个地方是竖的纹理,那么一定是蓝色的。所以横纹理的activation值比较大的地方,一定红色activation也比较大。这叫做位置相关性,所以Gram Matrix可以很好地反映这一点。

结尾

所以最后就用这个Cost function做就可以了。

猜你喜欢

转载自blog.csdn.net/asasasaababab/article/details/79024485