Machine learning Keras中示例暹罗网络的准确度和错误率

Machine learning Keras中示例暹罗网络的准确度和错误率,machine-learning,keras,deep-learning,siamese-network,Machine Learning,Keras,Deep Learning,Siamese Network,我一直在遵循这个示例,我想知道这个精度函数到底是如何工作的: 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) def计算精度(y_真,y_pred): ''使用固定的距离阈值计算

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

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)
def计算精度(y_真,y_pred):
''使用固定的距离阈值计算分类精度。
'''
pred=y_pred.ravel()<0.5
返回np.mean(pred==y_true)

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

在对该示例的理解上似乎存在一些空白,需要首先填补:

如果您研究了数据准备步骤(即
create_pairs
方法),您会发现阳性对(即属于同一类别的样本对)被分配了一个标签1(即阳性/真),阴性对(即属于不同类别的样本对)被分配了一个标签0(即阴性/假).

此外,示例中的暹罗网络设计为,给定一对样本作为输入,它将预测其作为输出的距离。通过使用对比损失作为模型的损失函数,对模型进行训练,使得给定一个正对作为输入,预测较小的距离值(因为它们属于同一类,因此它们的距离应该较低,即传递相似性),并给定一个负对作为输入,预测较大的距离值(因为它们属于不同的类别,因此它们之间的距离应该很高,即为了表达不同)。作为练习,尝试通过在代码中使用对比损失定义对这些点进行数值考虑(即当
y_-true
为1,当
y_-true
为0)来确认这些点

因此,实施该示例中的精度函数使得对预测的距离值应用固定的任意阈值,即0.5,即
y_pred
(这意味着本示例的作者已确定小于0.5的距离值表示正对;您可以决定使用另一个阈值,但这应该是基于实验/经验的合理选择)。然后将结果与真实标签值进行比较,即
y\u 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
>>y_pred=np.数组([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
数组([False,False,True,True,False])
>>>结果=pred==y\u真
>>>结果
数组([False,True,False,True,True])
>>>准确度=np.平均值(结果)
>>>准确度
0.6

我正在使用此函数计算精度。我的方法正确吗?pred=y_pred.ravel()@atherabadullati如果是,这也是计算精度的正确方法。
sklearn.metrics.accurity_score(y_true,pred)
np.mean(pred==y_true)完全相同
。我真的很感激。我现在正在研究如何定义我想到的使用ROC的精度阈值,但问题是,在将预测的标签传递给ROC之前,我仍然必须定义一个阈值:pred=y_pred.ravel()@Athelabullatif我认为你应该在实验中找到它,即尝试不同的阈值,看看哪一个对验证/测试数据最有效。