对这个例子的理解似乎存在一些空白,需要首先填补:
如果您研究数据准备步骤(即create_pairs
方法),您会意识到正对(即属于同一类的样本对)被分配一个标签 1(即正/真)和负对(即对属于不同类别的样本)被分配一个标签 0(即否定/错误)。
此外,示例中的连体网络的设计使得给定一对样本作为输入,它将预测它们的距离作为输出。通过使用对比损失作为模型的损失函数,对模型进行训练,使得给定一个正对作为输入,预测一个小的距离值(因为它们属于同一类,因此它们的距离应该很小,即传达相似性)并且给定一个负对作为输入,预测一个大的距离值(因为它们属于不同的类,因此它们的距离应该很高,即传达不相似性)。作为练习,尝试通过在代码中使用对比损失定义以数字方式考虑它们(即何时y_true
为 1,何时为 0)来确认这些点。y_true
因此,示例中的准确率函数是这样实现的,即对预测的距离值应用一个固定的任意阈值,即 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_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
>>> 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