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

我一直在关注这个示例,我想知道这个准确率函数到底是如何工作的:

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_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>>> predarray([False, False,  True,  True, False])>>> result = pred == y_true>>> resultarray([False,  True, False,  True,  True])>>> accuracy = np.mean(result)>>> accuracy0.6

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注