in mobile_cv/arch/fbnet_v2/blur_pool.py [0:0]
def __init__(self, num_channels, kernel_size=4, stride=2, padding_mode="zeros"):
super().__init__()
self.num_channels = num_channels
self.kernel_size = kernel_size
self.stride = stride
self.padding_mode = padding_mode
assert num_channels is not None
assert (
self.stride >= 1
), f"Only positive stride >= 1 is allowed, got: stride={self.stride}"
kernel = _make_2d_blur_kernel(kernel_size)
kernel = kernel.repeat((num_channels, 1, 1, 1))
if kernel_size > 1 and kernel_size % 2 == 0:
# Add extra one pixel padding if kernel_size % 2 == 0
self.uneven_pad = _make_uneven_pad(padding_mode, (kernel_size - 1) // 2)
left_pad = 0
else:
self.uneven_pad = None
left_pad = (kernel_size - 1) // 2
self.conv = nn.Conv2d(
num_channels,
num_channels,
kernel_size=kernel_size,
stride=stride,
padding=left_pad,
padding_mode=padding_mode,
groups=num_channels,
bias=False,
)
assert (
self.conv.weight.shape == kernel.shape
), f"{self.conv.weight.shape} == {kernel.shape}"
del self.conv.weight
self.conv.weight = nn.Parameter(kernel, requires_grad=False)