class_docstr: Multiple Feature Spaces Adaptation Network (MFSAN)
  
  Reference: Zhu, Y., Zhuang, F. and Wang, D., 2019, July. Aligning domain-specific distribution and classifier
      for cross-domain classification from multiple sources. In AAAI.
      https://ojs.aaai.org/index.php/AAAI/article/view/4551
  
  Original implementation: https://github.com/easezyc/deep-transfer-learning/tree/master/MUDA/MFSAN
code: def __init__(
      self,
      dataset,
      feature_extractor,
      task_classifier,
      n_classes: int,
      target_domain: str,
      domain_feat_dim: int = 100,
      kernel_mul: float = 2.0,
      kernel_num: int = 5,
      input_dimension: int = 2,
      **base_params,
  ):
      super().__init__(
          dataset,
          feature_extractor,
          task_classifier,
          n_classes,
          target_domain,
          **base_params,
      )
      self.classifiers = dict()
      self.domain_net = dict()
      self.src_domains = []
      for domain_ in dataset.domain_to_idx.keys():
          if domain_ != self.target_domain:
              self.domain_net[domain_] = _Bottleneck(
                  self.feature_dim,
                  domain_feat_dim,
                  input_dimension=input_dimension,
              )
              self.classifiers[domain_] = task_classifier(
                  domain_feat_dim, n_classes
              )
              self.src_domains.append(domain_)
      self.classifiers = nn.ModuleDict(self.classifiers)
      self.domain_net = nn.ModuleDict(self.domain_net)
      self._kernel_mul = kernel_mul
      self._kernel_num = kernel_num
  
imports: import torch
  import torch.nn
  from sklearn.base import BaseEstimator, ClassifierMixin
  from sklearn.metrics.pairwise import pairwise_kernels
  from sklearn.preprocessing import LabelBinarizer
  from torch.linalg import multi_dot
  from torch.nn.functional import one_hot
  import kale.predict.losses
  from kale.embed.image_cnn import _Bottleneck
  from kale.pipeline.domain_adapter import BaseAdaptTrainer
label_desc: Use image node_id 1 to create a new MFSANTrainer object from inherited base classes: BaseMultiSourceTrainer with example: obj = MFSANTrainer(dataset, feature_extractor, task_classifier, n_classes, target_domain, domain_feat_dim, kernel_mul, kernel_num, input_dimension)