喀拉拉邦暹罗网络示例的准确性和错误率



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

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)

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

在理解这个例子时似乎有一些空白,需要首先填补:

如果你研究数据准备步骤(即create_pairs方法(,你会意识到阳性对(即属于同一类的样本对(被分配了一个标签1(即阳性/真(,而阴性对(即分属不同类的样本配对(被分配一个标签0(即阴性/假(。

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

因此,该示例中的精度函数被实现为使得固定的任意阈值,即0.5,被应用于预测的距离值,即y_pred(这意味着该示例的作者已经决定,小于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

最新更新