PyTorch 使用不带 For 循环的核函数生成矩阵
PyTorch Generating Matrix using a Kernel Function without For-Loops
我正在尝试生成类似于 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 矩阵?
还有什么其他方法可以解决这个问题?
任何见解将不胜感激。
您可以通过 x
简单地计算 G
:
G = (1 + torch.matmul(x, x.T)).pow(2)
我正在尝试生成类似于 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 矩阵? 还有什么其他方法可以解决这个问题? 任何见解将不胜感激。
您可以通过 x
简单地计算 G
:
G = (1 + torch.matmul(x, x.T)).pow(2)