keras-team/keras · error · ValueError

When setting values directly, `mean` and `variance` must…

Error message

When setting values directly, `mean` and `variance` must have the same shape. Received: mean shape {np.shape(mean)} and variance shape {np.shape(variance)}

What it means

Normalization broadcasts statistics across the non-axis dimensions, so a fixed `mean` and `variance` passed at construction must have identical shapes. This ValueError fires when both are provided but np.shape(mean) differs from np.shape(variance), e.g. one was flattened or has an extra axis.

Solutions

  1. Reshape both to the same shape, typically via .ravel() or reshape to the kept-axis dims
  2. Recompute both statistics from the same dataset pass
  3. Verify: assert np.shape(mean) == np.shape(variance)

Example fix

// before
layer = Normalization(axis=-1, mean=mu, variance=var)  # (768,) vs (1,768)
// after
import numpy as np
layer = Normalization(axis=-1, mean=np.ravel(mu), variance=np.ravel(var))
Defensive patterns

Strategy: validation

Validate before calling

import numpy as np
if np.shape(mean) != np.shape(variance):
    mean, variance = np.ravel(mean), np.ravel(variance)
assert np.shape(mean) == np.shape(variance)

Prevention

When it happens

Trigger: Normalizing axis=-1 with mean of shape (768,) but variance of shape (1,768); statistics exported from different sources or with squeeze/reshape applied inconsistently.

Common situations: Loading channel statistics from separate files (mean.npy, std.npy then squaring); mixing per-feature stats computed at different data versions.

Related errors


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

Appendix: source

Thrown at keras/src/layers/preprocessing/normalization.py:140

        self.axis = axis

        self.input_mean = mean
        self.input_variance = variance
        self.invert = invert
        self.supports_masking = True
        self._build_input_shape = None
        self.mean = None

        # Set `mean` and `variance` if passed.
        if (mean is not None) != (variance is not None):
            raise ValueError(
                "When setting values directly, both `mean` and `variance` "
                f"must be set. Received: mean={mean} and variance={variance}"
            )
        if mean is not None:
            # Verify mean and variance have the same shape.
            if np.shape(mean) != np.shape(variance):
                raise ValueError(
                    "When setting values directly, `mean` and `variance` "
                    "must have the same shape. Received: "
                    f"mean shape {np.shape(mean)} and "
                    f"variance shape {np.shape(variance)}"
                )
            # Verify mean rank <= number of axes.
            if len(np.shape(mean)) > len(self.axis):
                raise ValueError(
                    "The rank of `mean` must be less than or equal to the "
                    f"number of axes ({len(self.axis)}). Received: "
                    f"mean shape {np.shape(mean)} for axis {self.axis}"
                )

    def build(self, input_shape):
        if input_shape is None:
            return

        ndim = len(input_shape)

View on GitHub (pinned to 7a34a03db6)