Пример #1
0
def _neural_network_nodes_and_edges(nn_spec, cy_nodes, cy_edges, spec_outputs,
                                    input_spec):
    """

    Parameters
    ----------
    nn_spec : Neural Network Spec
    cy_nodes : list to add nn nodes to
    cy_edges : list to add edges for nn nodes to
    spec_outputs : outputs of nn spec
    input_spec : input spec of Neural Network

    Returns
    -------

    cy_data : concatenated list of updated cy_nodes and cy_edges

    """
    cy_nodes = _neural_network_node_info(nn_spec, cy_nodes)
    cy_nodes.append({
        'data': {
            'id': 'output_node',
            'name': '',
            'info': {
                'type': 'output node'
            },
            'classes': 'output',
        }
    })

    for model_output, output_type in spec_outputs:
        cy_nodes.append({
            'data': {
                'id': str(model_output),
                'name': str(model_output),
                'info': {
                    'type': "\n".join(str(output_type).split("\n")),
                    'inputs': str([model_output]),
                    'outputs': str([])
                },
                'parent': 'output_node'
            },
            'classes': 'output'
        })

    shape_dict = _infer_shapes(nn_spec, input_spec)
    cy_nodes, cy_edges = _calculate_edges(cy_nodes, cy_edges, shape_dict)

    cy_data = cy_nodes + cy_edges
    return cy_data
Пример #2
0
def inspect(model_path, output_txt_file):
    spec = coremltools.utils.load_spec(model_path)
    sys.stdout = open(os.devnull, "w")
    shape_dict = _infer_shapes(model_path)
    sys.stdout = sys.__stdout__

    types_dict = {}

    sys.stdout = open(output_txt_file, 'w')

    nn = spec.neuralNetwork
    if spec.WhichOneof('Type') == 'neuralNetwork':
        nn = spec.neuralNetwork
    elif spec.WhichOneof('Type') == 'neuralNetworkRegressor':
        nn = spec.neuralNetworkRegressor
    elif spec.WhichOneof('Type') == 'neuralNetworkClassifier':
        nn = spec.neuralNetworkClassifier
    else:
        raise ValueError("Only neural network model Type is supported")

    for i, layer in enumerate(nn.layers):
        print(
            '---------------------------------------------------------------------------------------------------------------------------------------------'
        )
        print("{}: layer name = {}, layer type = ( {} ), \n inputs = \n {}, \n input shapes = {}, \n outputs = \n {}, \n output shapes = {} ".format(i, layer.name, \
                layer.WhichOneof('layer'), ", ".join([x for x in layer.input]), ", ".join([str(shape_dict[x]) for x in layer.input]),
                ", ".join([x for x in layer.output]),
                ", ".join([str(shape_dict[x]) for x in layer.output])))

        layer_type = layer.WhichOneof('layer')
        if layer_type == 'convolution' and layer.convolution.isDeconvolution:
            layer_type = 'deconvolution'
        if layer_type in types_dict:
            types_dict[layer_type] += 1
        else:
            types_dict[layer_type] = 1

    print(
        '---------------------------------------------------------------------------------------------------------------------------------------------'
    )
    sorted_types_count = sorted(types_dict.items(), key=operator.itemgetter(1))
    print('Layer Type counts:')
    for i in sorted_types_count:
        print("{} : {}".format(i[0], i[1]))
def _neural_network_nodes_and_edges(nn_spec,
                                    cy_nodes,
                                    cy_edges,
                                    spec_outputs,
                                    input_spec
                                    ):
    """

    Parameters
    ----------
    nn_spec : Neural Network Spec
    cy_nodes : list to add nn nodes to
    cy_edges : list to add edges for nn nodes to
    spec_outputs : outputs of nn spec
    input_spec : input spec of Neural Network

    Returns
    -------

    cy_data : concatenated list of updated cy_nodes and cy_edges

    """
    cy_nodes = _neural_network_node_info(nn_spec, cy_nodes)

    cy_nodes.append({
        'data': {
            'id': 'output_node',
            'name': 'output_node',
            'info': {
                'inputs': str(spec_outputs),
                'outputs': str([])
            },
            'classes': 'output',

        }
    })

    shape_dict = _infer_shapes(nn_spec, input_spec)
    cy_nodes, cy_edges = _calculate_edges(cy_nodes, cy_edges, shape_dict)

    cy_data = cy_nodes + cy_edges
    return cy_data
def _pipeline_nodes_and_edges(cy_nodes, cy_edges, pipeline_spec, spec_outputs):
    """

    Parameters
    ----------
    cy_nodes : list to add nn nodes to
    cy_edges : list to add edges for nn nodes to
    pipeline_spec: Spec of pipeline mlmodel
    spec_outputs: spec outputs of pipeline mlmodel

    Returns
    -------

    cy_data : concatenated list of updated cy_nodes and cy_edges

    """
    i = 1
    nn_model_types = ['neuralNetwork', 'neuralNetworkClassifier', 'neuralNetworkRegressor']
    models = pipeline_spec.models
    shape_dict = None
    for model in models:
        sub_model_type = model.WhichOneof('Type')
        info = {}
        input_names = []
        output_names = []
        info['Pipeline Component'] = sub_model_type.upper()
        for model_input in model.description.input:
            input_names.append(model_input.name)
            info['inputs'] = str(input_names)

        for model_output in model.description.output:
            output_names.append(model_output.name)
            info['outputs'] = str(output_names)

        info = _pipeline_component_info(model, info)

        if sub_model_type in nn_model_types:
            cy_nodes.append({
                'data': {
                    'id': "{}_{}".format(sub_model_type, i),
                    'name': sub_model_type,
                    'info': info
                },
                'classes': 'parent',
            })
            if sub_model_type == 'neuralNetwork':
                nn_spec = model.neuralNetwork
            elif sub_model_type == 'neuralNetworkClassifier':
                nn_spec = model.neuralNetworkClassifier
            elif sub_model_type == 'neuralNetworkRegressor':
                nn_spec = model.neuralNetworkRegressor
            cy_nodes = _neural_network_node_info(nn_spec, cy_nodes, child=True, parent="{}_{}".format(sub_model_type, i))
            shape_dict = _infer_shapes(nn_spec, model.description.input)
        else:
            cy_nodes.append({
                'data': {
                    'id': "{}_{}".format(sub_model_type, i),
                    'name': sub_model_type,
                    'info': info
                },
                'classes': sub_model_type
            })
        i += 1

    cy_nodes.append({
        'data': {
            'id': 'output_node',
            'name': 'output_node',
            'info': {
                'inputs': str(spec_outputs),
                'outputs': str([])
            },
            'classes': 'output',

        }
    })

    cy_nodes, cy_edges = _calculate_edges(cy_nodes, cy_edges, shape_dict)

    cy_data = cy_nodes + cy_edges
    return cy_data