即使使用 torch.no_grad(),params 的 require_grad 也是 True

Rex*_*Low 2 python neural-network pytorch

我今天在使用 PyTorch 时遇到了一个奇怪的问题。

在检查with范围内的网络参数时,我期望requires_gradFalse,但显然情况并非如此,除非我自己明确设置所有参数。

代码

链接到网络 ->要点

net = InceptionResnetV2()

with torch.no_grad():

    for name, param in net.named_parameters():
        print("{} {}".format(name, param.requires_grad))
Run Code Online (Sandbox Code Playgroud)

上面的代码将告诉我所有参数仍然需要 grad,除非我明确指定param.requires_grad = False

我的torch版本:1.0.1.post2

can*_*ust 5

torch.no_grad()将禁用涉及设置为的张量的运算结果的梯度信息。因此请考虑以下事项:requires_gradTrue

import torch

net = torch.nn.Linear(4, 3)

input_t = torch.randn(4)

with torch.no_grad():

    for name, param in net.named_parameters():
        print("{} {}".format(name, param.requires_grad))

    out = net(input_t)

    print('Output: {}'.format(out))

    print('Output requires gradient: {}'.format(out.requires_grad))
    print('Gradient function: {}'.format(out.grad_fn))
Run Code Online (Sandbox Code Playgroud)

这打印

weight True
bias True
Output: tensor([-0.3311,  1.8643,  0.2933])
Output requires gradient: False
Gradient function: None
Run Code Online (Sandbox Code Playgroud)

如果你删除with torch.no_grad(),你会得到

weight True
bias True
Output: tensor([ 0.5776, -0.5493, -0.9229], grad_fn=<AddBackward0>)
Output requires gradient: True
Gradient function: <AddBackward0 object at 0x7febe41e3240>
Run Code Online (Sandbox Code Playgroud)

请注意,在这两种情况下,模块参数都requires_grad设置为True,但在第一种情况下,out张量没有与之关联的梯度函数,而在第二种情况下则有。