keras-team/keras · error · ValueError

The `factor` argument should be a number (or a list of two n

Error message

The `factor` argument should be a number (or a list of two numbers) in the range [0, 1.0]. Received: input_number={input_number}

What it means

Raised by RandomShear's _check_factor_range when a shear factor value falls outside [0.0, 1.0]. Every element of the factor (or the scalar itself) must satisfy 0.0 <= x <= 1.0; shear magnitude is expressed as a fraction, not degrees.

Source

Thrown at keras/src/layers/preprocessing/image_preprocessing/random_shear.py:138

                    + f"Received: {factor_name}={factor}"
                )
            self._check_factor_range(factor[0])
            self._check_factor_range(factor[1])
            lower, upper = sorted(factor)
        elif isinstance(factor, (int, float)):
            self._check_factor_range(factor)
            factor = abs(factor)
            lower, upper = [-factor, factor]
        else:
            raise ValueError(
                self._FACTOR_VALIDATION_ERROR
                + f"Received: {factor_name}={factor}"
            )
        return lower, upper

    def _check_factor_range(self, input_number):
        if input_number > 1.0 or input_number < 0.0:
            raise ValueError(
                self._FACTOR_VALIDATION_ERROR
                + f"Received: input_number={input_number}"
            )

    def get_random_transformation(self, data, training=True, seed=None):
        if not training:
            return None

        if isinstance(data, dict):
            images = data["images"]
        else:
            images = data

        images_shape = self.backend.shape(images)
        if len(images_shape) == 3:
            batch_size = 1
        else:
            batch_size = images_shape[0]

View on GitHub (pinned to 7a34a03db6)

Solutions

  1. Scale the value into [0, 1.0] — for degrees d, use factor=d/360 or the appropriate fraction
  2. Note negatives are not allowed here (unlike RandomTranslation): pass a positive magnitude, e.g. factor=0.2 gives [-0.2, 0.2]

Example fix

// before
layer = keras.layers.RandomShear(factor=25)  // degrees
// after
layer = keras.layers.RandomShear(factor=25/360)
Defensive patterns

Strategy: validation

Validate before calling

assert all(0.0 <= x <= 1.0 for x in (factor if isinstance(factor, (tuple, list)) else [factor])), 'shear factor must be within [0, 1.0]'

Type guard

def in_unit_range(x):
    return isinstance(x, (int, float)) and 0.0 <= x <= 1.0

Try / catch

try:
    layer = keras.layers.RandomShear(factor=factor)
except ValueError:
    factor = min(max(factor if isinstance(factor, (int, float)) else max(factor), 0.0), 1.0)
    layer = keras.layers.RandomShear(factor=factor)

Prevention

When it happens

Trigger: Calling RandomShear(factor=1.5), RandomShear(factor=(-0.2, 0.4)), or any 2-element list where one element is negative or greater than 1.0.

Common situations: Treating factor as degrees (e.g. passing 45 for a 45-degree shear) after migrating from torchvision or old tf.image code; flipping the sign convention used by RandomTranslation/RandomZoom which allow negatives.

Related errors


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