Python Pytorch余弦相似NxN元素

Python Pytorch余弦相似NxN元素,python,pytorch,Python,Pytorch,我有128个嵌入向量 image.shape = torch.Size([128, 512]) text.shape = torch.Size([128, 512]) 我想计算包含所有元素之间余弦相似性的张量(即: 其中第一行是第一个图像和所有文本(128)之间的余弦相似性,以此类推 目前我只做这个,但结果是一个一维数组,只包含N余弦相似性 cosine_similarity = torch.nn.CosineSimilarity() cosine = cosine_similarity(i

我有128个嵌入向量

image.shape = torch.Size([128, 512])
text.shape = torch.Size([128, 512])
我想计算包含所有元素之间余弦相似性的张量(即:

其中第一行是第一个图像和所有文本(128)之间的余弦相似性,以此类推

目前我只做这个,但结果是一个一维数组,只包含N余弦相似性

cosine_similarity = torch.nn.CosineSimilarity()

cosine = cosine_similarity(image, text)

我该怎么做?我试着转置文本,但没有成功

这应该可以做到:

repeated\u image=image。repeated\u交错(128,dim=0)
重复的文本=文本。重复(128,1)
距离=火炬.nn.功能性.余弦相似性(重复图像,重复文本,尺寸=1)
距离=距离。重塑形状(128128)
说明: 为了更快地进行计算,最好复制数据,然后使用GPU并行执行步骤,而不是在所有可能的对上进行循环。前两行以适当的方式复制数据:

repeat_interleave
将沿dim=0复制张量的每个元素(512维图像),这将创建一个(128*128,512)张量,其前128个元素属于第一个图像,依此类推

repeat
将沿第0维将整个张量重复128次,再次创建(128*128512)张量,其中第一个元素属于第一个文本,第二个元素属于第二个文本,依此类推(第129个元素属于第一个文本)

然后,我们使用
cosine\u相似度
函数计算所有成对距离,然后对其进行整形,使其形成适当的形状

cosine_similarity = torch.nn.CosineSimilarity()

cosine = cosine_similarity(image, text)