2024-04-26 04:08:49 发布
网友
我想把我的一些模型冷冻起来。遵循官方文件:
with torch.no_grad(): linear = nn.Linear(1, 1) linear.eval() print(linear.weight.requires_grad)
但它打印的是True,而不是False。如果我想将模型设置为eval模式,我应该怎么做?
True
False
要完成@Salih\u Karagoz的答案,您还需要^{}上下文(进一步的文档here),可以使用它在列车/评估模式之间轻松切换:
linear = nn.Linear(1,1) is_train = False with torch.set_grad_enabled(is_train): linear.eval() print(linear.weight.requires_grad)
如果要冻结模型的一部分并训练其余部分,可以将要冻结的参数的requires_grad设置为False。
requires_grad
例如,如果只想保持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之前,您将无法将渐变反向传播到层。例如:
torch.no_grad
no_grad
requires_grad=False
requires_grad=True
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上下文中完成的。
lin1.weight.requires_grad
如果您的目标不是微调,而是将模型设置为推理模式,那么最方便的方法是使用torch.no_grad上下文管理器。在这种情况下,还必须将模型设置为求值模式,这可以通过调用nn.Module上的eval()来实现,例如:
nn.Module
eval()
model = torchvision.models.vgg16(pretrained=True) model.eval()
此操作将层的属性self.training设置为False,实际上,这将改变在训练和测试时行为必须不同的操作的行为,如Dropout或BatchNorm。
self.training
Dropout
BatchNorm
这是路
linear = nn.Linear(1,1) for param in linear.parameters(): param.requires_grad = False with torch.no_grad(): linear.eval() print(linear.weight.requires_grad)
输出:False
要完成@Salih\u Karagoz的答案,您还需要^{} 上下文(进一步的文档here),可以使用它在列车/评估模式之间轻松切换:
需要_grad=False
如果要冻结模型的一部分并训练其余部分,可以将要冻结的参数的
requires_grad
设置为False
。例如,如果只想保持VGG16的卷积部分不变:
通过将
requires_grad
标志切换到False
,将不会保存中间缓冲区,直到计算到达某个点,其中一个操作输入需要渐变。火炬。没有毕业()
使用上下文管理器
torch.no_grad
是实现该目标的另一种方法:在no_grad
上下文中,所有计算结果都将具有requires_grad=False
,即使输入具有requires_grad=True
。注意,在no_grad
之前,您将无法将渐变反向传播到层。例如:输出:
这里
lin1.weight.requires_grad
是真的,但是梯度没有计算出来,因为操作是在no_grad
上下文中完成的。模型评估()
如果您的目标不是微调,而是将模型设置为推理模式,那么最方便的方法是使用
torch.no_grad
上下文管理器。在这种情况下,还必须将模型设置为求值模式,这可以通过调用nn.Module
上的eval()
来实现,例如:此操作将层的属性
self.training
设置为False
,实际上,这将改变在训练和测试时行为必须不同的操作的行为,如Dropout
或BatchNorm
。这是路
输出:False
相关问题 更多 >
编程相关推荐