class_docstr: Wrap multiple batchify functions together and apply it to merge inputs from a dict.
  The generated batch samples are stored as a dict with the same keywords.
  Each data sample should be a dict and the fn corresponds to `key` will be applied on the
  input with the keyword `key`.
  For example, each data sample is {'data': nd_data, 'label': nd_label}.
  You can merge the data and labels using
  `Dict({'data': DataBatchify, 'label': LabelBatchify})` to batchify the nd_data and nd_label.
  Parameters
  ----------
  fn_dict
      A dictionary that contains the key-->batchify function mapping.
  Examples
  --------
  >>> from codel.data.batchify import Dict, Pad, Stack
  >>> a = {'data': [1, 2, 3, 4], 'label': 0}
  >>> b = {'data': [5, 7], 'label': 1}
  >>> c = {'data': [1, 2, 3, 4, 5, 6, 7], 'label': 0}
  >>> batchify_fn = Dict({'data': Pad(), 'label': Stack()})
  >>> sample = batchify_fn([a, b, c])
  >>> sample['data']
  <BLANKLINE>
  [[1. 2. 3. 4. 0. 0. 0.]
   [5. 7. 0. 0. 0. 0. 0.]
   [1. 2. 3. 4. 5. 6. 7.]]
  <NDArray 3x7 @cpu_shared(0)>
  >>> sample['label']
  <BLANKLINE>
  [0 1 0]
  <NDArray 3 @cpu_shared(0)>
code: def __init__(self, fn_dict: t_Dict[AnyStr, t_Callable]):
      self._fn_dict = fn_dict
      if not isinstance(fn_dict, dict):
          raise ValueError(
              "Input must be a dictionary! type of input = {}".format(
                  type(fn_dict)
              )
          )
      for fn in fn_dict.values():
          if not hasattr(fn, "__call__"):
              raise ValueError(
                  "Elements of the dictionary must be callable!"
              )
      self._fn_dict = fn_dict
  
imports: import math
  from typing import AnyStr
  from typing import Callable
  from typing import Dict
  from typing import List
  from typing import NamedTuple
  from typing import Tuple
  from typing import Union
  import numpy
  import torch
  from ..utils import to_torch_dtype
label_desc: Use image node_id 1 to create a new Dict object  with example: obj = Dict(fn_dict)