人脸识别往往每个人只有一张照片,因此不应该用卷积神经网络配合softmax训练。
应该选择学习 Similarity 函数。详细地说,你想要神经网络学习这样一个用表示的函数,(1,2) = ,它以两张图片作为输入,然后输出这两张图片的差异值。所以在识别过程中,如果这两张图片的差异值小于某个阈值(它是一个超参数),那么这时就能预测这两张图片是同一个人,如果差异值大于,就能预测这是不同的两个人。
Siamese网络:如果你要比较两个图片的话,例如这里的第一张(编 号 1)和第二张图片(编号 2),你要做的就是把第二张图片喂给有同样参数的同样的神经网络,然后得到一个不同的 128 维的向量(编号 3),这个向量代表或者编码第二个图片, 我要把第二张图片的编码叫做( (2) )。这里我用 (1)和 (2)仅仅代表两个输入图片,他们没 必要非是第一个和第二个训练样本,可以是任意两个图片。
用三元组损失的术语来说,你要做的通常是看一个 Anchor 图片,你想让 Anchor 图片 和 Positive 图片(Positive 意味着是同一个人)的距离很接近。然而,当 Anchor 图片与 Negative 图片(Negative 意味着是非同一个人)对比时,你会想让他们的距离离得更远一点。
这就是为什么叫做三元组损失,它代表你通常会同时看三张图片,你需要看 Anchor 图 片、Postive 图片,还有 Negative 图片,我要把 Anchor 图片、Positive 图片和 Negative 图片 简写成、、。
为了不让输出一直为0,我们加入一个间隔a
那么损失函数就是: 这个函数的作用就是,只要这个||() − ()|| 2 − ||() − ()|| 2 + ≤ 0,那么 损失函数就是 0。只要你能使画绿色下划线部分小于等于 0,只要你能达到这个目标,那么 这个例子的损失就是 0。
注意,为了定义三元组的数据集你需要成对的和,即同一个人的成对的图片,为了 训练你的系统你确实需要一个数据集,里面有同一个人的多个照片。
另外,在数据集中你要做的就是尽可能选择难训练的三元组、和。难训练的三元组就是, 你的、和的选择使得(, )很接近(, ),即(, ) ≈ (, ),这样 你的学习算法 会竭尽全力使右边这个式子变大((, )),或者使左边这个式子((, ))变小,这样左 右两边至少有一个的间隔。并且选择这样的三元组还可以增加你的学习算法的计算效率, 如果随机的选择这些三元组,其中有太多会很简单,梯度算法不会有什么效果,因为网络总 是很轻松就能得到正确的结果,只有选择难的三元组梯度下降法才能发挥作用,使得这两边 离得尽可能远。
除了用Triplet loss训练参数,还可以用二分类方法。
还可以像下图所示用绿色所示的公式代替绿色大括号里的内容
当然,与之前类似,你正在训练一个 Siamese 网络,意味着上面这个神经网络拥有的参数和下面神经网络的相同(编号 3 和 4 所 示的网络),两组参数是绑定的,这样的系统效果很好。
当出现新员工来的时候,不需要每次都计算别人的图片的这些特征(编号 6),你可以提前计算好,那么 当一个新员工走近时,你可以使用上方的卷积网络来计算新员工的这些编码(编号 5),然后使用它, 和预先计算好的编码(编号 6)进行比较,然后输出预测值^。
神经风格迁移不是有监督的学习,因为它没有标签
为了描述如何实现神经网络迁移,我将使用来表示内容图像,表示风格图像,表示 生成的图像
为了实现神经风格迁移,你要做的是定义一个关于的代价函数用来评判某个生成 图像的好坏,我们将使用梯度下降法去最小化(),以便于生成这个图像。
第一部分被称作内容代价,这是一个关于内容图片和生成图片的函数,它是用来度量生成图片的内容与内容图片的内容有多相似
第二部分是风格代价函数,也就是关于和的函数,用来度量生成图片的风格和图片的风格的相似度。
α和β是超参数代表权重。
具体怎么计算J呢?
内容代价函数:
即俩图片的每一层的每个单元的激活值对应求差值的平方和(上图少了个求和)
风格代价函数:
将图片的风格定义为层中各个通道之间激活项的相关系数。
之后用梯度下降法,或者更复杂的优化算法来找到一个合适的图像,并计算()的最 小值,这样的话,你将能够得到非常好看的结果,即每次优化后生成图像在更新。