keras-team/keras · error · ValueError

The argument `kernel_size` cannot contain 0. Received: kerne

Error message

The argument `kernel_size` cannot contain 0. Received: kernel_size={self.kernel_size}.

What it means

Separable convolution kernel_size must not contain 0 in any spatial dimension; a zero-extent filter is invalid. __init__ validates every element of kernel_size.

Source

Thrown at keras/src/layers/convolutional/base_separable_conv.py:148

        self.data_format = self.data_format

        self.input_spec = InputSpec(min_ndim=self.rank + 2)

        if self.depth_multiplier is not None and self.depth_multiplier <= 0:
            raise ValueError(
                "Invalid value for argument `depth_multiplier`. Expected a "
                "strictly positive value. Received "
                f"depth_multiplier={self.depth_multiplier}."
            )

        if self.filters is not None and self.filters <= 0:
            raise ValueError(
                "Invalid value for argument `filters`. Expected a strictly "
                f"positive value. Received filters={self.filters}."
            )

        if not all(self.kernel_size):
            raise ValueError(
                "The argument `kernel_size` cannot contain 0. Received: "
                f"kernel_size={self.kernel_size}."
            )

        if not all(self.strides):
            raise ValueError(
                "The argument `strides` cannot contains 0(s). Received: "
                f"strides={self.strides}"
            )

    def build(self, input_shape):
        if self.data_format == "channels_last":
            channel_axis = -1
            input_channel = input_shape[-1]
        else:
            channel_axis = 1
            input_channel = input_shape[1]
        self.input_spec = InputSpec(

View on GitHub (pinned to 7a34a03db6)

Solutions

  1. Set kernel_size to positive integers matching the layer's rank.
  2. Guard computed sizes: all(k > 0 for k in kernel_size) before construction.
  3. Log/validate model config before building the model.

Example fix

# before
keras.layers.SeparableConv2D(32, kernel_size=(0, 3))

# after
keras.layers.SeparableConv2D(32, kernel_size=(3, 3))
Defensive patterns

Strategy: validation

Validate before calling

ks = kernel_size if isinstance(kernel_size, (tuple, list)) else (kernel_size,)
assert all(k > 0 for k in ks)

Type guard

def valid_kernel_size(kernel_size, rank) -> bool:
    ks = kernel_size if isinstance(kernel_size, (tuple, list)) else (kernel_size,)
    return len(ks) == rank and all(k > 0 for k in ks)

Prevention

When it happens

Trigger: Passing kernel_size with a zero element (e.g. (0,3) to SeparableConv2D), typically from computed kernel sizes or a rank mismatch.

Common situations: Dynamic kernel sizing that yields 0; passing a 2-tuple to SeparableConv1D; config typos.

Related errors


AI-assisted analysis of keras-team/keras@7a34a03db6 (2026-08-25). Data as JSON: /api/errors/3ce9a6e2b3423dd2. Report an issue: GitHub.