{"record":{"id":"99ebb6bf02c39db0","repo":"keras-team/keras","slug":"name-must-be-an-odd-number-received-name-fa","errorCode":null,"errorMessage":"{name} must be an odd number. Received: {name}={factor}","messagePattern":"(.+?) must be an odd number\\. Received: (.+?)=(.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"keras/src/layers/preprocessing/image_preprocessing/random_gaussian_blur.py","lineNumber":79,"sourceCode":"        self._set_factor(factor)\n        self.kernel_size = self._set_kernel_size(kernel_size, \"kernel_size\")\n        self.sigma = self._set_factor_by_name(sigma, \"sigma\")\n        self.value_range = value_range\n        self.seed = seed\n        self.generator = SeedGenerator(seed)\n\n    def _set_kernel_size(self, factor, name):\n        error_msg = f\"{name} must be an odd number. Received: {name}={factor}\"\n        if isinstance(factor, (tuple, list)):\n            if len(factor) != 2:\n                error_msg = (\n                    f\"The `{name}` argument should be a number \"\n                    \"(or a list of two numbers) \"\n                    f\"Received: {name}={factor}\"\n                )\n                raise ValueError(error_msg)\n            if (factor[0] % 2 == 0) or (factor[1] % 2 == 0):\n                raise ValueError(error_msg)\n            lower, upper = factor\n        elif isinstance(factor, (int, float)):\n            if factor % 2 == 0:\n                raise ValueError(error_msg)\n            lower, upper = factor, factor\n        else:\n            raise ValueError(error_msg)\n\n        return lower, upper\n\n    def _set_factor_by_name(self, factor, name):\n        error_msg = (\n            f\"The `{name}` argument should be a number \"\n            \"(or a list of two numbers) \"\n            \"in the range \"\n            f\"[{self._FACTOR_BOUNDS[0]}, {self._FACTOR_BOUNDS[1]}]. \"\n            f\"Received: factor={factor}\"\n        )","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/keras-team/keras/blob/7a34a03db60bf60042242d6a556fc3be119046a5/keras/src/layers/preprocessing/image_preprocessing/random_gaussian_blur.py#L61-L97","documentation":"RandomGaussianBlur._set_kernel_size requires every kernel-size entry in a 2-element sequence to be an odd integer, because Gaussian blur kernels are symmetric around a center pixel. If either factor[0] or factor[1] is even, this ValueError is raised at construction.","triggerScenarios":"kernel_size=[4, 4], kernel_size=[2, 5], or kernel_size=[6, 3] passed to layers.RandomGaussianBlur().","commonSituations":"Doubling a kernel size during hyperparameter sweeps (3 -> 6) and landing on an even number; copying even sizes from conv-layer configs where even kernels are legal.","solutions":["Round each entry up to the nearest odd number, e.g. [5, 5] instead of [4, 4]","Use odd sizes when parameterizing sweeps: size = 2 * k + 1","Validate with a quick check before constructing: all(v % 2 == 1 for v in kernel_size)"],"exampleFix":"# before\nlayers.RandomGaussianBlur(kernel_size=[4, 4])\n# after\nlayers.RandomGaussianBlur(kernel_size=[5, 5])","handlingStrategy":"validation","validationCode":"ks = [5, 5]\nassert all(k % 2 == 1 for k in ks), \"kernel sizes must be odd\"","typeGuard":"def all_odd_pair(v) -> bool:\n    return isinstance(v, (tuple, list)) and len(v) == 2 and all(x % 2 == 1 for x in v)","tryCatchPattern":"try:\n    layer = RandomGaussianBlur(kernel_size=ks)\nexcept ValueError:\n    layer = RandomGaussianBlur(kernel_size=[k + (k % 2 == 0) for k in ks])","preventionTips":["Generate sweep sizes as 2*k+1","Round even sizes up before constructing the layer"],"tags":["keras","preprocessing","argument-validation","kernel-size"],"backgroundTag":"odd-kernel-size-required","analyzedSha":"7a34a03db60bf60042242d6a556fc3be119046a5","analyzedAt":"2026-08-25T21:25:25.994Z","schemaVersion":2},"datasetVersion":"2026-08-26T02:17:13.382Z"}