Keras中实例Siamese网络的准确率和错误率

Accuracy and error rate of example Siamese network in Keras

我一直在关注这个例子here,我想知道这个准确度函数是如何工作的:

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 方法),您会发现正对(即属于同一 class 的样本对)分配的标签为 1 (即 positive/true)和负对(即属于不同 classes 的样本对)被分配标签 0(即 negative/false)。

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

因此,示例中的精度函数是这样实现的,即固定的 任意 阈值,即 0.5,应用于预测距离值,即 y_pred(这意味着这个例子的作者已经决定小于 0.5 的距离值表示正对;你可能决定使用另一个阈值,但它应该是一个基于 experiment/experience 的合理选择)。然后将结果与真实标签值进行比较,即 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不是单个值; 相反,它们是值数组,上面提到的所有 calculations/comparisons 都是按元素应用的)。

让我们看一个包含 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