吴恩达深度学习4.4 triplet损失函数

2020-01-13  本文已影响0人  prophet__

我们之前学习的是神经网络的构建,但是神经网络当中参数的训练需要经过损失函数一次次进行梯度下降之后得到。

在对人脸识别的过程当中,我们往往会使用到三元损失函数triplet(也就是有三个输入变量)。

我们在制作数据集的时候,需要设定3组图片,原本的图片是A(Anchor),跟它是同一个人的图片是P(positive),跟它不同的人的图片是N(Negetive)。


我们上一节课有提到如何计算图片与图片之间的区别,那么这个神经网络的损失函数,就是基于图片与图片之间的区别生成的。

(||f(A)-f(P)||)^2 + alpha <= (||f(A)-f(P)||)^2

在这里有一个超参数alpha,如果我们假设alpha=0,那么这两个图片的区别即使变得很小,这个等式也会很容易成立的。

因此为了提高神经网络对不同人图片的辨识度,我们需要把这个alpha设置成一个阈值,提高它对不同人的差异化识别。

接下来讲到的是它的损失函数,首先我们定义一个新函数,在我们上一张ppt所写的算式和0之间做一个取最大值。

当这个算式的值大于0,说明这个分类是不成功的,那么损失函数就会变大。

说到这里,我之前有一个误区:在制作训练集的时候,是需要同一个人不同的很多张图片的,这样才能对两张同一个人的图片和不同的人的图片的损失函数进行训练。

但是在使用的过程当中,我们可以只获得检测者的一张图片就可以了。

接下来提到的概念是,我们在对训练集进行准备的时候,要特意挑选一些很容易混淆的图片成为一组一组。因为如果你给这个网络一些差异很大的图片,它就很容易满足要求,没有办法得到很好的训练效果。

其实在现代社会里,我们的人脸数据集的数据库是非常庞大的,普通人想获取这些数据很不容易,同时运算所需要的算力也很昂贵。因此,网上一些大公司有提供一些他们已经训练好的参数,供我们使用。我们可以在他们训练好的网络上继续训练。

这里储存几个网址:
https://github.com/ageitgey/face_recognition_models
https://github.com/davidsandberg/facenet

上一篇下一篇

猜你喜欢

热点阅读