본문 바로가기
Tutorial, Guide

[Error] ValueError: Expected more than 1 value per channel when training, got input size ~

by 궁금한 준이 2023. 8. 23.
728x90
반응형

에러 위치

File "XX.py", line NN, in forward
    x = F.relu(self.bn(self.lin1(x)))
  File "/XX/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
  File "/XX/lib/python3.8/site-packages/torch/nn/modules/batchnorm.py", line 171, in forward
    return F.batch_norm(
  File "/XX/lib/python3.8/site-packages/torch/nn/functional.py", line 2448, in batch_norm
    _verify_batch_size(input.size())
  File "/XX/lib/python3.8/site-packages/torch/nn/functional.py", line 2416, in _verify_batch_size
  ValueError: Expected more than 1 value per channel when training, got input size torch.Size([1, 128])

보아하니 내 모델의 BatchNorm1d 에서 문제가 생긴 듯 하다.

_verify_batch_size 위치에서 ValueError가 발생했다.

에러 메시지를 읽어보니 Batch size가 1보다 커야 하는데 모종의 이유로(?) 딱 배치 사이즈가 1인 것으로 보인다.

 

실제 DataLoader를 보니 데이터셋의 크기는 26,201인데 batch_size=100으로 하여 정확히 1개의 데이터가 남는 것을 알 수 있었다. (batch_size=64일 경우에는 마지막 배치의 크기가 25여서 이러한 에러 메시지는 발생하지 않은 것 같다.)

반응형

해결 방법

(1) DataLoader에서 drop_last=True 사용하기

배치사이즈가 모자라는 데이터들을 학습하지 않고 그대로 버린다.

나의 경우, trainset, validset, testset의 크기가 26201, 8734, 8734인데 (batch_size=100인 경우) 각각 1개, 34개, 34개의 데이터 인스턴스를 버리는 것이다.

그러나 배치 정규화를 사용하는 목적이 각 레이어마다 feature 분포를 재조정하는 것이므로 버려지는 데이터가 좀 아깝다고 생각되어 사용하지 않았다.

 

(2) 다른 batch_size 이용하기

어차피 마지막 배치에 데이터가 1개만 남지 않으면 되므로 그냥 다른 배치사이즈를 이용하였다.

그래도 마지막 배치에 남는 데이터가 지나치게 적지 않게 하였다.

나의 경우 최소한 30개는 남도록 하였다.

TIL

배치 정규화를 사용할 때, 배치 사이즈에 따라 남는 배치 데이터가 1개인지 (혹은 지나치게 적지 않은지) 계산해봐야겠다.

728x90
반응형