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 gluonnlp.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 warnings
  import math
  from typing import Dict, Callable, NamedTuple, List, Tuple, AnyStr, Union
  import numpy
  import mxnet
  from mxnet.util import is_np_array
label_desc: Use image node_id 1 to create a new Dict object  with example: obj = Dict(fn_dict)