':param input_shape: Shape of the input data.
:param output_dim: Dimension of output.
:param hidden_sizes: Number of hidden units of each layer of the mean network.
:param hidden_nonlinearity: Non-linearity used for each layer of the mean network.
:param optimizer: Optimizer for minimizing the negative log-likelihood.'

def __init__(self, name, input_shape, output_dim, network=None, hidden_sizes=(32, 32), hidden_nonlinearity=tf.nn.tanh, output_nonlinearity=None, optimizer=None, normalize_inputs=True):

    Serializable.quick_init(self, locals())
    with tf.variable_scope(name):
        if (optimizer is None):
            optimizer = LbfgsOptimizer(name='optimizer')
        self.output_dim = output_dim
        self.optimizer = optimizer
        if (network is None):
            network = MLP(input_shape=input_shape, output_dim=output_dim, hidden_sizes=hidden_sizes, hidden_nonlinearity=hidden_nonlinearity, output_nonlinearity=output_nonlinearity, name='network')
        l_out = network.output_layer
        LayersPowered.__init__(self, [l_out])
        xs_var = network.input_layer.input_var
        ys_var = tf.placeholder(dtype=tf.float32, shape=[None, output_dim], name='ys')
        x_mean_var = tf.get_variable(name='x_mean', shape=((1,) + input_shape), initializer=tf.constant_initializer(0.0, dtype=tf.float32))
        x_std_var = tf.get_variable(name='x_std', shape=((1,) + input_shape), initializer=tf.constant_initializer(1.0, dtype=tf.float32))
        normalized_xs_var = ((xs_var - x_mean_var) / x_std_var)
        fit_ys_var = L.get_output(l_out, {network.input_layer: normalized_xs_var})
        loss = (- tf.reduce_mean(tf.square((fit_ys_var - ys_var))))
        self.f_predict = tensor_utils.compile_function([xs_var], fit_ys_var)
        optimizer_args = dict(loss=loss, target=self, network_outputs=[fit_ys_var])
        optimizer_args['inputs'] = [xs_var, ys_var]
        self.optimizer.update_opt(**optimizer_args)
        self.name = name
        self.l_out = l_out
        self.normalize_inputs = normalize_inputs
        self.x_mean_var = x_mean_var
        self.x_std_var = x_std_var
