人脸识别:验证一张人脸是否在库中,同时还有判断是否为真人。
1.One-Shot 学习
Similarity 函数 d(img1, img2):图片两两对比差异
如果有新的人加入不需要重新训练,只需将照片放入库中即可。
2.Siamese网络
目的:把人脸图像放入网络中得到编码,并做比较。
这里有一个技巧:可以将库中的图像x(2)的编码f(x(2))保存下来,预测的时候只计算f(x(1))即可。
3.三元损失函数 Triplet loss
目的:通过学习神经网络的参数,得到优质的人脸图像编码。
我么想要左边的编码相似,因为这是同一个人,我们希望右边的编码差异大,因为他是不同的人。
三元组损失就是,我们希望anchor图片和positive图片更近,anchor图片和negative图片更远。我们可以用以下公式表示:
其中?是超参数,它不小于0.2,这个?是为了确保网络对于所有的编码不会总是输出0而设置的,也为了确保它不会把所有的编码都设成互相相等的。
三元素损失函数的定义基于三张图片,分别是A,P,N,其中A,P是同一个人,A,N是不同的人。损失函数如下:
通过最小化上述的代价函数,达到的效果就是L(A,P,N)=0,整个网络的代价函数应该是训练集中这些单个元组的损失的总和。如下:
注意: 应该尽量选择难训练的(A,P,N)对,即,这样才能竭力使d(A,P)变大,使d(A,N)变小。
4.面部验证与二分类(Face verification and binary classification)
可以将人脸验证当作一个监督学习,创建一个只有成对图片的训练集,不是三个一组而是成对的照片,目标标签是1表示一对照片是同一个人,目标标签是0表示图片中是不同的人。如下图所示:
5.神经风格转换
神经风格转换:就是利用一张内容图片和一张风格图片,生成一张新的图片。 如图所示:
深度卷积神经网络究竟在学什么?
依次对各个层进行如下操作:
- 在当前层挑选一个隐藏单元;
- 遍历训练集,找到最大化地激活了该运算单元的图片或者图片块;
- 对该层的其他运算单元执行操作。
1. 浅层的图片看到的图片块越小,只能识别一些纹理和边缘阴影等
2. 越深层的图片可以看到的图片块越大,可以识别到一些复杂的事物
代价函数
风格迁移的目标是由内容图片C和风格图片S,生成最终的风格迁移图片G。
定义代价函数
J(G)=αJcontent(C,G)+βJstyle(S,G)
- J_content(C, G): 代表生成图片G的内容和内容图片C的内容的相似度
- J_style(S, G): 代表生成图片G的内容和风格图片S的内容的相似度
- alpha, beta: 两个超参数用来表示以上两者之间的权重
执行步骤:
- 随机初始化生成图片G,如大小为(100, 100, 3);
- 使用梯度下降算法最小化上面定义的代价函数 J(G)。
其中,内容代价函数
(l选择中层,因为浅层太纹理,深层太具体)
风格损失函数
- 对比图片l层神经网络上各个通道之间的相关性
- 首先计算风格矩阵(Style/Gram Matrix)K通道激活函数与K’通道激活函数的乘积在宽(i)x高(j)的加和
- S与G的相关性为两个风格矩阵的差的平方和在所有不同通道上的加和
对于两个图像,也就是风格图像和生成图像,我们需要计算一个风格矩阵,更具体一点,就是用l层来测量风格我们设a(i,j,k)为隐藏层中(i,j,k)位置的激活项,i,j,k分别代表位置的高,宽,以及通道数。现在我们要做的就是去计算一个关于l层和风格图像的矩阵如图所示:
同样的我们对生成的图像也进行这个操作。我们先来定义风格图像,设这个关于l层和风格图像的G是一个矩阵,这个矩阵的宽度和高度都是l层的通道数,在这个矩阵中,k和k′被用来描述k通道和k′通道之间的相关系数,具体的用符号i,j表示下界,对i,j,k位置的激活项乘以同样位置的激活项,也就是i,j,k′位置的激活项,将它们相层,然后i和j分别到l层的高度和宽度,将这不同位置的激活项加起来,如下公式所示:
即Jstyle(S,G)
6.一维到三维推广(1D and 3D generations of models)
2D to 1D
- 如心电图扫描,可以将电极信号转化为一个序列
- 1D数据只有宽没有高,卷积核再一维的宽上进行扫描
- 通常一维数据我们使用循环神经网络处理,用卷积神经网络的情况较少
2D to 3D
- 如CT扫描(一种X光扫描,通过CT扫描,可以输出身体的3D模型),电影等
- 3D数据不只有宽和高,还有深(),卷积核在3D立体上进行扫描
- 注意3D图片深度与通道的区分,通道是图像像素的深度,不是这里的立体图像块的深度