From bd0c3521945bd7458da64995b1aa6bc6cf85f361 Mon Sep 17 00:00:00 2001 From: SunAhong1993 Date: Sat, 26 Dec 2020 16:24:10 +0800 Subject: [PATCH] fix the onnx bug --- x2paddle/decoder/onnx_decoder.py | 27 ++++++++++++++++--- .../dygraph/onnx2paddle/opset9/opset.py | 22 +++++++++------ .../static/onnx2paddle/opset9/opset.py | 15 ++++++----- 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/x2paddle/decoder/onnx_decoder.py b/x2paddle/decoder/onnx_decoder.py index 4e01fe3..d1de07e 100644 --- a/x2paddle/decoder/onnx_decoder.py +++ b/x2paddle/decoder/onnx_decoder.py @@ -302,7 +302,19 @@ class ONNXGraph(Graph): if opt == in_node: self.connect(nd.name, layer_name) flag = 1 - node.which_child[nd.name] = idx + if nd.name in node.which_child: + for n_i, n_ipt in enumerate(node.inputs): + if first_i == n_i: + continue + if n_ipt == nd.name: + new_nd_name = "{}/{}".format(nd.name, n_i) + if new_nd_name not in node.which_child: + node.which_child[new_nd_name] = idx + break + print(node.which_child) + else: + first_i = node.inputs.index(nd.name) + node.which_child[nd.name] = idx self.node_map[nd.name].index = 0 break if flag == 1: @@ -318,11 +330,18 @@ class ONNXGraph(Graph): if len(node.which_child) == 0: ipt_node = super(ONNXGraph, self).get_node(node.inputs[idx], copy) return ipt_node - else: ipt_node = super(ONNXGraph, self).get_node(node.inputs[idx], copy) - if ipt_node.layer_name in node.which_child: - ipt_node.index = node.which_child[ipt_node.layer_name] + new_ipt_name = "{}/{}".format(ipt_node.layer_name, idx) + if new_ipt_name in node.which_child: + print(new_ipt_name) + ipt_node.index = node.which_child[new_ipt_name] + print("ipt_node.index", ipt_node.index) + else: + if ipt_node.layer_name in node.which_child: + ipt_node.index = node.which_child[ipt_node.layer_name] + print("ipt_node.index", ipt_node.index) + return ipt_node diff --git a/x2paddle/op_mapper/dygraph/onnx2paddle/opset9/opset.py b/x2paddle/op_mapper/dygraph/onnx2paddle/opset9/opset.py index b1c1fd8..7257e82 100644 --- a/x2paddle/op_mapper/dygraph/onnx2paddle/opset9/opset.py +++ b/x2paddle/op_mapper/dygraph/onnx2paddle/opset9/opset.py @@ -250,6 +250,7 @@ class OpSet9(): def _interpolate(self, node): val_x = self.graph.get_input_node(node, idx=0, copy=True) inputs = {'x': val_x.name} + attrs = dict() if node.layer_type == 'Resize': if len(node.layer.input) == 2: # opset 10 @@ -258,7 +259,7 @@ class OpSet9(): elif len(node.layer.input) == 3: # opset 11 val_scales = self.graph.get_input_node(node, idx=2, copy=True) - inputs['scale_factor'] = val_scales.name + attrs['scale_factor'] = self.weights[val_scales.name].tolist()[2:] elif len(node.layer.input) == 4: # opset 11 val_sizes = self.graph.get_input_node(node, idx=3, copy=True) @@ -281,7 +282,7 @@ class OpSet9(): ipt = inputs.pop("x") inputs["input"] = ipt mode = node.get_attr('mode', 'nearest') - attrs = {"align_corners": False} + attrs.update({"align_corners": False}) self.paddle_graph.add_layer( kernel="fluid.layers.resize_nearest", inputs=inputs, @@ -293,9 +294,9 @@ class OpSet9(): inputs['scale'] = val_scales mode = node.get_attr('mode', 'nearest') - attrs = {"align_corners": False, - "mode": string(mode), - "align_mode": 1} + attrs.update({"align_corners": False, + "mode": string(mode), + "align_mode": 1}) self.paddle_graph.add_layer( kernel="paddle.nn.functional.interpolate", inputs=inputs, @@ -926,16 +927,17 @@ class OpSet9(): 'max': max_value, 'min': min_value, } + self.paddle_graph.add_layer( 'paddle.clip', inputs={"x": val_x.name}, outputs=[node.name], **layer_attrs) else: - max_ipt = self.graph.get_input_node(node, idx=1, copy=True) - min_ipt = self.graph.get_input_node(node, idx=2, copy=True) - max_value = _const_weight_or_none(max_ipt) + min_ipt = self.graph.get_input_node(node, idx=1, copy=True) + max_ipt = self.graph.get_input_node(node, idx=2, copy=True) min_value = _const_weight_or_none(min_ipt) + max_value = _const_weight_or_none(max_ipt) if max_value.shape == (1, ): max_value = max_value[0] if min_value.shape == (1, ): @@ -1095,6 +1097,10 @@ class OpSet9(): dtypes = set() for i in range(len(node.layer.input)): ipt = self.graph.get_input_node(node, idx=i, copy=True) + try: + print(ipt.index) + except: + pass inputs_list.append(ipt.name) dtypes.add(ipt.dtype) if len(dtypes) > 1: diff --git a/x2paddle/op_mapper/static/onnx2paddle/opset9/opset.py b/x2paddle/op_mapper/static/onnx2paddle/opset9/opset.py index e4c5439..5dd87cf 100644 --- a/x2paddle/op_mapper/static/onnx2paddle/opset9/opset.py +++ b/x2paddle/op_mapper/static/onnx2paddle/opset9/opset.py @@ -240,6 +240,7 @@ class OpSet9(): def _interpolate(self, node): val_x = self.graph.get_input_node(node, idx=0, copy=True) inputs = {'x': val_x.name} + attrs = dict() if node.layer_type == 'Resize': if len(node.layer.input) == 2: # opset 10 @@ -248,7 +249,7 @@ class OpSet9(): elif len(node.layer.input) == 3: # opset 11 val_scales = self.graph.get_input_node(node, idx=2, copy=True) - inputs['scale_factor'] = val_scales.name + attrs['scale_factor'] = self.params[val_scales.name].tolist()[2:] elif len(node.layer.input) == 4: # opset 11 val_sizes = self.graph.get_input_node(node, idx=3, copy=True) @@ -271,7 +272,7 @@ class OpSet9(): ipt = inputs.pop("x") inputs["input"] = ipt mode = node.get_attr('mode', 'nearest') - attrs = {"align_corners": False} + attrs = attrs.update({"align_corners": False}) self.paddle_graph.add_layer( kernel="fluid.layers.resize_nearest", inputs=inputs, @@ -283,9 +284,9 @@ class OpSet9(): inputs['scale'] = val_scales mode = node.get_attr('mode', 'nearest') - attrs = {"align_corners": False, + attrs.update({"align_corners": False, "mode": string(mode), - "align_mode": 1} + "align_mode": 1}) self.paddle_graph.add_layer( kernel="paddle.nn.functional.interpolate", inputs=inputs, @@ -917,10 +918,10 @@ class OpSet9(): outputs=[node.name], **layer_attrs) else: - max_ipt = self.graph.get_input_node(node, idx=1, copy=True) - min_ipt = self.graph.get_input_node(node, idx=2, copy=True) - max_value = _const_weight_or_none(max_ipt) + min_ipt = self.graph.get_input_node(node, idx=1, copy=True) + max_ipt = self.graph.get_input_node(node, idx=2, copy=True) min_value = _const_weight_or_none(min_ipt) + max_value = _const_weight_or_none(max_ipt) if max_value.shape == (1, ): max_value = max_value[0] if min_value.shape == (1, ): -- GitLab