{"record":{"id":"bb585994352eb803","repo":"keras-team/keras","slug":"received-an-invalid-value-for-units-expected-a","errorCode":null,"errorMessage":"Received an invalid value for `units`, expected a positive integer. Received: units={units}","messagePattern":"Received an invalid value for `units`, expected a positive integer\\. Received: units=(.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"keras/src/layers/core/dense.py","lineNumber":102,"sourceCode":"    def __init__(\n        self,\n        units,\n        activation=None,\n        use_bias=True,\n        kernel_initializer=\"glorot_uniform\",\n        bias_initializer=\"zeros\",\n        kernel_regularizer=None,\n        bias_regularizer=None,\n        activity_regularizer=None,\n        kernel_constraint=None,\n        bias_constraint=None,\n        lora_rank=None,\n        lora_alpha=None,\n        quantization_config=None,\n        **kwargs,\n    ):\n        if not isinstance(units, int) or units <= 0:\n            raise ValueError(\n                \"Received an invalid value for `units`, expected a positive \"\n                f\"integer. Received: units={units}\"\n            )\n\n        super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n        self.units = units\n        self.activation = activations.get(activation)\n        self.use_bias = use_bias\n        self.kernel_initializer = initializers.get(kernel_initializer)\n        self.bias_initializer = initializers.get(bias_initializer)\n        self.kernel_regularizer = regularizers.get(kernel_regularizer)\n        self.bias_regularizer = regularizers.get(bias_regularizer)\n        self.kernel_constraint = constraints.get(kernel_constraint)\n        self.bias_constraint = constraints.get(bias_constraint)\n        self.lora_rank = lora_rank\n        self.lora_alpha = lora_alpha if lora_alpha is not None else lora_rank\n        self.lora_enabled = False\n        self.quantization_config = quantization_config","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/keras-team/keras/blob/7a34a03db60bf60042242d6a556fc3be119046a5/keras/src/layers/core/dense.py#L84-L120","documentation":"Dense requires units to be a positive Python int (strict isinstance check: bools, floats, numpy ints, and strings all fail). Keras 3 hardened this check because the unit count determines the kernel shape; invalid values previously surfaced later as cryptic shape errors.","triggerScenarios":"Calling keras.layers.Dense(units) with units as a float (128.0), np.int64, a string from config, or units <= 0.","commonSituations":"Units read from JSON/YAML config as string/float; hyperparameter sweeps yielding 0; numpy scalars from computations; Keras 2->3 migration where loose types were accepted.","solutions":["Coerce to a positive int before construction: units = int(units), ensure units > 0.","Fix the config source to store a plain positive integer.","Wrap numpy scalars with int() when passing in."],"exampleFix":"# before\nunits = float(cfg['units'])  # 128.0 -> raises\nlayer = keras.layers.Dense(units)\n\n# after\nunits = int(cfg['units'])\nassert units > 0\nlayer = keras.layers.Dense(units)","handlingStrategy":"validation","validationCode":"units = int(cfg['units'])\nassert isinstance(units, int) and units > 0, f'bad units: {units!r}'","typeGuard":"def valid_units(units) -> bool:\n    return isinstance(units, int) and not isinstance(units, bool) and units > 0","tryCatchPattern":null,"preventionTips":["Coerce config values to int at load time","Wrap numpy scalars with int() before passing to Dense"],"tags":["keras","dense","type-validation","units"],"backgroundTag":"invalid-layer-argument-value","analyzedSha":"7a34a03db60bf60042242d6a556fc3be119046a5","analyzedAt":"2026-08-25T21:25:25.994Z","schemaVersion":2},"datasetVersion":"2026-08-26T02:17:13.382Z"}