我一直在关注这个示例,我想知道这个准确率函数到底是如何工作的:
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(即负/假)。
此外,示例中的Siamese网络设计成这样:给定一对样本作为输入,它将预测它们的距离作为输出。通过使用对比损失作为模型的损失函数,模型被训练成这样:当输入是正对时,预测一个小的距离值(因为它们属于同一个类,因此它们的距离应该低,即表达相似性),当输入是负对时,预测一个大的距离值(因为它们属于不同的类,因此它们的距离应该高,即表达不相似性)。作为练习,尝试通过考虑代码中对比损失的定义来确认这些点(即当y_true
为1和y_true
为0时)。
因此,示例中的准确率函数被实现为在预测的距离值,即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_pred
或y_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>>> predarray([False, False, True, True, False])>>> result = pred == y_true>>> resultarray([False, True, False, True, True])>>> accuracy = np.mean(result)>>> accuracy0.6