Assembles the `MLP` and connects it to the graph.

    Args:
      inputs: A 2D Tensor of size `[batch_size, input_size]`.
      is_training: A bool or tf.Bool Tensor. Indicates whether we are
        currently training. Defaults to `True`.
      dropout_keep_prob: The probability that each element is kept when
        both `use_dropout` and `is_training` are True. Defaults to 0.5.
    Returns:
      A 2D Tensor of size `[batch_size, output_sizes[-1]]`.

def _build(self, inputs, is_training=True, dropout_keep_prob=0.5):
    """Assembles the `MLP` and connects it to the graph.

    Args:
      inputs: A 2D Tensor of size `[batch_size, input_size]`.
      is_training: A bool or tf.Bool Tensor. Indicates whether we are
        currently training. Defaults to `True`.
      dropout_keep_prob: The probability that each element is kept when
        both `use_dropout` and `is_training` are True. Defaults to 0.5.
    Returns:
      A 2D Tensor of size `[batch_size, output_sizes[-1]]`.
    """
    self._input_shape = tuple(inputs.get_shape().as_list())
    net = inputs

    final_index = self._num_layers - 1
    for layer_id in xrange(self._num_layers):
      net = self._layers[layer_id](net)

      if final_index != layer_id or self._activate_final:
        # Only perform dropout whenever we are activating the layer's outputs.
        if self._use_dropout:
          keep_prob = utils.smart_cond(
              is_training, true_fn=lambda: dropout_keep_prob,
              false_fn=lambda: tf.constant(1.0)
          )
          net = tf.nn.dropout(net, keep_prob=keep_prob)
        net = self._activation(net)

    return net