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
- Pass a 2-element tuple/list: Equalization(value_range=(0, 255)) or (0, 1) for float images
- 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
- Centralize a VALUE_RANGES constant (e.g. (0,255) for uint8, (0,1) for float) and reuse it for every augmentation layer
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
- self._VALUE_RANGE_VALIDATION_ERROR + f"Received: value_range
- self._VALUE_RANGE_VALIDATION_ERROR + f"Received: value_range
- `input_dim` must be a positive integer. Received: input_dim=
- `output_dim` must be a positive integer. Received: output_di
- Received an invalid value for argument `units`, expected a p
AI-assisted analysis of keras-team/keras@7a34a03db6 (2026-08-25).
Data as JSON: /api/errors/0eb6e52d0e702879.
Report an issue: GitHub.