Deep Learning

Pytorch에서 Batch Size 1로 했을 때 accuracy가 떨어지는 문제 해결 (model.eval())

jinmc 2022. 9. 23. 10:31
반응형

딥러닝을 하던 중, training set을 Batch size 32로 학습하고, Test set을 Batch size 32로 inference 했을 때 

좋은 accuracy가 나오는데, Test set을 Batch 1으로 하면 accuracy가 많이 떨어지는 현상이 발생하였습니다.

 

게다가 prediction을 찍어 보니깐, 전혀 prediction을 못하는 것으로 나왔습니다.

batch normalization 문제라고 생각했었는데, 알고 보니깐 model.eval()을 넣지 않아서 생기는 문제였습니다.

model.eval()을 해주고 나서 inference를 하니깐 평가가 잘 되는 것을 발견하였습니다.

 

이 포스트에서 자세하게 나와있습니다.

model.eval()로 해결! 

 

또한 pytorch포럼에 따르면, batchNorm layer가 들어가는 경우,

2개 이상의 data를 expect하기 때문에 1개의 data가 들어오면 에러가 난다고 합니다.

 

이 포스트에서는 에러가 나온다고 말하는데, 

제가 테스트 했을 때는 에러가 나오지는 않았습니다.

 

그럼 model.eval()이 하는 일은 무엇일까요?

model.eval()의 경우에는 Droupout이랑 Batchnorm을 disable해주는 일을 해 주고,

torch.no_grad()의 경우에는 backward()를 부르지 않을 것을 확인해주고, autograd engine(gradient을 계산해주는 context)를 

비활성화시켜서 gradient tracking을 하지 않는다고 합니다.

 

no_grad와 eval의 차이 

 

앞으로 inferecing 하는 경우 다음과 같은 코드를 사용하는 것이 좋을 것 같습니다.

 

model.eval()
with torch.no_grad():
    for batch in data_loader:

 

반응형