Example #1
0
def convert_to_mace_pb(model_file, input_node, output_node, dsp_mode):
    """
    nnlib does not have batch norm, so use tensorflow optimizer to fold
     batch norm with convolution. The fold optimization reorders ops, so
     we sort ops first by topology.
  """
    input_graph_def = tf.GraphDef()
    with gfile.Open(model_file, "rb") as f:
        data = f.read()
        input_graph_def.ParseFromString(data)

    input_graph_def = graph_util.sort_tf_graph(input_graph_def)
    net_def = mace_pb2.NetDef()

    with tf.Session() as session:
        with session.graph.as_default() as graph:
            tf.import_graph_def(input_graph_def, name="")
            ops = graph.get_operations()
            dsp_ops = DspOps()
            resolved_ops = set()
            # convert const node
            unresolved_ops = [op for op in ops if op.type == 'Const']
            while len(unresolved_ops) > 0:
                convert_ops(unresolved_ops, resolved_ops, net_def, output_node,
                            dsp_ops)

            # convert op node
            unresolved_ops = [op for op in ops if op.type != 'Const']
            while len(unresolved_ops) > 0:
                convert_ops(unresolved_ops, resolved_ops, net_def, output_node,
                            dsp_ops)

            add_output_node(net_def, output_node)
            net_def = reverse_batch_to_space_and_biasadd(net_def)
            net_def = fuse_quantize(net_def, input_node, output_node)

            sorted_net_def = graph_util.sort_mace_graph(net_def, '__output__')
            net_def_with_node_id = add_node_id(sorted_net_def)

            dtype = mace_pb2.DT_FLOAT
            final_net_def = add_input_output_info(net_def_with_node_id,
                                                  input_node, output_node,
                                                  graph, dtype)

            arg = final_net_def.arg.add()
            arg.name = 'dsp_mode'
            arg.i = dsp_mode

    return final_net_def
Example #2
0
def convert_to_mace_pb(model_file, input_node, output_node, dsp_mode):
    """
    nnlib does not have batch norm, so use tensorflow optimizer to fold
     batch norm with convolution. The fold optimization reorders ops, so
     we sort ops first by topology.
  """
    input_graph_def = tf.GraphDef()
    with gfile.Open(model_file, "rb") as f:
        data = f.read()
        input_graph_def.ParseFromString(data)

    input_graph_def = graph_util.sort_tf_graph(input_graph_def)
    net_def = mace_pb2.NetDef()

    with tf.Session() as session:
        with session.graph.as_default() as graph:
            tf.import_graph_def(input_graph_def, name="")
            ops = graph.get_operations()
            dsp_ops = DspOps()
            resolved_ops = set()
            # convert const node
            unresolved_ops = [op for op in ops if op.type == 'Const']
            while len(unresolved_ops) > 0:
                convert_ops(unresolved_ops, resolved_ops, net_def, output_node,
                            dsp_ops)

            # convert op node
            unresolved_ops = [op for op in ops if op.type != 'Const']
            while len(unresolved_ops) > 0:
                convert_ops(unresolved_ops, resolved_ops, net_def, output_node,
                            dsp_ops)

            add_output_node(net_def, output_node)
            net_def = reverse_batch_to_space_and_biasadd(net_def)
            net_def = fuse_quantize(net_def, input_node, output_node)

            sorted_net_def = graph_util.sort_mace_graph(net_def, '__output__')
            net_def_with_node_id = add_node_id(sorted_net_def)

            dtype = mace_pb2.DT_FLOAT
            final_net_def = add_input_output_info(
                net_def_with_node_id, input_node, output_node, graph, dtype)

            arg = final_net_def.arg.add()
            arg.name = 'dsp_mode'
            arg.i = dsp_mode

    return final_net_def
Example #3
0
    def run(self):
        mace_check(
            len(self._option.input_nodes) == 1
            and len(self._option.output_nodes) == 1,
            'dsp only support single input and output')

        for tensor in self._model.tensors:
            self._consts[tensor.name] = tensor

        # convert op node
        self.convert_ops()

        self.add_input_output_node()

        self._model = graph_util.sort_mace_graph(self._model, '__output__')

        self.add_node_id()

        return self._model
Example #4
0
    def run(self):
        mace_check(len(self._option.input_nodes) == 1
                   and len(self._option.output_nodes) == 1,
                   'dsp only support single input and output')

        for tensor in self._model.tensors:
            self._consts[tensor.name] = tensor

        # convert op node
        self.convert_ops()

        self.add_input_output_node()
        if not self._option.check_nodes:
            output_name = self._option.output_nodes.values()[0].name
        else:
            output_name = self._option.check_nodes.values()[0].name
        output_name = normalize_name(output_name)
        self._model = graph_util.sort_mace_graph(self._model, output_name)

        self.add_node_id()

        return self._model
Example #5
0
    def run(self):
        ops = self._tf_graph.get_operations()
        dsp_ops = DspOps()
        resolved_ops = set()

        mace_check(
            len(self._option.input_nodes) == 1
            and len(self._option.output_nodes) == 1,
            'dsp only support single input and output')
        input_node = self._option.input_nodes.values()[0].name
        output_node = self._option.output_nodes.values()[0].name

        # convert const node
        unresolved_ops = [op for op in ops if op.type == 'Const']
        with tf.Session() as session:
            while len(unresolved_ops) > 0:
                convert_ops(unresolved_ops, resolved_ops, self._mace_net_def,
                            dsp_ops)

            # convert op node
            unresolved_ops = [op for op in ops if op.type != 'Const']
            while len(unresolved_ops) > 0:
                convert_ops(unresolved_ops, resolved_ops, self._mace_net_def,
                            dsp_ops)

            add_output_node(self._mace_net_def, output_node)
            net_def = reverse_batch_to_space_and_biasadd(self._mace_net_def)
            net_def = fuse_quantize(net_def)

            sorted_net_def = graph_util.sort_mace_graph(net_def, '__output__')
            net_def_with_node_id = add_node_id(sorted_net_def)

            dtype = mace_pb2.DT_FLOAT
            final_net_def = add_input_output_info(net_def_with_node_id,
                                                  input_node, output_node,
                                                  self._tf_graph, dtype)

        return final_net_def
Example #6
0
    def run(self):
        ops = self._tf_graph.get_operations()
        dsp_ops = DspOps()
        resolved_ops = set()

        mace_check(len(self._option.input_nodes) == 1
                   and len(self._option.output_nodes) == 1,
                   'dsp only support single input and output')
        input_node = self._option.input_nodes.values()[0].name
        output_node = self._option.output_nodes.values()[0].name

        # convert const node
        unresolved_ops = [op for op in ops if op.type == 'Const']
        with tf.Session() as session:
            while len(unresolved_ops) > 0:
                convert_ops(unresolved_ops, resolved_ops, self._mace_net_def,
                            dsp_ops)

            # convert op node
            unresolved_ops = [op for op in ops if op.type != 'Const']
            while len(unresolved_ops) > 0:
                convert_ops(unresolved_ops, resolved_ops, self._mace_net_def,
                            dsp_ops)

            add_output_node(self._mace_net_def, output_node)
            net_def = reverse_batch_to_space_and_biasadd(self._mace_net_def)
            net_def = fuse_quantize(net_def)

            sorted_net_def = graph_util.sort_mace_graph(net_def, '__output__')
            net_def_with_node_id = add_node_id(sorted_net_def)

            dtype = mace_pb2.DT_FLOAT
            final_net_def = add_input_output_info(
                net_def_with_node_id, input_node, output_node,
                self._tf_graph, dtype)

        return final_net_def