Pythorch如何设置。需要

2024-04-26 04:08:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把我的一些模型冷冻起来。遵循官方文件:

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

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


Tags: 文件no模型true官方withevalnn
3条回答

要完成@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)

需要_grad=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,实际上,这将改变在训练和测试时行为必须不同的操作的行为,如DropoutBatchNorm

这是路

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

相关问题 更多 >

    热门问题