class_docstr: An ensembler that averages the weights of submodel outputs.
code: def __call__(self, submodels: List[tf.keras.Model]) -> EnsembleModel:
      ensemble = MeanEnsemble(
          submodels, freeze_submodels=self._freeze_submodels
      )
      if self._freeze_submodels:
          for layer in ensemble.layers:
              layer.trainable = False
      # Compile SGD with learning rate set to 0 for no weight updates.
      ensemble.compile(
          loss=self._loss,
          optimizer=tf.keras.optimizers.SGD(0),
          metrics=self._metrics,
      )
      return ensemble
  
imports: import abc
  import random
  from typing import Iterable, Iterator, List
  from adanet.experimental.keras.ensemble_model import EnsembleModel
  from adanet.experimental.keras.ensemble_model import MeanEnsemble
  from adanet.experimental.phases.phase import DatasetProvider
  from adanet.experimental.phases.phase import ModelProvider
  from adanet.experimental.storages.in_memory_storage import InMemoryStorage
  from adanet.experimental.storages.storage import Storage
  from adanet.experimental.work_units.keras_trainer_work_unit import KerasTrainerWorkUnit
  from adanet.experimental.work_units.work_unit import WorkUnit
  import tensorflow.compat.v2
label_desc: Use image node_id 2 for calling the MeanEnsembler obj's underlying member method code with example usage: obj.__call__(submodels) and returns: ensemble