code: def FullyConnected(
          inputs,
          units,
          activation=None,
          use_bias=True,
          kernel_initializer=None,
          bias_initializer=tf.zeros_initializer(),
          kernel_regularizer=None,
          bias_regularizer=None,
          activity_regularizer=None):
      
      if kernel_initializer is None:
          if get_tf_version_tuple() <= (1, 12):
              kernel_initializer = tf.contrib.layers.variance_scaling_initializer(2.0)
          else:
              kernel_initializer = tf.keras.initializers.VarianceScaling(2.0, distribution='untruncated_normal')
  
      inputs = batch_flatten(inputs)
      with rename_get_variable({'kernel': 'W', 'bias': 'b'}):
          layer = tf.layers.Dense(
              units=units,
              activation=activation,
              use_bias=use_bias,
              kernel_initializer=kernel_initializer,
              bias_initializer=bias_initializer,
              kernel_regularizer=kernel_regularizer,
              bias_regularizer=bias_regularizer,
              activity_regularizer=activity_regularizer,
              _reuse=tf.get_variable_scope().reuse)
          ret = layer.apply(inputs, scope=tf.get_variable_scope())
          ret = tf.identity(ret, name='output')
  
      ret.variables = VariableHolder(W=layer.kernel)
      if use_bias:
          ret.variables.b = layer.bias
      return ret
docs: A wrapper around `tf.layers.Dense`.
      One difference to maintain backward-compatibility:
      Default weight initializer is variance_scaling_initializer(2.0).
  
      Variable Names:
  
      * ``W``: weights of shape [in_dim, out_dim]
      * ``b``: bias