class_docstr: Torch ModuleDict wrapper that permits keys with any name.
  
  Torch's ModuleDict implementation doesn't allow certain keys to be used if they conflict with existing class
  attributes, e.g.
  
  > torch.nn.ModuleDict({'type': torch.nn.Module()})  # Raises KeyError.
  
  This class is a simple wrapper around torch's ModuleDict that mitigates possible conflicts by using a key-suffixing
  protocol.
  
  This is also tracked in Pytorch: https://github.com/pytorch/pytorch/issues/71203.
class_docstr_tok: ["Torch","ModuleDict","wrapper","that","permits","keys","with","any","name",".","Torch","'s","ModuleDict","implementation","does","n't","allow","certain","keys","to","be","used","if","they","conflict","with","existing","class","attributes",",","e.g",".",">","torch.nn.ModuleDict","(","{","'type","'",":","torch.nn.Module","(",")","}",")","#","Raises","KeyError",".","This","class","is","a","simple","wrapper","around","torch","'s","ModuleDict","that","mitigates","possible","conflicts","by","using","a","key-suffixing","protocol",".","This","is","also","tracked","in","Pytorch",":","https",":","\/\/github.com\/pytorch\/pytorch\/issues\/71203","."]
code: def set(self, key: str, module: torch.nn.Module) -> None:
      module_dict_key_name = get_module_dict_key_from_name(key)
      self.internal_key_to_original_name_map[module_dict_key_name] = key
      self.module_dict[module_dict_key_name] = module
  
imports: import re
  from typing import Dict, List, Optional, Tuple, Union
  import numpy
  import torch
  from ludwig.constants import NAME, PREPROCESSING, SEQUENCE, TEXT, TIMESERIES, TYPE
  from ludwig.utils.data_utils import hash_dict
  from ludwig.utils.strings_utils import get_tokenizer_from_registry, UNKNOWN_SYMBOL
label_desc: Use image node_id 3 for calling the LudwigFeatureDict obj's underlying member method code with example usage: obj.set(key, module) without return types