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
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를 제대로 잡아주는 걸 볼 수 있음.
'DeepLearning > Pytorch' 카테고리의 다른 글
[Pytorch] model.zero_grad() vs. optimizer.zero_grad() (0) | 2022.07.14 |
---|---|
[Pytorch] Learning Rate Scheduler 커스텀하기 (0) | 2022.05.26 |
[Pytorch] 실험 재현(reproducibility)을 위한 실험 환경 randomness 제어하기 (1) | 2021.11.17 |
[Pytorch] hook (forward_hook, backward_hook) (0) | 2021.09.24 |
[Pytorch] nn.Module & super().__init__() (4) | 2021.08.21 |