我在进行一些计算,并希望通过Pytorch来优化这些参数。我并不是在定义一个神经网络,所以没有层之类的东西。只是一个简单的计算序列。我使用torch.nn.Module来使用Pytorch的优化器。
我的类大致如下所示:
class XTransformer(torch.nn.Module): def __init__(self, x): super(ReLUTransformer, self).__init__() self.x = x def funky_function(self, m, c): # 进行一些计算 m = self.x * 2 - m + c return m, c def forward(self, m, c): m, c = self.funky_function(m, c) return m, c
后来我定义并尝试优化这个参数x,如下所示:
x = torch.autograd.Variable(x, requires_grad=True)model = XTransformer(x)optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)m, c = smtloss = loss_func()for t in range(100): m , c = model(m, c) l = loss(m, true) optimizer.zero_grad() l.backward() optimizer.step()
我不知道该怎么办。我得到了“ValueError: optimizer got an empty parameter list”错误。当我只将[x]作为参数传递给优化器时,它不会更新和改变x。我该怎么办?
回答:
您需要将x
注册为参数,让PyTorch知道这应该是一个可训练的参数。这可以通过在初始化时将其定义为nn.Parameter
来完成
def __init__(self, x): super(ReLUTransformer, self).__init__() self.x = torch.nn.Parameter(x)