如何在三元组损失中使用余弦相似度

三元组损失定义如下:

L(A, P, N) = max(‖f(A) - f(P)‖² - ‖f(A) - f(N)‖² + margin, 0)

其中 A=anchorP=positiveN=negative 是损失中的数据样本,margin 是锚点与正/负样本之间的最小距离。

我曾在某处读到可以用 (1 - cosine_similarity) 来代替 L2 distance

请注意,我使用的是 Tensorflow – 余弦相似度损失的定义是,当其为-1到0之间的负数时,0表示正交,值越接近-1表示相似度越大。值越接近1表示差异性越大。因此,它与余弦相似度度量是相反的。

关于如何使用余弦相似度编写我的三元组损失,有什么建议吗?

编辑

答案(评论和答案)中都有很好的内容。根据所有提示 – 这对我来说运作良好:

 self.margin = 1 self.loss = tf.keras.losses.CosineSimilarity(axis=1) ap_distance = self.loss(anchor, positive) an_distance = self.loss(anchor, negative) loss = tf.maximum(ap_distance - an_distance + self.margin, 0.0)

我最终希望使用@pygeek指出的tensorflow附加损失,但我还没有弄清楚如何传递数据。

注意要独立使用它 – 必须做类似这样的事情:

cosine_similarity = tf.keras.metrics.CosineSimilarity()cosine_similarity.reset_state()cosine_similarity.update_state(anch_prediction, other_prediction)similarity = cosine_similarity.result().numpy() 

资源

pytorch余弦嵌入层

tensorflow余弦相似度实现

tensorflow三元组损失硬/软边界


回答:

首先,Cosine_distance = 1 - cosine_similarity。距离和相似度是不同的。这在一些答案中没有正确提及!

其次,你应该查看TensorFlow代码,了解cosine similarity loss是如何实现的 https://github.com/keras-team/keras/blob/v2.9.0/keras/losses.py#L2202-L2272,这与PyTorch不同!!

最后,我建议你使用现有的损失:你应该用 tf.losses.cosineDistance(...) 替换 || ... ||^2

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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