keras-team/keras · error · ValueError

`dtype` was passed both positionally and as a keyword…

Error message

`dtype` was passed both positionally and as a keyword argument.

What it means

Layer.add_weight() in Keras 3 rejects calls where dtype is supplied both positionally (the 3rd positional argument) and via the dtype= keyword. Positional args map to (shape, initializer, dtype), so any overlap with the corresponding keyword raises this ValueError.

Solutions

  1. Drop one of the two dtype specifications and pass all arguments as keywords
  2. Audit the layer for other positional/keyword overlaps (shape, initializer) since they raise sibling errors

Example fix

# before
self.add_weight((64, 64), 'zeros', 'float32', dtype='float32')
# after
self.add_weight(shape=(64, 64), initializer='zeros', dtype='float32')
Defensive patterns

Strategy: validation

Validate before calling

# keep add_weight calls keyword-only: layer.add_weight(shape=s, initializer=i, dtype=d)

Prevention

When it happens

Trigger: add_weight(shape, init, 'float32', dtype='float32') — the 3rd positional collides with the dtype keyword. Typical when Keras 2 code that passed dtype positionally is edited to add dtype= for mixed precision.

Common situations: Migrating mixed-precision Keras 2 layers; editing generated add_weight calls; custom layers whose signature changed across Keras versions.

Related errors


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

Appendix: source

Thrown at keras/src/layers/layer.py:605

                    f"Received: add_weight('{shape_arg}', ...). "
                    f"Use: add_weight(shape=..., name='{shape_arg}')."
                )
            if shape is not None:
                raise ValueError(
                    "`shape` was passed both positionally and as "
                    "a keyword argument."
                )
            shape = shape_arg
            if len(args) > 1:
                if initializer is not None:
                    raise ValueError(
                        "`initializer` was passed both positionally and "
                        "as a keyword argument."
                    )
                initializer = args[1]
            if len(args) > 2:
                if dtype is not None:
                    raise ValueError(
                        "`dtype` was passed both positionally and as a "
                        "keyword argument."
                    )
                dtype = args[2]
        if shape is None:
            shape = ()
        if dtype is not None:
            dtype = backend.standardize_dtype(dtype)
        else:
            dtype = self.variable_dtype
        if initializer is None:
            if "float" in dtype:
                initializer = "glorot_uniform"
            else:
                initializer = "zeros"
        initializer = initializers.get(initializer)
        with backend.name_scope(self.name, caller=self):
            variable = backend.Variable(

View on GitHub (pinned to 7a34a03db6)