如果张量值有梯度,则计算它们
- 有
requires_grad == True
- 用于计算您调用的某个值(通常是损失)
.backward()
。
然后梯度将在它们的.grad
参数中累积。您可以手动使用它们来执行任意计算(包括优化)。预定义的优化器接受一个可迭代的参数并model.parameters()
做到这一点——它返回一个可迭代的参数。如果您有一些自定义的“自由浮动”参数,您可以将它们传递为
my_params = [my_param_1, my_param_2]
optim = torch.optim.Adam(my_params)
您还可以将它们与其他参数迭代合并,如下所示:
model_params = list(model.parameters())
my_params = [my_param_1, my_param_2]
optim = torch.optim.Adam(model_params + my_params)
然而,在实践中,您通常可以构建代码来避免这种情况。有nn.Parameter
一个包装张量的类。的所有子类nn.Module
都__setattr__
被覆盖,因此每当您将 的实例分配nn.Parameter
为其属性时,它将成为Module
的.parameters()
可迭代的一部分。换句话说
class MyModule(nn.Module):
def __init__(self):
super(MyModule, self).__init__()
self.my_param_1 = nn.Parameter(torch.tensor(...))
self.my_param_2 = nn.Parameter(torch.tensor(...))
将允许你写
module = MyModule()
optim = torch.optim.Adam(module.parameters())
并有optim
更新module.my_param_1
和module.my_param_2
。这是首选方式,因为它有助于使您的代码更有条理
- 创建优化器时,您不必手动包含所有参数
- 您可以调用
module.zero_grad()
所有子nn.Parameter
s 上的梯度并将其归零。
- 您可以调用诸如
module.cuda()
or之类的方法,这些方法module.double()
同样适用于所有子nn.Parameter
项,而无需手动遍历它们。