在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回答