如何在pytorch中设置网络的梯度

how to set the gradient for a network in pytorch

我在pytorch中有一个模型。该模型可以采用任何形状,但我们假设这是模型

torch_model =  Sequential(
    Flatten(),
    Linear(28 * 28, 256),
    Dropout(.4),
    ReLU(),
    BatchNorm1d(256),
    ReLU(),
    Linear(256, 128),
    Dropout(.4),
    ReLU(),
    BatchNorm1d(128),
    ReLU(),
    Linear(128, 10),
    Softmax()
)

我正在使用 SGD 优化器,我想为每一层设置梯度,以便 SGD 算法将参数按我想要的方向移动。

假设我希望所有层的所有渐变都是一个 (torch.ones_like(gradient_shape)) 我该怎么做? 谢谢?

在 PyTorch 中,使用上面定义的模型,您可以像这样迭代层:

for layer in list(torch_model.modules())[1:]:
  print(layer)

您必须添加 [1:],因为返回的第一个模块是顺序模块本身。在任何层中,您都可以使用 layer.weight 访问权重。但是,请务必记住,某些层(如 Flatten 和 Dropout)没有权重。一种检查然后将每个权重加 1 的方法是:

for layer in list(torch_model.modules())[1:]:
  if hasattr(layer, 'weight'):
    with torch.no_grad():
      for i in range(layer.weight.shape[0]):
          layer.weight[i] = layer.weight[i] + 1

我在你的模型上测试了上面的内容,它确实为每个权重增加了 1。值得注意的是,如果没有 torch.no_grad() 它将无法工作,因为您不希望 pytorch 跟踪更改。