code: def actnorm(name, x, logscale_factor=3., reverse=False, init=False,
              trainable=True):
    
    var_arg_scope = arg_scope([get_variable_ddi], trainable=trainable)
    var_scope = tf.variable_scope(name, reuse=tf.AUTO_REUSE)
  
    with var_scope, var_arg_scope:
      if not reverse:
        x = actnorm_center(name + "_center", x, reverse, init=init)
        x, objective = actnorm_scale(
            name + "_scale", x, logscale_factor=logscale_factor,
            reverse=reverse, init=init)
      else:
        x, objective = actnorm_scale(
            name + "_scale", x, logscale_factor=logscale_factor,
            reverse=reverse, init=init)
        x = actnorm_center(name + "_center", x, reverse, init=init)
      return x, objective
docs: x_{ij} = s x x_{ij} + b. Per-channel scaling and bias.
  
    If init is set to True, the scaling and bias are initialized such
    that the mean and variance of the output activations of the first minibatch
    are zero and one respectively.
  
    Args:
      name: variable scope.
      x: input
      logscale_factor: Used in actnorm_scale. Optimizes f(ls*s') instead of f(s)
                       where s' = s / ls. Helps in faster convergence.
      reverse: forward or reverse operation.
      init: Whether or not to do data-dependent initialization.
      trainable:
  
    Returns:
      x: output after adding bias and scaling.
      objective: log(sum(s))