{"record":{"id":"02f2cc76af9214eb","repo":"keras-team/keras","slug":"factor-argument-cannot-have-an-upper-bound-less","errorCode":null,"errorMessage":"`factor` argument cannot have an upper bound less than the lower bound. Received: factor={factor}","messagePattern":"`factor` argument cannot have an upper bound less than the lower bound\\. Received: factor=(.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"keras/src/legacy/layers.py","lineNumber":155,"sourceCode":"        return {**base_config, **config}\n\n\n@keras_export(\"keras._legacy.layers.RandomWidth\")\nclass RandomWidth(Layer):\n    \"\"\"DEPRECATED.\"\"\"\n\n    def __init__(self, factor, interpolation=\"bilinear\", seed=None, **kwargs):\n        super().__init__(**kwargs)\n        self.seed_generator = backend.random.SeedGenerator(seed)\n        self.factor = factor\n        if isinstance(factor, (tuple, list)):\n            self.width_lower = factor[0]\n            self.width_upper = factor[1]\n        else:\n            self.width_lower = -factor\n            self.width_upper = factor\n        if self.width_upper < self.width_lower:\n            raise ValueError(\n                \"`factor` argument cannot have an upper bound less than the \"\n                f\"lower bound. Received: factor={factor}\"\n            )\n        if self.width_lower < -1.0 or self.width_upper < -1.0:\n            raise ValueError(\n                \"`factor` argument must have values larger than -1. \"\n                f\"Received: factor={factor}\"\n            )\n        self.interpolation = interpolation\n        self.seed = seed\n\n    def call(self, inputs, training=True):\n        inputs = tf.convert_to_tensor(inputs, dtype=self.compute_dtype)\n\n        def random_width_inputs(inputs):\n            \"\"\"Inputs width-adjusted with random ops.\"\"\"\n            inputs_shape = tf.shape(inputs)\n            img_hd = inputs_shape[-3]","sourceCodeStart":137,"sourceCodeEnd":173,"githubUrl":"https://github.com/keras-team/keras/blob/7a34a03db60bf60042242d6a556fc3be119046a5/keras/src/legacy/layers.py#L137-L173","documentation":"The deprecated RandomWidth layer is the width-domain twin of RandomHeight: `factor` is either a single number or a (lower, upper) tuple, and the constructor rejects any tuple whose upper bound is less than its lower bound (e.g. (0.9, 0.3)) because the layer samples uniformly from [width_lower, width_upper], undefined for an empty interval.","triggerScenarios":"Constructing keras._legacy.layers.RandomWidth(factor=(0.9, 0.3)) or any (upper, lower)-ordered pair; also generated/serialized configs whose bounds are sorted descending.","commonSituations":"Hand-editing augmentation pipelines and swapping bounds; hyperparameter sweeps producing crossed intervals; porting from libraries with (max, min) argument order.","solutions":["Pass (lower, upper) in ascending order, e.g. RandomWidth(factor=(0.2, 0.4))","Sort the pair defensively at construction: factor=tuple(sorted(pair))","Prefer the modern keras.layers.RandomWidth with the same validated contract"],"exampleFix":"# before\nlayer = RandomWidth(factor=(0.4, 0.2))\n# after\nlayer = RandomWidth(factor=(0.2, 0.4))","handlingStrategy":"validation","validationCode":"lo, hi = tuple(factor) if isinstance(factor, (tuple, list)) else (-factor, factor)\nassert lo <= hi, f'factor bounds crossed: {factor}'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Write bounds ascending: (min, max)","When generating sweep configs, sort each bound pair before writing"],"tags":["keras","data-augmentation","argument-validation","legacy","random-width"],"backgroundTag":"invalid-range-bounds","analyzedSha":"7a34a03db60bf60042242d6a556fc3be119046a5","analyzedAt":"2026-08-25T21:25:25.994Z","schemaVersion":2},"datasetVersion":"2026-08-26T02:17:13.382Z"}