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

时间:2019-02-14 02:42:03

标签: python neural-network pytorch

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

在检查with范围内的网络参数时,我期望requires_gradFalse,但显然不是这样,除非我自己明确设置所有参数。

代码

链接到网络-> Gist

net = InceptionResnetV2()

with torch.no_grad():

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

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

我的torch版本:1.0.1.post2

1 个答案:

答案 0 :(得分:3)

torch.no_grad()将针对涉及将其requires_grad设置为True的张量的操作的结果禁用梯度信息。因此,请考虑以下几点:

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))

此打印

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

如果您删除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>

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