class_docstr: There are the steps how the TF2Loader loads and converts the TF2 model
  1. Get the concrete functions from the Keras model (only 1 concrete function is supported now)
  2. Get the tensorflow graphdef from the concrete function by doing
     (a) calling tensorflow's convert_variables_to_constants_v2 API to freeze variables into constants
     (b) run grappler optimizations on the graphdef ("constfold", "dependency", "debug_stripper")
  3. Extract sub graph based on "outputs"
  4. Construct tfssa IR from graphdef
  5. Run tfssa graph passes
  6. Convert tfssa to program by TF2Converter
class_docstr_tok: ["There","are","the","steps","how","the","TF2Loader","loads","and","converts","the","TF2","model","1",".","Get","the","concrete","functions","from","the","Keras","model","(","only","1","concrete","function","is","supported","now",")","2",".","Get","the","tensorflow","graphdef","from","the","concrete","function","by","doing","(","a",")","calling","tensorflow","'s","convert_variables_to_constants_v2","API","to","freeze","variables","into","constants","(","b",")","run","grappler","optimizations","on","the","graphdef","(","``","constfold","''",",","``","dependency","''",",","``","debug_stripper","''",")","3",".","Extract","sub","graph","based","on","``","outputs","''","4",".","Construct","tfssa","IR","from","graphdef","5",".","Run","tfssa","graph","passes","6",".","Convert","tfssa","to","program","by","TF2Converter"]
docstr: Loads a tf.Graph and transform it into dictionary of ParsedTFNodes.
  Potentially contains multiple functions, in such case, recursively
  resolve functions (sub-graphs).
  
  Parameters
  ----------
  graph: tf.Graph
      TensorFlow graph.
  fn_name: str, optional, defaults to 'main'
      Function name of the graph.
  sg_input_shapes: dict(str: list)
      Dictionary of name and input shapes for functions / sub-graphs.
  
  Returns
  -------
  dict(str: dict(str: ParsedTFNode))
      Dictionary of function name and dictionary of node name and
      ParsedTFNode object.
docstr_tok: ["Loads","a","tf.Graph","and","transform","it","into","dictionary","of","ParsedTFNodes",".","Potentially","contains","multiple","functions",",","in","such","case",",","recursively","resolve","functions","(","sub-graphs",")",".","Parameters","--","--","--","--","--","graph",":","tf.Graph","TensorFlow","graph",".","fn_name",":","str",",","optional",",","defaults","to","'main'","Function","name","of","the","graph",".","sg_input_shapes",":","dict","(","str",":","list",")","Dictionary","of","name","and","input","shapes","for","functions","\/","sub-graphs",".","Returns","--","--","--","-","dict","(","str",":","dict","(","str",":","ParsedTFNode",")",")","Dictionary","of","function","name","and","dictionary","of","node","name","and","ParsedTFNode","object","."]
code: def _dict_from_graph_def(graph, fn_name="main", sg_input_shapes=None):
      """
      Loads a tf.Graph and transform it into dictionary of ParsedTFNodes.
      Potentially contains multiple functions, in such case, recursively
      resolve functions (sub-graphs).
  
      Parameters
      ----------
      graph: tf.Graph
          TensorFlow graph.
      fn_name: str, optional, defaults to 'main'
          Function name of the graph.
      sg_input_shapes: dict(str: list)
          Dictionary of name and input shapes for functions / sub-graphs.
  
      Returns
      -------
      dict(str: dict(str: ParsedTFNode))
          Dictionary of function name and dictionary of node name and
          ParsedTFNode object.
      """
      graph_dict = {fn_name: {}}
      graph_inputs = {fn_name: []}
      graph_outputs = {fn_name: []}
      graph_ret = {fn_name: {}}
  
      for op in graph.get_operations():
          graph_dict[fn_name].update(
              {op.name: ParsedTFNode(op.node_def)}
          )
  
      for name, sg in graph._functions.items():
          sg_def = context.get_function_def(name)
          if name in sg_input_shapes:
              input_shapes = sg_input_shapes[name]
              input_shapes = input_shapes[
                  -len(sg_def.signature.input_arg) :
              ]
              fn_graph = _function_def_to_graph(
                  sg_def, input_shapes=input_shapes
              )
  
              graph_dict.update(
                  TF2Loader._dict_from_graph_def(
                      fn_graph, name, sg_input_shapes
                  )[0]
              )
              graph_inputs.update(
                  {
                      name: [
                          t.name.split(":")[0] for t in fn_graph.inputs
                      ]
                  }
              )
              graph_outputs.update(
                  {
                      name: [
                          t.name.split(":")[0] for t in fn_graph.outputs
                      ]
                  }
              )
  
              # ret is a mapping from the output arg names from `signature` to the
              # outputs from `node_def` that should be returned by the function.
              graph_ret.update({name: sg_def.ret})
  
      return graph_dict, graph_inputs, graph_outputs, graph_ret
  
imports: import os.path
  from distutils.version import StrictVersion
  import tensorflow
  from tensorflow.lite.python.util import get_grappler_config
  from tensorflow.lite.python.util import run_graph_optimizations
  from tensorflow.python.eager import context
  from tensorflow.python.framework import dtypes
  from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2
  from tensorflow.python.framework.function_def_to_graph import function_def_to_graph
  from tensorflow.python.keras.saving import saving_utils
  from tqdm import tqdm
  from coremltools import _logger
  from coremltools._deps import _get_version
  from coremltools.converters.mil.frontend.tensorflow2.tf_graph_pass import flatten_sub_graph_namespaces, rewrite_control_flow_functions
  from coremltools.converters.mil.frontend.tensorflow.basic_graph_ops import fill_outputs
  from coremltools.converters.mil.frontend.tensorflow.load import TFLoader
  from coremltools.converters.mil.frontend.tensorflow.parsed_tf_node import ParsedTFNode
  from coremltools.converters.mil.frontend.tensorflow.tf_graph_pass import constant_propagation, delete_disconnected_nodes, delete_unnecessary_constant_nodes, fuse_dilation_conv, insert_get_tuple, remove_variable_nodes, tensor_array_resource_removal
  from coremltools.converters.mil.frontend.tensorflow.tfssa import NetworkEnsemble, SSAFunction
  from coremltools.converters.mil.input_types import TensorType
  from .converter import TF2Converter
label_desc: Use image node_id 8 for calling the TF2Loader obj's underlying member method code with example usage: obj._dict_from_graph_def(graph, fn_name, sg_input_shapes) and returns: graph_dict,  graph_inputs,  graph_outputs,  graph_ret