Error
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
Error 발생 코드
loss = engine.crit(y_hat, y)
loss.backward()
텐서의 기울기 계산 여부는 requires_grad 로 확인할 수 있다.
수정 코드
loss = engine.crit(y_hat, y)
loss.requires_grad_(True) # 수정
loss.backward()
model.eval()
딥러닝 모델들은 학습과 추론에서 다르게 작동하는 Layer가 있다.
대표적으로 BatchNorm, Dropout가 있으며 이런 Layer 들이 추론 과정에서 학습시와는 다르게 작동하게 한다.
torch.no_grad()
with torch.no_grad()부분에서는 gradient 계산을 하지 않아 메모리/속도가 개선된다.
공식 문서에서는 loss.backward()를 호출하지 않는다면 사용할 것을 권장한다.
requires_grad=False
for p in model.parametes():
p.requires_grad=False
requires_grad=False 를 적용하면 모델의 특정 부분에 그라디언트 계산을 멈출 수 있다.
torch.no_grad() 와 가장 큰 차이는 그라디언트를 저장은 한다는 것이다.
따라서 모델의 특정 부분은 freeze 하고 나머지는 학습시키는 등의 전략을 사용할 때 사용한다.