{"record":{"id":"945b77d39d8ce826","repo":"keras-team/keras","slug":"factor-argument-cannot-have-an-upper-bound-lesse","errorCode":null,"errorMessage":"`factor` argument cannot have an upper bound lesser than the lower bound. Received: factor={factor}","messagePattern":"`factor` argument cannot have an upper bound lesser than the lower bound\\. Received: factor=(.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"keras/src/legacy/layers.py","lineNumber":80,"sourceCode":"\n\n@keras_export(\"keras._legacy.layers.RandomHeight\")\nclass RandomHeight(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.height_lower = factor[0]\n            self.height_upper = factor[1]\n        else:\n            self.height_lower = -factor\n            self.height_upper = factor\n\n        if self.height_upper < self.height_lower:\n            raise ValueError(\n                \"`factor` argument cannot have an upper bound lesser than the \"\n                f\"lower bound. Received: factor={factor}\"\n            )\n        if self.height_lower < -1.0 or self.height_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_height_inputs(inputs):\n            \"\"\"Inputs height-adjusted with random ops.\"\"\"\n            inputs_shape = tf.shape(inputs)\n            img_hd = tf.cast(inputs_shape[-3], tf.float32)","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/keras-team/keras/blob/7a34a03db60bf60042242d6a556fc3be119046a5/keras/src/legacy/layers.py#L62-L98","documentation":"The deprecated RandomHeight augmentation layer accepts `factor` either as a single number (interpreted symmetrically as (-factor, factor)) or as a 2-tuple (lower, upper). A tuple whose second element is smaller than the first (e.g. (0.4, 0.2)) makes __init__ raise this ValueError because the layer would sample uniformly from an empty interval.","triggerScenarios":"Constructing keras._legacy.layers.RandomHeight(factor=(0.8, 0.2)) or any (lower, upper) pair with upper < lower — commonly a swapped argument order.","commonSituations":"Swapping lower/upper when hand-writing augmentation configs; YAML sweeps where bounds are generated independently and can cross; porting from APIs whose argument order is (upper, lower).","solutions":["Order the tuple as (lower, upper), e.g. RandomHeight(factor=(0.2, 0.8))","Use the modern keras.layers.RandomHeight, which validates the same documented contract","Assert lower <= upper on augmentation configs at load time"],"exampleFix":"# before\nlayer = RandomHeight(factor=(0.8, 0.2))\n# after\nlayer = RandomHeight(factor=(0.2, 0.8))","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":["Always write augmentation factors as (lower, upper)","Add lower<=upper assertions when configs come from sweeps or user input"],"tags":["keras","data-augmentation","argument-validation","legacy","random-height"],"backgroundTag":"invalid-range-bounds","analyzedSha":"7a34a03db60bf60042242d6a556fc3be119046a5","analyzedAt":"2026-08-25T21:25:25.994Z","schemaVersion":2},"datasetVersion":"2026-08-26T02:17:13.382Z"}