class_docstr: A graph consists of connected Blocks, or Heads.
  
  # Arguments
      inputs: A list of input node(s) for the Graph.
      outputs: A list of output node(s) for the Graph.
code: def from_config(cls, config):
      blocks = [
          blocks_module.deserialize(block) for block in config["blocks"]
      ]
      nodes = {
          int(node_id): nodes_module.deserialize(node)
          for node_id, node in config["nodes"].items()
      }
  
      inputs = [nodes[node_id] for node_id in nodes]
      for block_id, block in enumerate(blocks):
          input_nodes = [
              nodes[node_id]
              for node_id in config["block_inputs"][str(block_id)]
          ]
          output_nodes = nest.flatten(block(input_nodes))
          for output_node, node_id in zip(
              output_nodes, config["block_outputs"][str(block_id)]
          ):
              nodes[node_id] = output_node
  
      outputs = [nodes[node_id] for node_id in config["outputs"]]
      return cls(inputs=inputs, outputs=outputs)
  
imports: import keras_tuner
  from tensorflow import keras
  from tensorflow import nest
  from autokeras import blocks
  from autokeras import keras_layers
  from autokeras import nodes
  from autokeras.engine import head
  from autokeras.engine import serializable
  from autokeras.utils import io_utils
label_desc: Use image node_id 8 for calling the Graph obj's underlying member method code with example usage: obj.from_config(cls, config) and returns: cls