본문 바로가기

Python/PyTorch

[Pytorch] .requires_grad(), torch.no_grad(), model.eval()

.requires_grad()

신경망에서, 변화도를 계산하지 않는 매개변수를 일반적으로 고정된 매개변수(frozen parameter)라고 부른다. 이러한 매개변수의 변화도가 필요하지 않다는 것을 미리 알고 있으면, 신경망 모델의 일부를 "고정(freeze)"하는 것이 유용하다. (이렇게 하면 autograd 연산량을 줄임으로써 성능상의 이득을 제공한다.)

 

미세조정(finetuning)을 하는 과정에서, 새로운 정답(label)을 예측할 수 있도록 모델의 대부분을 고정한 뒤 일반적으로 분류 계층(classifier layer)만 변경한다.

torch.no_grad()

gradient 계산을 비활성화하는 context manager이다.

no_grad()는 Tensor.backward()를 부르지 않아도 되는 추론(inference) 과정에서 유용하게 사용된다.

no_grad()는 thread local이여서 다른 thread의 계산에는 영향을 주지 않는다.

autograd를 끔으로써 메모리 사용량을 줄이고 연산 속도를 높여준다.

model.eval()

model에서 dropout이나 batch normalize등 layer의 기능들을 inference 모드로 바꾸는 역할

training과 inference 시에 다르게 동작하는 layer들이 존재하는데, 이때 layer들의 동작을 inference(eval) mode로 바꿔주는데 그 목적이 있다.

.zero_grad() vs. .no_grad()

zero_grad: grad 0으로 초기화

no_grad: gradient 트래킹을 하지 않겠다.

Transfer learning

Finetuning

pretrained model로 시작해서 model의 모든 parameter를 업데이트 한다. 실질적으로 전체 모델을 재학습시키는 것이다.

 

Feature extraction

pretrained model로 시작하여 예측을 도출하는 final layer의 weights(가중치)만 업데이트한다.

 

참고: https://tutorials.pytorch.kr/beginner/blitz/autograd_tutorial.html,
https://pytorch.org/docs/stable/generated/torch.no_grad.html,
https://tutorials.pytorch.kr/beginner/finetuning_torchvision_models_tutorial.html