def group_norm(x, filters=None, num_groups=8, epsilon=1e-5):
  """Group normalization as in https://arxiv.org/abs/1803.08494."""
  x_shape = shape_list(x)
  if filters is None:
    filters = x_shape[-1]
  assert len(x_shape) == 4
  assert filters % num_groups == 0
  # Prepare variables.
  scale = tf.get_variable(
      "group_norm_scale", [filters], initializer=tf.ones_initializer())
  bias = tf.get_variable(
      "group_norm_bias", [filters], initializer=tf.zeros_initializer())
  epsilon, scale, bias = [cast_like(t, x) for t in [epsilon, scale, bias]]
  # Reshape and compute group norm.
  x = tf.reshape(x, x_shape[:-1] + [num_groups, filters // num_groups])
  # Calculate mean and variance on heights, width, channels (not groups).
  mean, variance = tf.nn.moments(x, [1, 2, 4], keep_dims=True)
  norm_x = (x - mean) * tf.rsqrt(variance + epsilon)
  return tf.reshape(norm_x, x_shape) * scale + bias
def group_norm ( x , filters = None , num_groups = 8 , epsilon = 1e-5 ) : x_shape = shape_list ( x ) if filters is None : filters = x_shape [ - 1 ] assert len ( x_shape ) == 4 assert filters % num_groups == 0 scale = tf . get_variable ( "group_norm_scale" , [ filters ] , initializer = tf . ones_initializer ( ) ) bias = tf . get_variable ( "group_norm_bias" , [ filters ] , initializer = tf . zeros_initializer ( ) ) epsilon , scale , bias = [ cast_like ( t , x ) for t in [ epsilon , scale , bias ] ] x = tf . reshape ( x , x_shape [ : - 1 ] + [ num_groups , filters // num_groups ] ) mean , variance = tf . nn . moments ( x , [ 1 , 2 , 4 ] , keep_dims = True ) norm_x = ( x - mean ) * tf . rsqrt ( variance + epsilon ) return tf . reshape ( norm_x , x_shape ) * scale + bias
Group normalization as in https://arxiv.org/abs/1803.08494.