class_docstr: Multi-Layer Perceptron.
  
  Parameters
  ----------
  layers: list, optional, default: [64, 32, 16, 8]
      MLP layers. Note that the first layer is the concatenation of
      user and item embeddings. So layers[0]/2 is the embedding size.
  
  act_fn: str, default: 'relu'
      Name of the activation function used for the MLP layers.
      Supported functions: ['sigmoid', 'tanh', 'elu', 'relu', 'selu, 'relu6', 'leaky_relu']
  
  reg: float, optional, default: 0.
      Regularization (weight_decay).
  
  num_epochs: int, optional, default: 20
      Number of epochs.
  
  batch_size: int, optional, default: 256
      Batch size.
  
  num_neg: int, optional, default: 4
      Number of negative instances to pair with a positive instance.
  
  lr: float, optional, default: 0.001
      Learning rate.
  
  learner: str, optional, default: 'adam'
      Specify an optimizer: adagrad, adam, rmsprop, sgd
  
  backend: str, optional, default: 'tensorflow'
      Backend used for model training: tensorflow, pytorch
      
  early_stopping: {min_delta: float, patience: int}, optional, default: None
      If `None`, no early stopping. Meaning of the arguments:
      
      - `min_delta`: the minimum increase in monitored value on validation set to be considered as improvement,            i.e. an increment of less than min_delta will count as no improvement.
      
      - `patience`: number of epochs with no improvement after which training should be stopped.
  
  name: string, optional, default: 'MLP'
      Name of the recommender model.
  
  trainable: boolean, optional, default: True
      When False, the model is not trained and Cornac assumes that the model is already         pre-trained.
  
  verbose: boolean, optional, default: False
      When True, some running logs are displayed.
  
  seed: int, optional, default: None
      Random seed for parameters initialization.
  
  References
  ----------
  * He, X., Liao, L., Zhang, H., Nie, L., Hu, X., & Chua, T. S. (2017, April). Neural collaborative filtering.     In Proceedings of the 26th international conference on world wide web (pp. 173-182).
code: def _build_graph_tf(self):
      import tensorflow.compat.v1 as tf
      from .backend_tf import mlp, loss_fn, train_fn
  
      self.graph = tf.Graph()
      with self.graph.as_default():
          tf.set_random_seed(self.seed)
  
          self.user_id = tf.placeholder(
              shape=[None], dtype=tf.int32, name="user_id"
          )
          self.item_id = tf.placeholder(
              shape=[None], dtype=tf.int32, name="item_id"
          )
          self.labels = tf.placeholder(
              shape=[None, 1], dtype=tf.float32, name="labels"
          )
  
          self.interaction = mlp(
              uid=self.user_id,
              iid=self.item_id,
              num_users=self.num_users,
              num_items=self.num_items,
              layers=self.layers,
              reg_layers=[self.reg] * len(self.layers),
              act_fn=self.act_fn,
              seed=self.seed,
          )
          logits = tf.layers.dense(
              self.interaction,
              units=1,
              name="logits",
              kernel_initializer=tf.initializers.lecun_uniform(
                  self.seed
              ),
          )
          self.prediction = tf.nn.sigmoid(logits)
  
          self.loss = loss_fn(labels=self.labels, logits=logits)
          self.train_op = train_fn(
              self.loss, learning_rate=self.lr, learner=self.learner
          )
  
          self.initializer = tf.global_variables_initializer()
          self.saver = tf.train.Saver()
  
      self._sess_init_tf()
  
file_path: cornac/cornac/models/ncf/recom_mlp.py
imports: import numpy
  from .recom_ncf_base import NCFBase
label_desc: Use image node_id 2 for calling the MLP obj's underlying member method code with example usage: obj._build_graph_tf() without return types