keras-team/keras · error · ValueError

self._VALUE_RANGE_VALIDATION_ERROR + f"Received: value_range

Error message

self._VALUE_RANGE_VALIDATION_ERROR + f"Received: value_range={value_range}"

What it means

Equalization's constructor validates value_range: it must be a tuple or list of exactly two numbers [low, high] giving the pixel intensity range of the input (e.g. (0, 255)). Passing an int, float, None, or string raises this ValueError from _set_value_range.

Source

Thrown at keras/src/layers/preprocessing/image_preprocessing/equalization.py:76

    custom_equalizer = keras.layers.Equalization(
        value_range=[0.0, 1.0],  # for normalized images
        bins=128  # fewer bins for more subtle equalization
    )
    custom_equalized = custom_equalizer(normalized_image)
    ```
    """

    def __init__(
        self, value_range=(0, 255), bins=256, data_format=None, **kwargs
    ):
        super().__init__(**kwargs)
        self.bins = bins
        self._set_value_range(value_range)
        self.data_format = backend.standardize_data_format(data_format)

    def _set_value_range(self, value_range):
        if not isinstance(value_range, (tuple, list)):
            raise ValueError(
                self._VALUE_RANGE_VALIDATION_ERROR
                + f"Received: value_range={value_range}"
            )
        if len(value_range) != 2:
            raise ValueError(
                self._VALUE_RANGE_VALIDATION_ERROR
                + f"Received: value_range={value_range}"
            )
        self.value_range = sorted(value_range)

    def _custom_histogram_fixed_width(self, values, value_range, nbins):
        values = self.backend.cast(values, "float32")
        value_min, value_max = value_range
        value_min = self.backend.cast(value_min, "float32")
        value_max = self.backend.cast(value_max, "float32")

        scaled = (values - value_min) * (nbins - 1) / (value_max - value_min)
        indices = self.backend.cast(scaled, "int32")

View on GitHub (pinned to 7a34a03db6)

Solutions

  1. Pass a 2-element tuple/list: Equalization(value_range=(0, 255)) or (0, 1) for float images
  2. Match the range to your actual dtype/rescaling — mismatched (not just invalid) ranges distort equalization

Example fix

# before
layer = keras.layers.Equalization(value_range=255)
# after
layer = keras.layers.Equalization(value_range=(0, 255))
Defensive patterns

Strategy: type-guard

Validate before calling

if not isinstance(value_range, (tuple, list)) or len(value_range) != 2:
    raise ValueError('value_range must be a 2-element tuple/list')

Type guard

def is_valid_value_range(v):
    return isinstance(v, (tuple, list)) and len(v) == 2 and all(isinstance(x, (int, float)) for x in v)

Prevention

When it happens

Trigger: layers.Equalization(value_range=255), Equalization(value_range=0), or Equalization(value_range='0-255').

Common situations: Assuming value_range is a single max value like other APIs; migrating code from torchvision-style transforms where ranges are implicit; forgetting that float images in [0,1] still need value_range=(0, 1).

Related errors


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