@staticmethod
def fully_connected(in_tensor, layer_name, out_chan, trainable=True):
    with tf.variable_scope(layer_name):
        in_size = in_tensor.get_shape().as_list()
        assert (len(in_size) == 2), 'Input to a fully connected layer must be a vector.'
        weights_shape = [in_size[1], out_chan]
        weights = tf.get_variable('weights', weights_shape, tf.float32, tf.contrib.layers.xavier_initializer(), trainable=trainable)
        weights = tf.check_numerics(weights, ('weights: %s' % layer_name))
        biases = tf.get_variable('biases', [out_chan], tf.float32, tf.constant_initializer(0.0001), trainable=trainable)
        biases = tf.check_numerics(biases, ('biases: %s' % layer_name))
        out_tensor = (tf.matmul(in_tensor, weights) + biases)
        return out_tensor
@staticmethod
def fully_connected(in_tensor, layer_name, out_chan, trainable=True):
    with tf.variable_scope(layer_name):
        in_size = in_tensor.get_shape().as_list()
        assert (len(in_size) == 2), 'Input to a fully connected layer must be a vector.'
        weights_shape = [in_size[1], out_chan]
        weights = tf.get_variable('weights', weights_shape, tf.float32, tf.contrib.layers.xavier_initializer(), trainable=trainable)
        weights = tf.check_numerics(weights, ('weights: %s' % layer_name))
        biases = tf.get_variable('biases', [out_chan], tf.float32, tf.constant_initializer(0.0001), trainable=trainable)
        biases = tf.check_numerics(biases, ('biases: %s' % layer_name))
        out_tensor = (tf.matmul(in_tensor, weights) + biases)
        return out_tensor