假设我们有一个3D PyTorch张量,其中第一维表示batch_size
,如下所示:
import torch
import torch.nn as nn
x = torch.randn(32, 100, 25)
即,对于每个i
,x[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
?
谢谢。
如果您仔细阅读torch.nn.CosineSimilarity()
和nn.CosineSimilarity
的文档,您会发现它们并没有计算出所有成对的相似度/距离(您需要),而是期望same的两个输入形状,并仅计算所有对应点之间的相似度/距离。也就是说,如果您有两组在32个维度上的100个向量,则这些函数将计算的是第一组中第nn.CosineSimilarity
个向量与第二组中相应的第nn.PairwiseDistance
个向量之间的相似度/距离仅包含100个相似度/距离值。
如果要计算所有成对距离,则需要手动计算。使用nn.PairwiseDistance
似乎是朝正确方向迈出的一步。
如果您正在寻找一种计算L2距离的有效方法,您可能会发现i
方法很有用。