What happens when MaxPool rounds a tensor?

I was looking at the tensor shape of the following cnn:

    def __init__(self):
        super().__init__() # just run the init of parent class (nn.Module)
        
        self.conv1 = nn.Conv2d(1, 32, 5)
        self.conv2 = nn.Conv2d(32, 64, 5)
        self.conv3 = nn.Conv2d(64, 128, 5)

    def convs(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = F.max_pool2d(x, (2, 2))
       
        x = self.conv2(x)
        x = F.relu(x)
        # torch.Size([64, 19, 19])
        x = F.max_pool2d(x, (2, 2)) # torch.Size([64, 9, 9])
      
        x = self.conv3(x)
        x = F.relu(x)
        #torch.Size([128, 5, 5])
        x = F.max_pool2d(x, (2, 2)) # torch.Size([128, 2, 2])

I noticed that in the conv2 maxpooling we’re diving 19 by 2 = 8.5 ~ 9
but in conv3 we’re diving 5 by 2 = 2.5 ~ 2

In the first scenario we round to the upper bound and in the second case the lower bound. Can anyone explain what happenng?

As explained in the docs, the output shape will be calculated by a final floor operation.
Since 19/2 = 9.5, the output shape of 9 is thus expected. :wink:

Thanks Patrick! missed that one.