在PyTorch中,当模型处于eval()阶段时,如何自动禁用register_hook?

在PyTorch中,当模型处于eval()阶段时,如何自动禁用register_hook?,pytorch,autograd,Pytorch,Autograd,我需要使用register\u hook方法更新中间张量变量的梯度。由于该变量不是叶变量,我需要向其添加retain\u grad()方法,然后,我可以使用register\u hook方法来更改梯度 score.retain_grad() h = score.register_hook(lambda grad: grad * torch.FloatTensor(...)) 这在培训(model.train())阶段非常有效。但是,它在评估阶段给出了一个错误(model.eval()) 错误:

我需要使用
register\u hook
方法更新中间张量变量的梯度。由于该变量不是叶变量,我需要向其添加
retain\u grad()
方法,然后,我可以使用
register\u hook
方法来更改梯度

score.retain_grad()
h = score.register_hook(lambda grad: grad * torch.FloatTensor(...))
这在培训(
model.train()
)阶段非常有效。但是,它在评估阶段给出了一个错误(
model.eval()

错误:

File "/home/envs/darthvader/lib/python3.6/site-packages/torch/tensor.py", line 198, in register_hook
    raise RuntimeError("cannot register a hook on a tensor that "
RuntimeError: cannot register a hook on a tensor that doesn't require gradient

当模型处于
eval()
阶段时,它如何能够自动禁用
register\u hook
方法?

删除
分数。保留
并使用if条件(
if score.requires\u grad
)保护
register\u hook
)起到了作用

if score.requires_grad:
    h = score.register_hook(lambda grad: grad * torch.FloatTensor(...))

最初由Alban D回答。

删除
分数。保留_grad()
并用if条件(
if分数。需要_grad
)保护
注册_hook

if score.requires_grad:
    h = score.register_hook(lambda grad: grad * torch.FloatTensor(...))
最初由Alban D回答