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
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
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
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
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
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