- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想卡住我的一些模型。按照官方文档:
with torch.no_grad():
linear = nn.Linear(1, 1)
linear.eval()
print(linear.weight.requires_grad)
但它打印出 True
而不是 False
。如果我想将模型设置为评估模式,我应该怎么做?
最佳答案
如果您想卡住模型的一部分并训练其余部分,您可以将要卡住的参数的 requires_grad
设置为 False
。
例如,如果您只想保持 VGG16 的卷积部分固定:
model = torchvision.models.vgg16(pretrained=True)
for param in model.features.parameters():
param.requires_grad = False
通过将 requires_grad
标志切换为 False
,不会保存任何中间缓冲区,直到计算到达操作输入之一需要梯度的某个点.
使用上下文管理器 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
上下文中完成的。
如果您的目标不是微调,而是将模型设置为推理模式,最方便的方法是使用 torch.no_grad
上下文管理器。在这种情况下,您还必须将模型设置为评估模式,这是通过在 nn.Module
上调用 eval()
来实现的,因为示例:
model = torchvision.models.vgg16(pretrained=True)
model.eval()
此操作将层的属性 self.training
设置为 False
,实际上这将改变操作的行为,例如 Dropout
或BatchNorm
在训练和测试时必须表现不同。
关于python - pytorch如何设置.requires_grad False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51748138/
来自 docs : requires_grad – Boolean indicating whether the Variable has been created by a subgraph con
我想卡住我的一些模型。按照官方文档: with torch.no_grad(): linear = nn.Linear(1, 1) linear.eval() print(li
pytorch更新完后合并了Variable与Tensor torch.Tensor()能像Variable一样进行反向传播的更新,返回值为Tensor Variable自动创建tensor,且
当我使用 PyTorch 创建神经网络时,使用 torch.nn.Sequential 方法定义层,参数似乎默认为 requires_grad = False。但是,当我训练这个网络时,损失会减少。如
当我使用 PyTorch 创建神经网络时,使用 torch.nn.Sequential 方法定义层,参数似乎默认为 requires_grad = False。但是,当我训练这个网络时,损失会减少。如
我不能使用带有 requires_grad 参数的 torch.Tensor()(torch 版本:0.4.1) 没有 requires_grad : x = torch.Tensor([[.5, .
我在训练 MNIST 数据时收到此错误,csv 文件来自 Kaggle。有人可以告诉我哪里错了吗?这是我的代码。 PyTorch的版本是0.4.0。 import numpy as np import
我正在关注 PyTorch tutorial它使用 Huggingface Transformers 库中的 BERT NLP 模型(特征提取器)。有两段我不明白的梯度更新相关代码。 (1) torc
张量b 和c 的requires_grad 为True。但是张量 d 的 requires_grad 是 False。我很好奇为什么会发生这种变化,因为输入的所有 requires_grad 都是 T
Pytorch 0.4.0 引入了 Tensor 和 Variable 类的合并。 在此版本之前,当我想从一个 numpy 数组创建一个带有 autograd 的 Variable 时,我会执行以下操
我是一名优秀的程序员,十分优秀!