From 698cc2f1486b5f80be31ce4fdcdc42a3e6b0fc91 Mon Sep 17 00:00:00 2001 From: Sanskar Modi Date: Thu, 12 Sep 2024 01:23:19 +0530 Subject: [PATCH] added validation checks in Group, Layer, Batch Normalization layers (#20246) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added validation checks in Group, Layer, Batch Normalization layers for the compute_output_shape function * Update batch_normalization.py * Update group_normalization.py * Update layer_normalization.py --------- Co-authored-by: François Chollet --- FE | 0 .../layers/normalization/batch_normalization.py | 12 ++++++++++++ .../layers/normalization/group_normalization.py | 12 ++++++++++++ .../layers/normalization/layer_normalization.py | 14 +++++++++++++- 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 FE diff --git a/FE b/FE new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/keras/src/layers/normalization/batch_normalization.py b/keras/src/layers/normalization/batch_normalization.py index 8b0160344eec..67f12cab956a 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 f70fb69f3ed7..c547c99a6b99 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 73a8956fd8ff..6df9fd1df89a 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):