diff --git a/FE b/FE new file mode 100644 index 00000000000..e69de29bb2d diff --git a/keras/src/layers/normalization/batch_normalization.py b/keras/src/layers/normalization/batch_normalization.py index 8b0160344ee..67f12cab956 100644 --- a/keras/src/layers/normalization/batch_normalization.py +++ b/keras/src/layers/normalization/batch_normalization.py @@ -219,6 +219,18 @@ def build(self, input_shape): self.built = True def compute_output_shape(self, input_shape): + if isinstance(self.axis, int): + axes = [self.axis] + else: + axes = self.axis + + for axis in axes: + if axis >= len(input_shape) or axis < -len(input_shape): + raise ValueError( + f"Axis {axis} is out of bounds for " + f"input shape {input_shape}. " + f"Received: axis={self.axis}" + ) return input_shape def call(self, inputs, training=None, mask=None): diff --git a/keras/src/layers/normalization/group_normalization.py b/keras/src/layers/normalization/group_normalization.py index f70fb69f3ed..c547c99a6b9 100644 --- a/keras/src/layers/normalization/group_normalization.py +++ b/keras/src/layers/normalization/group_normalization.py @@ -199,6 +199,18 @@ def _create_broadcast_shape(self, input_shape): return broadcast_shape def compute_output_shape(self, input_shape): + if isinstance(self.axis, int): + axes = [self.axis] + else: + axes = self.axis + + for axis in axes: + if axis >= len(input_shape) or axis < -len(input_shape): + raise ValueError( + f"Axis {axis} is out of bounds for " + f"input shape {input_shape}. " + f"Received: axis={self.axis}" + ) return input_shape def get_config(self): diff --git a/keras/src/layers/normalization/layer_normalization.py b/keras/src/layers/normalization/layer_normalization.py index 73a8956fd8f..6df9fd1df89 100644 --- a/keras/src/layers/normalization/layer_normalization.py +++ b/keras/src/layers/normalization/layer_normalization.py @@ -117,7 +117,7 @@ def __init__( gamma_regularizer=None, beta_constraint=None, gamma_constraint=None, - **kwargs + **kwargs, ): super().__init__(**kwargs) if isinstance(axis, (list, tuple)): @@ -235,6 +235,18 @@ def _broadcast(v): return ops.cast(outputs, input_dtype) def compute_output_shape(self, input_shape): + if isinstance(self.axis, int): + axes = [self.axis] + else: + axes = self.axis + + for axis in axes: + if axis >= len(input_shape) or axis < -len(input_shape): + raise ValueError( + f"Axis {axis} is out of bounds for " + f"input shape {input_shape}. " + f"Received: axis={self.axis}" + ) return input_shape def get_config(self): diff --git a/keras/src/testing/test_case.py b/keras/src/testing/test_case.py index d5a8f7d779f..0d930f46dc4 100644 --- a/keras/src/testing/test_case.py +++ b/keras/src/testing/test_case.py @@ -43,7 +43,7 @@ def assertAllClose(self, x1, x2, atol=1e-6, rtol=1e-6, msg=None): x1 = backend.convert_to_numpy(x1) if not isinstance(x2, np.ndarray): x2 = backend.convert_to_numpy(x2) - np.testing.assert_allclose(x1, x2, atol=atol, rtol=rtol) + np.testing.assert_allclose(x1, x2, atol=atol, rtol=rtol, err_msg=msg) def assertNotAllClose(self, x1, x2, atol=1e-6, rtol=1e-6, msg=None): try: @@ -62,7 +62,7 @@ def assertAlmostEqual(self, x1, x2, decimal=3, msg=None): x1 = backend.convert_to_numpy(x1) if not isinstance(x2, np.ndarray): x2 = backend.convert_to_numpy(x2) - np.testing.assert_almost_equal(x1, x2, decimal=decimal) + np.testing.assert_almost_equal(x1, x2, decimal=decimal, err_msg=msg) def assertAllEqual(self, x1, x2, msg=None): self.assertEqual(len(x1), len(x2), msg=msg)