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
:
- 当
小于0.5时(y_pred
将等于y_pred<0.5
):如果True
为1(即正),则这意味着网络的预测与真标签一致(即y_True
等于True==1
)因此,此样本的预测将计入正确预测(即准确性)。但是,如果True
为0(即负值),则此样本的预测不正确(即y_true
等于true==0
),因此这将不会有助于正确的预测False
- 当
等于或大于0.5时(y_pred
将等于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我认为你应该在实验中找到它,即尝试不同的阈值,看看哪一个对验证/测试数据最有效。