如何在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 跟踪更改。
我在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 跟踪更改。