Forward propagation as either no-op or dropping random units.
    :param x: The input to the layer
    :param dropout: bool specifying whether to drop units
    :param dropout_dict: dict
        This dictionary is usually not needed.
        In rare cases, generally for research purposes, this dictionary
        makes it possible to run forward propagation with a different
        dropout include probability.
        This dictionary should be passed as a named argument to the MLP
        class, which will then pass it to *all* layers' fprop methods.
        Other layers will just receive this as an ignored kwargs entry.
        Each dropout layer looks up its own name in this dictionary
        to read out its include probability.

def fprop(self, x, dropout=False, dropout_dict=None, **kwargs):
    """
    Forward propagation as either no-op or dropping random units.
    :param x: The input to the layer
    :param dropout: bool specifying whether to drop units
    :param dropout_dict: dict
        This dictionary is usually not needed.
        In rare cases, generally for research purposes, this dictionary
        makes it possible to run forward propagation with a different
        dropout include probability.
        This dictionary should be passed as a named argument to the MLP
        class, which will then pass it to *all* layers' fprop methods.
        Other layers will just receive this as an ignored kwargs entry.
        Each dropout layer looks up its own name in this dictionary
        to read out its include probability.
    """
    include_prob = self.include_prob
    if dropout_dict is not None:
      assert dropout
      if self.name in dropout_dict:
        include_prob = dropout_dict[self.name]
    if dropout:
      return tf.nn.dropout(x, include_prob)
    return x