class_docstr: Use MLP to fuse different models' features (single-modal and multimodal).
  Specifically, it adapts the features of each model to specified dimensions,
  concatenates the adapted features, and fuses the features through MLP.
docstr: Parameters
  ----------
  *args
      A list of torch.Tensor(s) containing the input mini-batch data. The fusion model doesn't need to
      directly access the mini-batch data since it aims to fuse the individual models'
      output features.
  
  Returns
  -------
  If "loss_weight" is None, it returns dictionary containing the fusion model's logits and
  features. Otherwise, it returns a list of dictionaries collecting all the models' output,
  including the fusion model's.
docstr_tok: ["Parameters","--","--","--","--","--","*","args","A","list","of","torch.Tensor","(","s",")","containing","the","input","mini-batch","data",".","The","fusion","model","does","n't","need","to","directly","access","the","mini-batch","data","since","it","aims","to","fuse","the","individual","models'","output","features",".","Returns","--","--","--","-","If","``","loss_weight","''","is","None",",","it","returns","dictionary","containing","the","fusion","model","'s","logits","and","features",".","Otherwise",",","it","returns","a","list","of","dictionaries","collecting","all","the","models","'","output",",","including","the","fusion","model","'s","."]
code: def forward(
      self,
      *args,
  ):
      """
  
      Parameters
      ----------
      *args
          A list of torch.Tensor(s) containing the input mini-batch data. The fusion model doesn't need to
          directly access the mini-batch data since it aims to fuse the individual models'
          output features.
  
      Returns
      -------
      If "loss_weight" is None, it returns dictionary containing the fusion model's logits and
      features. Otherwise, it returns a list of dictionaries collecting all the models' output,
      including the fusion model's.
      """
      multimodal_features = []
      multimodal_logits = []
      offset = 0
      for per_model, per_adapter in zip(self.model, self.adapter):
          per_model_args = args[
              offset : offset + len(per_model.input_keys)
          ]
          batch = dict(zip(per_model.input_keys, per_model_args))
          per_output = run_model(per_model, batch)
          multimodal_features.append(
              per_adapter(
                  per_output[per_model.prefix][FEATURES].to(
                      per_adapter.weight.dtype
                  )
              )
          )
          multimodal_logits.append(per_output[per_model.prefix][LOGITS])
          offset += len(per_model.input_keys)
  
      features = self.fusion_mlp(torch.cat(multimodal_features, dim=1))
      logits = self.head(features)
  
      return features, logits, multimodal_logits
  
file_path: autogluon/multimodal/src/autogluon/multimodal/models/fusion/fusion_mlp.py
imports: import logging
  from typing import List, Optional
  import torch
  from torch import nn
  from ...constants import AUTOMM, FEATURES, LABEL, LOGITS, WEIGHT
  from ..mlp import MLP
  from ..utils import init_weights, run_model
  from .base import AbstractMultimodalFusionModel
label_desc: Use image node_id 4 for calling the MultimodalFusionMLP obj's underlying member method code with example usage: obj.forward() and returns: features,  logits,  multimodal_logits