class_docstr: Performs weight normalization.
  
  This wrapper reparameterizes a layer by decoupling the weight's
  magnitude and direction.
  This speeds up convergence by improving the
  conditioning of the optimization problem.
  
  See [Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks](https://arxiv.org/abs/1602.07868).
  
  Wrap `tf.keras.layers.Conv2D`:
  
  >>> x = np.random.rand(1, 10, 10, 1)
  >>> conv2d = WeightNormalization(tf.keras.layers.Conv2D(2, 2), data_init=False)
  >>> y = conv2d(x)
  >>> y.shape
  TensorShape([1, 9, 9, 2])
  
  Wrap `tf.keras.layers.Dense`:
  
  >>> x = np.random.rand(1, 10, 10, 1)
  >>> dense = WeightNormalization(tf.keras.layers.Dense(10), data_init=False)
  >>> y = dense(x)
  >>> y.shape
  TensorShape([1, 10, 10, 10])
  
  Args:
    layer: A `tf.keras.layers.Layer` instance.
    data_init: If `True` use data dependent variable initialization.
  Raises:
    ValueError: If not initialized with a `Layer` instance.
    ValueError: If `Layer` does not contain a `kernel` of weights.
    NotImplementedError: If `data_init` is True and running graph execution.
code: def compute_output_shape(self, input_shape):
      return tf.TensorShape(
          self.layer.compute_output_shape(input_shape).as_list()
      )
  
file_path: addons/tensorflow_addons/layers/wrappers.py
imports: import logging
  import tensorflow
  from typeguard import typechecked
label_desc: Use image node_id 4 for calling the WeightNormalization obj's underlying member method code with example usage: obj.compute_output_shape(input_shape) and returns: tf