【问题标题】:PyTorch Generating Matrix using a Kernel Function without For-LoopsPyTorch 使用没有 For 循环的核函数生成矩阵
【发布时间】:2021-09-24 14:44:16
【问题描述】:

我正在尝试生成一个类似于 Gram 矩阵的矩阵(PyTorch 上的张量对象),但我需要在我的输入矩阵上应用核函数而不是内积。

如下所示的 For 循环有效:

N = x.shape[0] # x.shape = (N,d)
G = torch.zeros((N,N)) 
for i in range(N):
    for j in range(N):
        G[i][j] = K(x[i], x[j])

其中 x 是我的输入张量,其形状为 (N,d),核函数 K(a,b) 在执行一些数学运算后产生一个实数值。例如:

def K(a,b):
   return ((1+(a*b)).sum()).pow(2) #second degree polynomial.

我想生成这个矩阵 G 而不必更改核函数 K(),当然也不需要 for 循环!

我最初的尝试是使用 lambda 方法,但下面的代码显然不起作用,因为它只产生 k(x[i],x[i]) 的列表。

G = torch.tensor(list(map(lambda a,b: K(a,b),x,x))

如何使用 lambda 函数生成 N×N 矩阵? 还有什么其他方法可以解决这个问题? 任何见解将不胜感激。

【问题讨论】:

  • 你确定你说的不是(1+(a*b).sum()).pow(2) 吗?
  • @bobcat 是的。你说的对。刚刚编辑了问题!

标签: python pytorch


【解决方案1】:

您可以简单地从x 计算G

G = (1 + torch.matmul(x, x.T)).pow(2)

【讨论】:

  • 感谢您的回复。如果我可以控制该功能,我会这样做。在我正在处理的任务中,我必须使用给定的功能。
  • @JKim 这是您问题的答案。它从x 计算G
  • 是的。但最初的问题是我必须调用为任务提供的这个内核函数,并且我不能对内核函数进行更改。我不应该通过传递内核函数并对其进行硬编码。有多个核函数n次多项式函数,RBF等。约束是“使用提供的核函数并填充核化矩阵”
  • @JKim 我的代码没有“改变”K。我很确定这个作业问题是指使用 K 的数学函数,而不是调用 Python 函数K
  • 没有。它正在调用 Python 函数 K。就像我之前说的,我们得到了实用函数。反正我想通了。感谢您的宝贵时间!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多