class_docstr: Adds logging to MultiOptimizer to show which params are trained.
code: def log(self, inputs):
      for i, traversal in enumerate(self.traversals):
          params = _get_params_dict(inputs)
          flat_dict = traverse_util.flatten_dict(params)
          for key, value in _sorted_items(flat_dict):
              path = "/" + "/".join(key)
              if traversal._filter_fn(
                  path, value
              ):  # pylint: disable=protected-access
                  logging.info(
                      "ParamTraversalLogger (opt %d): %s, %s",
                      i,
                      value.shape,
                      path,
                  )
  
imports: import copy
  import json
  import os
  from typing import Any, Dict, Optional, Set
  from absl import logging
  from flax import core
  from flax import optim
  from flax import traverse_util
  import jax
  from jax.example_libraries import optimizers
  import jax.numpy
  import numpy
  import PIL
  import PIL.ImageDraw
  import PIL.ImageFont
  from scenic.common_lib import image_utils
  from scenic.dataset_lib.coco_dataset import coco_eval
  from scenic.model_lib.base_models import box_utils
  from scenic.train_lib_deprecated import optimizers
  from scenic.train_lib_deprecated import train_utils
  import scipy.special
  import tensorflow
label_desc: Use image node_id 2 for calling the MultiOptimizerWithLogging obj's underlying member method code with example usage: obj.log(inputs) without return types