我今天在使用PyTorch遇到一个奇怪的问题。
在检查with
范围内的网络参数时,我期望requires_grad
为False
,但显然不是这样,除非我自己明确设置所有参数。
代码
链接到网络-> 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
答案 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
张量没有与之关联的梯度函数,而在第二种情况下。