class_docstr: Performs spectral normalization on the weights of a target layer.
  
  This wrapper controls the Lipschitz constant of the weights of a layer by
  constraining their spectral norm, which can stabilize the training of GANs.
  
  Args:
      layer: A `keras.layers.Layer` instance that
          has either a `kernel` (e.g. `Conv2D`, `Dense`...)
          or an `embeddings` attribute (`Embedding` layer).
      power_iterations: int, the number of iterations during normalization.
      **kwargs: Base wrapper keyword arguments.
  
  Examples:
  
  Wrap `keras.layers.Conv2D`:
  >>> x = np.random.rand(1, 10, 10, 1)
  >>> conv2d = SpectralNormalization(keras.layers.Conv2D(2, 2))
  >>> y = conv2d(x)
  >>> y.shape
  (1, 9, 9, 2)
  
  Wrap `keras.layers.Dense`:
  >>> x = np.random.rand(1, 10, 10, 1)
  >>> dense = SpectralNormalization(keras.layers.Dense(10))
  >>> y = dense(x)
  >>> y.shape
  (1, 10, 10, 10)
  
  Reference:
  
  - [Spectral Normalization for GAN](https://arxiv.org/abs/1802.05957).
code: def build(self, input_shape):
      super().build(input_shape)
      self.input_spec = InputSpec(shape=[None] + list(input_shape[1:]))
  
      if hasattr(self.layer, "kernel"):
          self.kernel = self.layer.kernel
      elif hasattr(self.layer, "embeddings"):
          self.kernel = self.layer.embeddings
      else:
          raise ValueError(
              f"{type(self.layer).__name__} object has no attribute 'kernel' "
              "nor 'embeddings'"
          )
  
      self.kernel_shape = self.kernel.shape
  
      self.vector_u = self.add_weight(
          shape=(1, self.kernel_shape[-1]),
          initializer=initializers.TruncatedNormal(stddev=0.02),
          trainable=False,
          name="vector_u",
          dtype=self.kernel.dtype,
      )
  
file_path: keras/keras/layers/normalization/spectral_normalization.py
imports: from keras import initializers
  from keras import ops
  from keras.api_export import keras_export
  from keras.layers import Wrapper
  from keras.layers.input_spec import InputSpec
  from keras.utils.numerical_utils import normalize
label_desc: Use image node_id 2 for calling the SpectralNormalization obj's underlying member method code with example usage: obj.build(input_shape) without return types