我有一个参数函数,应该对输入位置 X 处的某些数据 Y 的行为进行建模。我想使用 pytorch 优化器和 GPU,但那里的教程假设我想使用神经层。你能帮我定义一个最小的工作示例吗?
我尝试遵循 PyTorch 的官方指南,但我无法获得不使用调度程序或神经网络的最小工作示例。我在 stackoverflow 上寻找过类似的答案,但他们假设了我没有的知识 - 我确实知道使用 numpy/scipy 组合进行优化需要执行哪些步骤
首先,您需要为
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()}")