如何使用PyTorch实现D维度的 Rosenbrock函数?
创建变量,其中
D
是维数,N
是元素数。
x = (xmax - xmin)*torch.rand(N,D).type(dtype) + xmin
功能:
使用直接Python我会做这样的事情:
fit = 0
for i in range(D-1):
term1 = x[i + 1] - x[i]**2
term2 = 1 - x[i]
fit = fit + 100 * term1**2 + term2**2
我尝试使用Pytorch:
def Rosenbrock(x):
return torch.sum(100*(x - x**2)**2 + (x-1)**2)
我不知道如何在不使用for循环的情况下执行
x[i+1]
。 我怎么处理它? 谢谢!
答案 0 :(得分:0)
Numpy有roll
函数,我认为它真的很有帮助。
不幸的是,我不知道任何与numpy.roll
类似的函数用于pytorch。
在我的尝试中,x
是DxN
形式的numpy数组。首先,我们使用roll
将第一维(axis=0
)中的项目向左移动一个位置。像这样,每次我们比较x_1[i]
就像我们x[i+1]
一样。然后,由于该函数仅对{sum}采用D-1
个元素,因此我们删除了使用[:-1, :]
切割pytorch张量的最后一列。然后总结与您发布的代码非常相似,只是在正确的位置更改了x
x_1
。
def Rosenbrock(x):
x_1 = torch.from_numpy(np.roll(x, -1, axis=0)).float()[:-1, :]
x = torch.from_numpy(x).float()[:-1, :]
return torch.sum(100 * (x_1 - x ** 2) ** 2 + (x - 1) ** 2, 0)
同样,通过使用roll
,您可以删除numpy版本中的循环