{"record":{"id":"0eb6e52d0e702879","repo":"keras-team/keras","slug":"self-value-range-validation-error-f-received-v","errorCode":null,"errorMessage":"self._VALUE_RANGE_VALIDATION_ERROR + f\"Received: value_range={value_range}\"","messagePattern":"self\\._VALUE_RANGE_VALIDATION_ERROR \\+ f\"Received: value_range=(.+?)\"","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"keras/src/layers/preprocessing/image_preprocessing/equalization.py","lineNumber":76,"sourceCode":"    custom_equalizer = keras.layers.Equalization(\n        value_range=[0.0, 1.0],  # for normalized images\n        bins=128  # fewer bins for more subtle equalization\n    )\n    custom_equalized = custom_equalizer(normalized_image)\n    ```\n    \"\"\"\n\n    def __init__(\n        self, value_range=(0, 255), bins=256, data_format=None, **kwargs\n    ):\n        super().__init__(**kwargs)\n        self.bins = bins\n        self._set_value_range(value_range)\n        self.data_format = backend.standardize_data_format(data_format)\n\n    def _set_value_range(self, value_range):\n        if not isinstance(value_range, (tuple, list)):\n            raise ValueError(\n                self._VALUE_RANGE_VALIDATION_ERROR\n                + f\"Received: value_range={value_range}\"\n            )\n        if len(value_range) != 2:\n            raise ValueError(\n                self._VALUE_RANGE_VALIDATION_ERROR\n                + f\"Received: value_range={value_range}\"\n            )\n        self.value_range = sorted(value_range)\n\n    def _custom_histogram_fixed_width(self, values, value_range, nbins):\n        values = self.backend.cast(values, \"float32\")\n        value_min, value_max = value_range\n        value_min = self.backend.cast(value_min, \"float32\")\n        value_max = self.backend.cast(value_max, \"float32\")\n\n        scaled = (values - value_min) * (nbins - 1) / (value_max - value_min)\n        indices = self.backend.cast(scaled, \"int32\")","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/keras-team/keras/blob/7a34a03db60bf60042242d6a556fc3be119046a5/keras/src/layers/preprocessing/image_preprocessing/equalization.py#L58-L94","documentation":"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.","triggerScenarios":"layers.Equalization(value_range=255), Equalization(value_range=0), or Equalization(value_range='0-255').","commonSituations":"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).","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"],"exampleFix":"# before\nlayer = keras.layers.Equalization(value_range=255)\n# after\nlayer = keras.layers.Equalization(value_range=(0, 255))","handlingStrategy":"type-guard","validationCode":"if not isinstance(value_range, (tuple, list)) or len(value_range) != 2:\n    raise ValueError('value_range must be a 2-element tuple/list')","typeGuard":"def is_valid_value_range(v):\n    return isinstance(v, (tuple, list)) and len(v) == 2 and all(isinstance(x, (int, float)) for x in v)","tryCatchPattern":null,"preventionTips":["Centralize a VALUE_RANGES constant (e.g. (0,255) for uint8, (0,1) for float) and reuse it for every augmentation layer"],"tags":["keras","equalization","value-range","constructor-validation"],"backgroundTag":"invalid-constructor-argument","analyzedSha":"7a34a03db60bf60042242d6a556fc3be119046a5","analyzedAt":"2026-08-25T21:25:25.994Z","schemaVersion":2},"datasetVersion":"2026-08-26T02:17:13.382Z"}