What Is padding='same' in PyTorch?

PyTorch supports padding='same' since v1.9. It automatically pads so output_size = input_size (with stride=1). Equivalent to padding = (kernel_size - 1) / 2 for odd kernels.

Using padding='same'

import torch
import torch.nn as nn

# With padding='same' — output matches input spatially
conv = nn.Conv2d(3, 64, kernel_size=3, padding='same')
x = torch.randn(1, 3, 224, 224)
print(conv(x).shape)  # [1, 64, 224, 224] ✓

# Works with any odd kernel size
conv5 = nn.Conv2d(3, 64, kernel_size=5, padding='same')
print(conv5(x).shape)  # [1, 64, 224, 224] ✓

conv7 = nn.Conv2d(3, 64, kernel_size=7, padding='same')
print(conv7(x).shape)  # [1, 64, 224, 224] ✓

Manual Equivalent

For odd kernel sizes with stride=1, the manual padding is:

padding = (kernel_size - 1) // 2

# kernel=3: padding = (3-1)//2 = 1
nn.Conv2d(3, 64, kernel_size=3, padding=1)      # same as padding='same'

# kernel=5: padding = (5-1)//2 = 2
nn.Conv2d(3, 64, kernel_size=5, padding=2)      # same as padding='same'

# kernel=7: padding = (7-1)//2 = 3
nn.Conv2d(3, 64, kernel_size=7, padding=3)      # same as padding='same'

Limitations

# padding='same' does NOT work with stride > 1
conv = nn.Conv2d(3, 64, kernel_size=3, stride=2, padding='same')
# RuntimeError: padding='same' is not supported for strided convolutions

# For strided convolutions, calculate padding manually:
conv = nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1)
# output = floor((224 - 3 + 2) / 2) + 1 = 112

padding='same' vs padding='valid'

Related Questions

Try the Conv2d Calculator