- toc {:toc}
Model.train() & Model.eval()
- 모델을 교육하고 있다는 것을 모델에 알린다.
- Batch Normalization Layer, Dropout Layer의 경우 train, eval 에 따라서 다르게 동작하기 때문에 학습, 추론에 따른 동작을 지정해줘야 한다.
- train()
- Batch Norm - Batch Statistics를 이용한다.
- Dropout - 주어진 확률에 따라 활성화된다.
- eval()
- Batch Norm - 학습 시 사용된 Batch Statistics를 통해 결정된 Running Statistics를 이용한다.
- Dropout - 비활성화 된다.
with torch.no_grad()
{: width=“800”}{: .center}
- no_grad()를 with statement에 포함시키면 Pytorch의 Autograd Engine을 비활성화하여 gradient 연산을 사용하지 않다.
- 이 경우 backward를 사용하지 않고 require_grad=False 가 된다.
- gradient 연산을 하지 않기 때문에 메모리 사용량을 줄이고 속도를 높인다.
optimizer.zero_grad()
-
Pytorch의 경우 gradient값들을 backward할 때 계속해서 축적한다.
-
zero_grad()를 하지 않는다면 이전 step에서 backward할 때 사용된 gradient값이 현재 step에서도 사용되기 때문에 중복 적용된다.
→ 중복 적용된다면 의도한 방향과 다른 방향을 가르켜 학습이 잘 되지 않는다.
⇒ 결론적으로 매 학습 iteration마다 optimizer.zero_grad()를 해주면서 gradient를 0으로 초기화 시켜줘야 한다.