如何使用PyTorch作为通用函数优化器?

问题描述 投票:0回答:1

我有一个参数函数,应该对输入位置 X 处的某些数据 Y 的行为进行建模。我想使用 pytorch 优化器和 GPU,但那里的教程假设我想使用神经层。你能帮我定义一个最小的工作示例吗?

我尝试遵循 PyTorch 的官方指南,但我无法获得不使用调度程序或神经网络的最小工作示例。我在 stackoverflow 上寻找过类似的答案,但他们假设了我没有的知识 - 我确实知道使用 numpy/scipy 组合进行优化需要执行哪些步骤

optimization pytorch gpu
1个回答
0
投票

首先,您需要为

X
Y
数据定义一个torch.tensor(概念上类似于numpy.array),这些数据需要发送到GPU。在本例中,我们使用第一个 CUDA GPU 来存储单个输入值“2”。和所需的输出“10”:

import torch
device = "cuda:0"
X = torch.tensor(2., device=device)
Y = torch.tensor(10., device=device)

然后按以下方式定义模型。该模型可能由许多成员组成,这些成员可以是概念神经层,也可以是在启动时表达的参数集合。在这种情况下,参数函数的参数只有 1 个元素,初始值设置为 0,参数函数只是一个缩放输入的函数,必须使用

forward
方法定义。

class Model(torch.nn.Module):
  def __init__(self, device):
    super(Model, self).__init__()
    init_scaling_factor = torch.zeros(1, device=device)
    self.scaling_factor = torch.nn.Parameter(init_scaling_factor, requires_grad=True)
 
  def forward(self, x):
    output = self.scaling_factor * x
    return output

以下几行初始化模型、SGD 优化器并定义成本函数。

model = Model(device=device)
optim = torch.optim.SGD(model.parameters(), lr=0.01)
loss_fn = torch.nn.MSELoss()

通过优化循环,在每一步我们计算一个成本函数,并让优化器通过 loss.backward()/optim.step() 组合将其最小化,这需要通过对输入执行的多个操作来反向传播误差X(这样就知道优化器如何更好地估计模型参数)并更新模型参数。

n_iters = 8000
for i in range(0, n_iters):
  predictions = model.forward(X)
  loss = loss_fn(predictions, Y)
  loss.backward()
  optim.step()
  optim.zero_grad()
  print(f"loss ({i}): {loss.item()}")
print(f"The scaling parameter is {model.scaling_factor.data.item()}")
© www.soinside.com 2019 - 2024. All rights reserved.