假设我们有一个 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]
矩阵,该矩阵将包含上述向量的成对相似性。更具体地说,该矩阵的第 (i,j) 元素应包含 (100x25) 的第 i 行和第 j 行之间的相似性(或距离)x[t]
,对于所有t=1, ..., batch_size
。
如果我使用torch.nn.CosineSimilarity()
,无论dim
我使用什么,结果都是[100, 25]
(dim=0)
或[32, 25]
( dim=1
) ,我需要一个大小的张量[32, 100, 100]
。我希望torch.nn.CosineSimilarity()
以这种方式工作(因为,至少对我来说,它看起来更直观) ,但事实并非如此。
可以使用下面的方法来完成吗?
torch.matmul(x, x.permute(0, 2, 1))
我想这可以给出一个距离矩阵,但是如果我需要一个任意的成对操作怎么办?我应该使用上述方法构建此操作吗?
或者也许我应该x
以某种方式重复,以便我可以使用内置的torch.nn.CosineSimilarity()
?
谢谢你。