• 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()

no_grad documentation{: 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으로 초기화 시켜줘야 한다.