Keras 中暹罗网络示例的准确性和错误率

Ath*_*tif 1 machine-learning deep-learning keras siamese-network

我一直在这里关注这个例子,我想知道这个精度函数到底是如何工作的:

def compute_accuracy(y_true, y_pred):
'''Compute classification accuracy with a fixed threshold on distances.
'''
    pred = y_pred.ravel() < 0.5
    return np.mean(pred == y_true)
Run Code Online (Sandbox Code Playgroud)

据我所知,在这种情况下网络的输出将是两对之间的距离。那么在这种情况下我们如何计算准确率呢?“0.5”阈值指的是什么?另外,如何计算错误率?

tod*_*day 5

看来对该示例的理解存在一些差距,需要首先填补:

如果您研究数据准备步骤(即create_pairs方法),您会发现正对(即属于同一类的样本对)被分配标签 1(即正/真),负对(即属于同一类的样本对)被分配标签 1(即正/真)和负对(即属于同一类的样本对)。属于不同类别的样本)被分配标签 0(即负/假)。

此外,示例中的 Siamese 网络被设计为给定一对样本作为输入,它将预测它们的距离作为输出。通过使用对比损失作为模型的损失函数,训练模型,使得给定一个正对作为输入,预测一个小的距离值(因为它们属于同一类,因此它们的距离应该很低,即传达相似性),并且给定负对作为输入,预测大距离值(因为它们属于不同类别,因此它们的距离应该很高,即传达相异性)。作为练习,尝试使用代码中的对比损失定义以数字方式考虑这些点(即何时y_true为 1,何时为 0)来确认这些点。y_true

因此,示例中的准确度函数是这样实现的,即对预测距离值应用固定的任意y_pred阈值(即 0.5),即(这意味着该示例的作者已确定小于 0.5 的距离值表示正对;您可能决定使用另一个阈值,但这应该是基于实验/经验的合理选择)。然后将结果与真实标签值进行比较,即y_true

  • y_pred低于 0.5(y_pred < 0.5等于True)时:如果y_true为 1(即正),则这意味着网络的预测与真实标签一致(即True == 1等于True),因此该样本的预测被计为正确预测(即准确性)。然而,如果y_true为 0(即负数),则该样本的预测不正确(即True == 0等于False),因此这不会有助于正确的预测。

  • y_pred等于或大于 0.5(y_pred < 0.5将等于False)时:适用与上述相同的推理(留作练习!)。

注意:不要忘记模型是在批量样本上进行训练的。因此,y_predy_true不是单个值;相反,它们是值数组,并且上面提到的所有计算/比较都是按元素应用的)。

让我们看一下 5 个样本对的输入批次的(想象的)数值示例,以及如何计算该批次的模型预测的准确性:

>>> y_pred = np.array([1.5, 0.7, 0.1, 0.3, 3.2])
>>> y_true = np.array([1, 0, 0, 1, 0])

>>> pred = y_pred < 0.5
>>> pred
array([False, False,  True,  True, False])

>>> result = pred == y_true
>>> result
array([False,  True, False,  True,  True])

>>> accuracy = np.mean(result)
>>> accuracy
0.6
Run Code Online (Sandbox Code Playgroud)