If we look at documentation:
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

Be carefull to first 3 parameters. If we follow the tutorial:
input size:   32x32x3
After conv1   28x28x6
After pooling 14x14x6
After conv2   10x10x16
After pooling 5x5x16

After Convolutional layers, we have a matrix whose size is 5x5x16 instead 32x32x3. It mean that input of fully connected layers (fc) is a vector whose size is 5x5x16. If we flatten the matrix, of course we have (1655 x 1) matrix.
Since there is no learning in pooling layers. You can use pooling layers in different parts. There is just 1 creation self.pool, but it is used twice.