새소식

에러 해결

RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn

  • -

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 하고 나머지는 학습시키는 등의 전략을 사용할 때 사용한다.

728x90
Contents