딥러닝/파이토치
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을 얻게 되는 것이다.