class_docstr: Group Normalization layer. This layer is a simple alternative to the
  Batch Normalization layer for cases when batch size is small.
  
  Parameters
  ----------
  n_groups : int
      During normalization all the channels will be break down into
      separate groups and mean and variance will be estimated per group.
      This parameter controls number of groups.
  
  gamma : array-like, Tensorfow variable, scalar or Initializer
      Scale. Default initialization methods you can
      find :ref:`here <init-methods>`.
      Defaults to ``Constant(value=1)``.
  
  beta : array-like, Tensorfow variable, scalar or Initializer
      Offset. Default initialization methods you can
      find :ref:`here <init-methods>`.
      Defaults to ``Constant(value=0)``.
  
  epsilon : float
      Epsilon ensures that input rescaling procedure that uses estimated
      variance will never cause division by zero. Defaults to ``1e-5``.
  
  {Identity.name}
  
  Methods
  -------
  {Identity.Methods}
  
  Attributes
  ----------
  {Identity.Attributes}
  
  Examples
  --------
  Convolutional Neural Networks (CNN)
  
  >>> from neupy.layers import *
  >>> network = join(
  ...     Input((28, 28, 1)),
  ...     Convolution((3, 3, 16)) >> GroupNorm(4) >> Relu(),
  ...     Convolution((3, 3, 16)) >> GroupNorm(4) >> Relu(),
  ...     Reshape(),
  ...     Softmax(10),
  ... )
  
  References
  ----------
  .. [1] Group Normalization, Yuxin Wu, Kaiming He,
         https://arxiv.org/pdf/1803.08494.pdf
class_docstr_tok: ["Group","Normalization","layer",".","This","layer","is","a","simple","alternative","to","the","Batch","Normalization","layer","for","cases","when","batch","size","is","small",".","Parameters","--","--","--","--","--","n_groups",":","int","During","normalization","all","the","channels","will","be","break","down","into","separate","groups","and","mean","and","variance","will","be","estimated","per","group",".","This","parameter","controls","number","of","groups",".","gamma",":","array-like",",","Tensorfow","variable",",","scalar","or","Initializer","Scale",".","Default","initialization","methods","you","can","find",":","ref",":","`","here","<","init-methods",">","`",".","Defaults","to","``","Constant","(","value=1",")","``",".","beta",":","array-like",",","Tensorfow","variable",",","scalar","or","Initializer","Offset",".","Default","initialization","methods","you","can","find",":","ref",":","`","here","<","init-methods",">","`",".","Defaults","to","``","Constant","(","value=0",")","``",".","epsilon",":","float","Epsilon","ensures","that","input","rescaling","procedure","that","uses","estimated","variance","will","never","cause","division","by","zero",".","Defaults","to","``","1e-5","``",".","{","Identity.name","}","Methods","--","--","--","-","{","Identity.Methods","}","Attributes","--","--","--","--","--","{","Identity.Attributes","}","Examples","--","--","--","--","Convolutional","Neural","Networks","(","CNN",")",">",">",">","from","neupy.layers","import","*",">",">",">","network","=","join","(","...","Input","(","(","28",",","28",",","1",")",")",",","...","Convolution","(","(","3",",","3",",","16",")",")",">",">","GroupNorm","(","4",")",">",">","Relu","(",")",",","...","Convolution","(","(","3",",","3",",","16",")",")",">",">","GroupNorm","(","4",")",">",">","Relu","(",")",",","...","Reshape","(",")",",","...","Softmax","(","10",")",",","...",")","References","--","--","--","--","--","..","[","1","]","Group","Normalization",",","Yuxin","Wu",",","Kaiming","He",",","https",":","\/\/arxiv.org\/pdf\/1803.08494.pdf"]
code: def get_output_shape(self, input_shape):
      input_shape = tf.TensorShape(input_shape)
  
      if input_shape and input_shape.ndims != 4:
          raise LayerConnectionError(
              "Group normalization layer expects 4 dimensional input, "
              "got {} instead. Input shape: {}, Layer: {}"
              "".format(input_shape.ndims, input_shape, self)
          )
  
      n_channels = input_shape[3]
  
      if n_channels.value and n_channels % self.n_groups != 0:
          raise LayerConnectionError(
              "Cannot divide {} input channels into {} groups. "
              "Input shape: {}, Layer: {}".format(
                  n_channels, self.n_groups, input_shape, self
              )
          )
  
      return super(GroupNorm, self).get_output_shape(input_shape)
  
imports: import tensorflow
  from neupy.core.properties import ProperFractionProperty, ParameterProperty, TypedListProperty, NumberProperty, IntProperty
  from neupy.utils import asfloat
  from neupy.exceptions import WeightInitializationError, LayerConnectionError
  from .base import Identity
label_desc: Use image node_id 3 for calling the GroupNorm obj's underlying member method code with example usage: obj.get_output_shape(input_shape) and returns: super