keras-team/keras · error · ValueError

`output_dim` must be a positive integer. Received: output_di

Error message

`output_dim` must be a positive integer. Received: output_dim={output_dim} (of type {type(output_dim).__name__}).

What it means

keras.layers.Embedding requires output_dim (embedding vector length) to be a Python int strictly greater than 0; bools are rejected explicitly. Floats, numpy ints, 0, negatives, or True all fail this check in __init__ immediately after the input_dim check.

Source

Thrown at keras/src/layers/core/embedding.py:116

        quantization_config=None,
        **kwargs,
    ):
        if (
            not isinstance(input_dim, int)
            or isinstance(input_dim, bool)
            or input_dim <= 0
        ):
            raise ValueError(
                "`input_dim` must be a positive integer. "
                f"Received: input_dim={input_dim} "
                f"(of type {type(input_dim).__name__})."
            )
        if (
            not isinstance(output_dim, int)
            or isinstance(output_dim, bool)
            or output_dim <= 0
        ):
            raise ValueError(
                "`output_dim` must be a positive integer. "
                f"Received: output_dim={output_dim} "
                f"(of type {type(output_dim).__name__})."
            )
        input_length = kwargs.pop("input_length", None)
        if input_length is not None:
            warnings.warn(
                "Argument `input_length` is deprecated. Just remove it."
            )
        super().__init__(**kwargs)
        self.input_dim = input_dim
        self.output_dim = output_dim
        self.embeddings_initializer = initializers.get(embeddings_initializer)
        self.embeddings_regularizer = regularizers.get(embeddings_regularizer)
        self.embeddings_constraint = constraints.get(embeddings_constraint)
        self.mask_zero = mask_zero
        self.supports_masking = mask_zero
        self.autocast = False

View on GitHub (pinned to 7a34a03db6)

Solutions

  1. Pass a plain Python int greater than 0, e.g. Embedding(input_dim=10000, output_dim=128)
  2. Cast config values with int(...) at the call site
  3. Ensure the value is not accidentally a boolean flag

Example fix

# before
layer = keras.layers.Embedding(input_dim=10000, output_dim=float(cfg['dim']))
# after
layer = keras.layers.Embedding(input_dim=10000, output_dim=int(cfg['dim']))
Defensive patterns

Strategy: type-guard

Validate before calling

assert isinstance(output_dim, int) and not isinstance(output_dim, bool) and output_dim > 0

Type guard

def is_positive_int(v):
    return isinstance(v, int) and not isinstance(v, bool) and v > 0

Prevention

When it happens

Trigger: Constructing Embedding with output_dim=0, output_dim=-16, output_dim=128.0, output_dim=np.int32(64), or output_dim=True.

Common situations: Hyperparameters loaded from YAML/JSON configs (deserialized as floats); argparse values not cast to int; deriving output_dim from arithmetic that yields a float.

Related errors


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