Rosenbrock函数使用PyTorch进行D维度

时间:2017-11-17 11:52:44

标签: python pytorch

如何使用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]。   我怎么处理它?   谢谢!

1 个答案:

答案 0 :(得分:0)

Numpy有roll函数,我认为它真的很有帮助。 不幸的是,我不知道任何与numpy.roll类似的函数用于pytorch。

在我的尝试中,xDxN形式的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版本中的循环