DeepLearning/Pytorch

[Pytorch] 중간에 등장하는 변수의 grad가 None일 때

yooj_lee 2021. 9. 29. 22:26
300x250

Error Raised

UserWarning: The .grad attribute of a Tensor that is not a leaf Tensor is being accessed. Its .grad attribute won't be populated during autograd.backward(). If you indeed want the gradient for a non-leaf Tensor, use .retain_grad() on the non-leaf Tensor. If you access the non-leaf Tensor by mistake, make sure you access the leaf Tensor instead. See github.com/pytorch/pytorch/pull/30531 for more information.

upsampling layer를 통과할 때 backpropagation이 어떻게 이루어지는지 보고자
setattr(self, 'upsampled', upsampled.clone().detach().requires_grad_()) 를 해주고
backward 후에 self.upsampled.grad를 확인했는데 None이 리턴됨.

Solution

https://discuss.pytorch.org/t/grad-is-none-even-when-requires-grad-true/29826

 

Grad is None even when requires_grad=True

I run into this wired behavior of autograd when try to initialize weights. Here is a minimal case: import torch print("Trial 1: with python float") w = torch.randn(3,5,requires_grad = True) * 0.01 x = torch.randn(5,4,requires_grad = True) y = torch.matmul(

discuss.pytorch.org

backward를 호출하면 intermediate variables의 grad는 모두 삭제가 되기 때문에 requires_grad_를 적용해주어도 backward 후에 grad 속성을 보면 None값을 보게 됨. (leaf node인 경우에만 grad 추적이 되도록 default 설정해둠 in torch)

단, 나의 경우에는 저렇게 해줘도 바로 해결이 되지 않았음.
아무래도 clone과 detach를 해줌으로써 아예 다른 Tensor를 넣어줬기 때문일 것임 (완벽하게 분리해서 copy)
→ setattr(self, 'upsampled', upsampled) 로 수정 후
self.upsampled.retrain_grad()를 backward 메소드 호출 전에 추가해줌.

아래를 보면 None값이 아니라 grad를 제대로 잡아주는 걸 볼 수 있음.

300x250