PyTorch中的一组向量之间的成对相似矩阵

问题描述 投票:0回答:1

假设我们有一个3D PyTorch张量,其中第一维表示batch_size,如下所示:

import torch
import torch.nn as nn
x = torch.randn(32, 100, 25)

即,对于每个ix[i]是100个25维向量的集合。我想为每个批次项目计算这些向量的相似度(例如,余弦相似度-但通常是任何这样的成对距离/相似度矩阵)。

也就是说,对于每个x[i],我需要计算一个[100, 100]矩阵,该矩阵将包含上述向量的成对相似性。更具体地说,对于所有x[t],此矩阵的第(i,j)个元素应包含(100x25)t=1, ..., batch_size的第i行与第j行之间的相似度(或距离)。

[如果我使用torch.nn.CosineSimilarity(),无论我使用什么dim,结果都是[100, 25]dim=0)[32, 25]dim=1),其中我需要一个大小为[ C0]。我希望[32, 100, 100]可以这样工作(因为至少对我来说,它看起来更直观),但事实并非如此。

可以使用下面的方法来做到这一点吗?

torch.nn.CosineSimilarity()

我想这可以给出一个距离矩阵,但是如果我需要一个任意的成对运算怎么办?我应该使用上面的命令构建此操作吗?

或者也许我应该以某种方式重复torch.matmul(x, x.permute(0, 2, 1)) 以便可以使用内置的x

谢谢。

python pytorch similarity cosine-similarity pairwise-distance
1个回答
0
投票

如果您仔细阅读torch.nn.CosineSimilarity()nn.CosineSimilarity的文档,您会发现它们并没有计算出所有成对的相似度/距离(您需要),而是期望same的两个输入形状,并仅计算所有对应点之间的相似度/距离。也就是说,如果您有两组在32个维度上的100个向量,则这些函数将计算的是第一组中第nn.CosineSimilarity个向量与第二组中相应的第nn.PairwiseDistance个向量之间的相似度/距离仅包含100个相似度/距离值。

如果要计算所有成对距离,则需要手动计算。使用nn.PairwiseDistance似乎是朝正确方向迈出的一步。

如果您正在寻找一种计算L2距离的有效方法,您可能会发现i方法很有用。

© www.soinside.com 2019 - 2024. All rights reserved.