我正在使用Keras训练模型,并希望使用预测和假设之间的角距离作为度量。到目前为止,我发现的最接近的度量是余弦接近度,而不是角距离。
余弦接近度(或余弦距离)存在的问题是,小数的余弦非常相似。
看Wikipedia,可以使用余弦接近度来计算角距离:
因此,我想知道使用基于余弦接近度的自定义指标是否是个好主意,以及是否可以实现?
答案 0 :(得分:0)
所以我想我有自己的问题的答案。我要做的是,我首先使用Keras的源代码来计算余弦近似度。然后,我计算了先前结果的反余弦值:
def angular_distance(y_true, y_pred):
y_true = K.l2_normalize(y_true, axis=-1)
y_pred = K.l2_normalize(y_pred, axis=-1)
cosine = K.sum(y_true * y_pred, axis=-1)
return 2*tf.math.acos(cosine)/np.pi
然后,我将新功能作为自定义指标传递给模型的编译脚本:
model.compile(loss='categorical_crossentropy', optimizer=Adam(0.001),
metrics=[angular_distance])