Hello Computer Vision

nn.MaxPooling 에서의 ceil mode 본문

딥러닝/파이토치

nn.MaxPooling 에서의 ceil mode

지웅쓰 2023. 1. 19. 19:32

이번에 SqueezeNet에 대한 모델 코드들을 보는데 풀링을 하는 과정에서 ceil mode = True

이렇게 되어있어 알고 넘어가보려고 한다.

 

일단 공식 문서에 따르면 정확히 이렇게 나와있다.

  • ceil_mode (bool) – when True, will use ceil instead of floor to compute the output shape

이거에 따라 결과로 나오는 output의 모양이 파라미터 값에 따라 달라지는구나? 라고 생각할 수 있다.

ceil --> 이 뜻은 올림을 뜻한다. 따라서 True값을 준다면 올림을 하는 것이고 기본값은 False로 되어있다.


예시를 통해 한번 알아보려고 한다.

input = torch.rand(1, 6, 6)
tensor([[[0.0656, 0.0923, 0.3850, 0.9484, 0.6407, 0.7135],
         [0.3726, 0.6871, 0.5251, 0.7195, 0.1066, 0.8625],
         [0.1475, 0.6591, 0.2096, 0.0127, 0.8851, 0.3977],
         [0.3160, 0.3570, 0.0625, 0.4570, 0.8649, 0.3875],
         [0.5382, 0.0878, 0.5553, 0.7918, 0.1299, 0.9624],
         [0.8061, 0.7137, 0.9099, 0.8074, 0.0526, 0.2649]]])

일단 6x6의 데이터를 준비한다.

maxp2 = nn.MaxPool2d(kernel_size = 3, stride = 2)
output = maxp2(input)
output
tensor([[[0.6871, 0.9484],
         [0.6591, 0.8851]]])

풀링을 하는 과정에서 3x3의 커널, stride 2로 풀링을 해본다면 크기가 정확하게 딱 떨어지지 않고 조금 남는 것을 알 수 있다.  따라서 2x2의 데이터를 얻는다.

maxp3 = nn.MaxPool2d(kernel_size = 3, stride = 2, ceil_mode = True)
output = maxp2(input)
output.shape
torch.Size([1, 3, 3])

그러나 ceil mode를 할 경우 남는 부분 없이 다 올림 처리하기 때문에 3x3을 얻게 되는 것이다.