code: def summarize_neural_network_spec(mlmodel_spec):
      
      inputs = [(blob.name, _get_feature_description_summary(blob)) for blob in mlmodel_spec.description.input]
      outputs = [(blob.name, _get_feature_description_summary(blob)) for blob in mlmodel_spec.description.output]
      nn = None
  
      if mlmodel_spec.HasField('neuralNetwork'):
          nn = mlmodel_spec.neuralNetwork
      elif mlmodel_spec.HasField('neuralNetworkClassifier'):
          nn = mlmodel_spec.neuralNetworkClassifier
      elif mlmodel_spec.HasField('neuralNetworkRegressor'):
          nn = mlmodel_spec.neuralNetworkRegressor
  
      layers = [_summarize_network_layer_info(layer) for layer in nn.layers] if nn != None else None
      return (inputs, outputs, layers)
docs: Summarize network into the following structure.
      Args:
      mlmodel_spec : mlmodel spec
      Returns:
      inputs : list[(str, str)] - a list of two tuple (name, descriptor) for each input blob.
      outputs : list[(str, str)] - a list of two tuple (name, descriptor) for each output blob
      layers : list[(str, list[str], list[str], list[(str, str)])] - a list of layers represented by
          layer name, input blobs, output blobs, a list of (parameter name, content)