下面一段函数,功能是对输入的特征描述子desc1、desc2做余弦相似度的计算。
def calc_cosine_similarity(desc1, desc2):
'''
Input:
desc1: [B,N,*,C]
desc2: [B,N,*,C]
Ret:
similarity: [B,N,*]
'''
inner_product = torch.sum(
torch.mul(desc1, desc2), dim=-1,
keepdim=False) #指定最终相加是在最后一个维度上计算
norm_1 = torch.norm(desc1, dim=-1, keepdim=False)
norm_2 = torch.norm(desc2, dim=-1, keepdim=False)
similarity = inner_product/(torch.mul(norm_1, norm_2)+1e-6)
return similarity
主要分为两步:
s1: 对desc1和desc2做内积(使用torch.mul())
内积, 即将矩阵中的对应位置相乘, 再逐一相加的结果。内积呈现为一个数字。
向量A=[a1,a2,…an],B=[b1,b2…bn]
则向量A和B的内积表示为:
A·B=a1×b1+a2×b2+……+an×bn
s2: 计算L2范数
由于torch.norm默认使用的是L2范数,这里直接使用就可以;如果需要使用L1范数, 使用norm_type来指定。