python - pytorch如何设置.requires_grad False

标签 python pytorch gradient-descent

我想卡住我的一些模型。按照官方文档:

with torch.no_grad():
    linear = nn.Linear(1, 1)
    linear.eval()
    print(linear.weight.requires_grad)

但它打印出 True 而不是 False。如果我想将模型设置为评估模式,我应该怎么做?

最佳答案

requires_grad=假

如果您想卡住模型的一部分并训练其余部分,您可以将要卡住的参数的 requires_grad 设置为 False

例如,如果您只想保持 VGG16 的卷积部分固定:

model = torchvision.models.vgg16(pretrained=True)
for param in model.features.parameters():
    param.requires_grad = False

通过将 requires_grad 标志切换为 False,不会保存任何中间缓冲区,直到计算到达操作输入之一需要梯度的某个点.

火炬.no_grad()

使用上下文管理器 torch.no_grad 是实现该目标的另一种方式:在 no_grad 上下文中,所有计算结果都将具有 requires_grad =False,即使输入有 requires_grad=True。请注意,您将无法将梯度反向传播到 no_grad 之前的层。例如:

x = torch.randn(2, 2)
x.requires_grad = True

lin0 = nn.Linear(2, 2)
lin1 = nn.Linear(2, 2)
lin2 = nn.Linear(2, 2)
x1 = lin0(x)
with torch.no_grad():    
    x2 = lin1(x1)
x3 = lin2(x2)
x3.sum().backward()
print(lin0.weight.grad, lin1.weight.grad, lin2.weight.grad)

输出:

(None, None, tensor([[-1.4481, -1.1789],
         [-1.4481, -1.1789]]))

此处 lin1.weight.requires_grad 为真,但未计算梯度,因为操作是在 no_grad 上下文中完成的。

模型.eval()

如果您的目标不是微调,而是将模型设置为推理模式,最方便的方法是使用 torch.no_grad 上下文管理器。在这种情况下,您还必须将模型设置为评估模式,这是通过在 nn.Module 上调用 eval() 来实现的,因为示例:

model = torchvision.models.vgg16(pretrained=True)
model.eval()

此操作将层的属性 self.training 设置为 False,实际上这将改变操作的行为,例如 DropoutBatchNorm 在训练和测试时必须表现不同。

关于python - pytorch如何设置.requires_grad False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51748138/

相关文章:

PyTorch nn.Transformer 学习复制目标

centos - F.conv2d 卡在我的 CentOS 上

python - 如何找到列表中特定元素的位置?

python rtsp 转 webrtc

python - 邮件 URL 中的正则表达式匹配密码

python - 为什么 xlsxwriter 在我的单元格开头写 '

pytorch - 从给定为张量的索引创建一个热向量

python - tf.zeros() 是否返回 tf.get_variable()?

python - 任何神经网络体系结构的梯度下降的通用实现

machine-learning - 机器学习中的批量大小会减少计算时间吗?