diff --git a/x2paddle/op_mapper/onnx2paddle/onnx_op_mapper.py b/x2paddle/op_mapper/onnx2paddle/onnx_op_mapper.py index 4838b744db04cea5d8cff8c51418f8cd65a9ef4f..25724ecbecd3eb3e863174ee2c9cdca91f1482fa 100644 --- a/x2paddle/op_mapper/onnx2paddle/onnx_op_mapper.py +++ b/x2paddle/op_mapper/onnx2paddle/onnx_op_mapper.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License" # you may not use this file except in compliance with the License. @@ -13,14 +13,22 @@ # limitations under the License. import sys -from x2paddle.op_mapper.onnx2paddle.opset9 import OpSet9 +from .opset7 import OpSet7 +from .opset8 import OpSet8 +from .opset9 import OpSet9 +from .opset10 import OpSet10 +from .opset11 import OpSet11 +from .opset12 import OpSet12 +from .opset13 import OpSet13 +from .opset14 import OpSet14 +from .opset15 import OpSet15 from x2paddle.decoder.onnx_decoder import ONNXGraphNode from x2paddle.core.program import PaddleGraph class ONNXOpMapper(): def __init__(self, decoder): - self.support_op_sets = [9, ] + self.support_op_sets = [7, 8, 9, 10, 11, 12, 13, 14, 15] self.default_op_set = 9 self.graph = decoder.graph self.paddle_graph = PaddleGraph(parent_layer=None, source_type="onnx") @@ -84,8 +92,7 @@ class ONNXOpMapper(): else: break opset = 'OpSet' + str(run_op_set) - print( - 'Now, onnx2paddle support convert onnx model opset_verison {},' - 'opset_verison of your onnx model is {}, automatically treated as op_set: {}.' - .format(self.support_op_sets, decoder.op_set, run_op_set)) + print('Now, onnx2paddle support convert onnx model opset_verison {}, ' + 'opset_verison of your onnx model is {}.' + .format(self.support_op_sets, decoder.op_set)) return eval(opset)(decoder, self.paddle_graph) diff --git a/x2paddle/op_mapper/onnx2paddle/opset10.py b/x2paddle/op_mapper/onnx2paddle/opset10.py new file mode 100644 index 0000000000000000000000000000000000000000..b27f697a6508c234691431a4a3622f60b3628e52 --- /dev/null +++ b/x2paddle/op_mapper/onnx2paddle/opset10.py @@ -0,0 +1,20 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .opset_legacy import OpSet + + +class OpSet10(OpSet): + def __init__(self, decoder, paddle_graph): + super(OpSet10, self).__init__(decoder, paddle_graph) diff --git a/x2paddle/op_mapper/onnx2paddle/opset11.py b/x2paddle/op_mapper/onnx2paddle/opset11.py new file mode 100644 index 0000000000000000000000000000000000000000..8e57c462df9bb7159c7d7b31f235e189d122ecb4 --- /dev/null +++ b/x2paddle/op_mapper/onnx2paddle/opset11.py @@ -0,0 +1,20 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .opset_legacy import OpSet + + +class OpSet11(OpSet): + def __init__(self, decoder, paddle_graph): + super(OpSet11, self).__init__(decoder, paddle_graph) diff --git a/x2paddle/op_mapper/onnx2paddle/opset12.py b/x2paddle/op_mapper/onnx2paddle/opset12.py new file mode 100644 index 0000000000000000000000000000000000000000..bcf94f222879901381b762024318019869919127 --- /dev/null +++ b/x2paddle/op_mapper/onnx2paddle/opset12.py @@ -0,0 +1,20 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .opset_legacy import OpSet + + +class OpSet12(OpSet): + def __init__(self, decoder, paddle_graph): + super(OpSet12, self).__init__(decoder, paddle_graph) diff --git a/x2paddle/op_mapper/onnx2paddle/opset13.py b/x2paddle/op_mapper/onnx2paddle/opset13.py new file mode 100644 index 0000000000000000000000000000000000000000..2b640a4c55b3ad585d2cbf4bf21ac33821227dad --- /dev/null +++ b/x2paddle/op_mapper/onnx2paddle/opset13.py @@ -0,0 +1,20 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .opset_legacy import OpSet + + +class OpSet13(OpSet): + def __init__(self, decoder, paddle_graph): + super(OpSet13, self).__init__(decoder, paddle_graph) diff --git a/x2paddle/op_mapper/onnx2paddle/opset14.py b/x2paddle/op_mapper/onnx2paddle/opset14.py new file mode 100644 index 0000000000000000000000000000000000000000..dedfc7fe3f88ffa640a54fff6875e74028b30a3c --- /dev/null +++ b/x2paddle/op_mapper/onnx2paddle/opset14.py @@ -0,0 +1,20 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .opset_legacy import OpSet + + +class OpSet14(OpSet): + def __init__(self, decoder, paddle_graph): + super(OpSet14, self).__init__(decoder, paddle_graph) diff --git a/x2paddle/op_mapper/onnx2paddle/opset15.py b/x2paddle/op_mapper/onnx2paddle/opset15.py new file mode 100644 index 0000000000000000000000000000000000000000..67bdc00161c4483a5c1ae2e4a600f8aba885570f --- /dev/null +++ b/x2paddle/op_mapper/onnx2paddle/opset15.py @@ -0,0 +1,20 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .opset_legacy import OpSet + + +class OpSet15(OpSet): + def __init__(self, decoder, paddle_graph): + super(OpSet15, self).__init__(decoder, paddle_graph) diff --git a/x2paddle/op_mapper/onnx2paddle/opset7.py b/x2paddle/op_mapper/onnx2paddle/opset7.py new file mode 100644 index 0000000000000000000000000000000000000000..befa14ef65392a62804412e2d3178cd39302abc7 --- /dev/null +++ b/x2paddle/op_mapper/onnx2paddle/opset7.py @@ -0,0 +1,20 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .opset_legacy import OpSet + + +class OpSet7(OpSet): + def __init__(self, decoder, paddle_graph): + super(OpSet7, self).__init__(decoder, paddle_graph) diff --git a/x2paddle/op_mapper/onnx2paddle/opset8.py b/x2paddle/op_mapper/onnx2paddle/opset8.py new file mode 100644 index 0000000000000000000000000000000000000000..e59cbc000b1dd13a1ec5412c82bbf457e7bdbbbd --- /dev/null +++ b/x2paddle/op_mapper/onnx2paddle/opset8.py @@ -0,0 +1,20 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .opset_legacy import OpSet + + +class OpSet8(OpSet): + def __init__(self, decoder, paddle_graph): + super(OpSet8, self).__init__(decoder, paddle_graph) diff --git a/x2paddle/op_mapper/onnx2paddle/opset9.py b/x2paddle/op_mapper/onnx2paddle/opset9.py new file mode 100644 index 0000000000000000000000000000000000000000..a67821b7eaa56ea71e092fde23d28888a485171b --- /dev/null +++ b/x2paddle/op_mapper/onnx2paddle/opset9.py @@ -0,0 +1,20 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License" +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .opset_legacy import OpSet + + +class OpSet9(OpSet): + def __init__(self, decoder, paddle_graph): + super(OpSet9, self).__init__(decoder, paddle_graph) diff --git a/x2paddle/op_mapper/onnx2paddle/opset9/__init__.py b/x2paddle/op_mapper/onnx2paddle/opset9/__init__.py deleted file mode 100644 index 0092e6e24986576fba653f47bd99342eb9995a27..0000000000000000000000000000000000000000 --- a/x2paddle/op_mapper/onnx2paddle/opset9/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .opset import OpSet9 diff --git a/x2paddle/op_mapper/onnx2paddle/opset9/opset.py b/x2paddle/op_mapper/onnx2paddle/opset_legacy.py old mode 100755 new mode 100644 similarity index 97% rename from x2paddle/op_mapper/onnx2paddle/opset9/opset.py rename to x2paddle/op_mapper/onnx2paddle/opset_legacy.py index 4db1033b08edf9274773dcbb58d804a7f920128d..2aaa8495eed9c912a027635f3892fb4628ad1a34 --- a/x2paddle/op_mapper/onnx2paddle/opset9/opset.py +++ b/x2paddle/op_mapper/onnx2paddle/opset_legacy.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License" # you may not use this file except in compliance with the License. @@ -114,74 +114,9 @@ def print_mapping_info(func): return run_mapping -class OpSet9(): - elementwise_ops = { - 'Add': 'paddle.add', - 'Div': 'paddle.divide', - 'Sub': 'paddle.subtract', - 'Mul': 'paddle.multiply', - 'Pow': 'paddle.pow', - 'Less': 'paddle.less_than', - 'LessOrEqual': 'paddle.less_equal', - } - - directly_map_ops = { - 'Ceil': ['paddle.ceil'], - # reduce function - 'ReduceMean': [ - 'paddle.mean', dict( - axes='axis', keepdims='keepdim'), dict( - axes=None, keepdims=True) - ], - 'ReduceMin': [ - 'paddle.min', dict( - axes='axis', keepdims='keepdim'), dict( - axes=None, keepdim=True) - ], - 'ReduceMax': [ - 'paddle.max', dict( - axes='axis', keepdims='keepdim'), dict( - axes=None, keepdim=True) - ], - 'ReduceProd': [ - 'paddle.prod', dict( - axes='axis', keepdims='keepdim'), dict( - axes=None, keepdim=True) - ], - # active function - 'Relu': ['paddle.nn.ReLU'], - 'LeakyRelu': [ - 'paddle.nn.LeakyReLU', dict(alpha='negative_slope'), - dict(negative_slope=.01) - ], - 'Elu': - ['paddle.nn.functional.elu', dict(alpha='alpha'), dict(alpha=1.)], - 'ThresholdedRelu': [ - 'paddle.nn.functional.thresholded_relu', dict(alpha='threshold'), - dict(alpha=1.) - ], - 'Tanh': ['paddle.nn.Tanh'], - 'Sigmoid': ['paddle.nn.Sigmoid'], - 'Softsign': ['paddle.nn.Softsign'], - 'Softplus': [ - 'paddle.nn.Softplus', dict(threshold='threshold'), - dict(threshold=float(sys.maxsize)) - ], - 'Exp': ['paddle.exp'], - 'Log': ['paddle.log'], - 'LogSoftmax': - ['paddle.nn.functional.log_softmax', dict(axis='axis'), dict(axis=1)], - 'Softmax': ['paddle.nn.Softmax', dict(axis='axis'), dict(axis=1)], - 'Sqrt': ['paddle.sqrt'], - 'Floor': ['paddle.floor'], - 'Abs': ['paddle.abs'], - 'Erf': ['paddle.erf'], - 'Sin': ['paddle.sin'], - 'Cos': ['paddle.cos'], - } - +class OpSet(): def __init__(self, decoder, paddle_graph): - super(OpSet9, self).__init__() + super(OpSet, self).__init__() self.graph = decoder.graph self.paddle_graph = paddle_graph self.inputs_info = dict() @@ -191,6 +126,72 @@ class OpSet9(): # solve for same data is used as an argument to multiple OPs. # PR link(wangjunjie06): https://github.com/PaddlePaddle/X2Paddle/pull/728 self.rename_mapper = dict() + self.elementwise_ops = { + 'Add': 'paddle.add', + 'Div': 'paddle.divide', + 'Sub': 'paddle.subtract', + 'Mul': 'paddle.multiply', + 'Pow': 'paddle.pow', + 'Less': 'paddle.less_than', + 'LessOrEqual': 'paddle.less_equal', + } + + self.directly_map_ops = { + 'Ceil': ['paddle.ceil'], + # reduce function + 'ReduceMean': [ + 'paddle.mean', dict( + axes='axis', keepdims='keepdim'), dict( + axes=None, keepdims=True) + ], + 'ReduceMin': [ + 'paddle.min', dict( + axes='axis', keepdims='keepdim'), dict( + axes=None, keepdim=True) + ], + 'ReduceMax': [ + 'paddle.max', dict( + axes='axis', keepdims='keepdim'), dict( + axes=None, keepdim=True) + ], + 'ReduceProd': [ + 'paddle.prod', dict( + axes='axis', keepdims='keepdim'), dict( + axes=None, keepdim=True) + ], + # active function + 'Relu': ['paddle.nn.ReLU'], + 'LeakyRelu': [ + 'paddle.nn.LeakyReLU', dict(alpha='negative_slope'), + dict(negative_slope=.01) + ], + 'Elu': + ['paddle.nn.functional.elu', dict(alpha='alpha'), dict(alpha=1.)], + 'ThresholdedRelu': [ + 'paddle.nn.functional.thresholded_relu', + dict(alpha='threshold'), dict(alpha=1.) + ], + 'Tanh': ['paddle.nn.Tanh'], + 'Sigmoid': ['paddle.nn.Sigmoid'], + 'Softsign': ['paddle.nn.Softsign'], + 'Softplus': [ + 'paddle.nn.Softplus', dict(threshold='threshold'), + dict(threshold=float(sys.maxsize)) + ], + 'Exp': ['paddle.exp'], + 'Log': ['paddle.log'], + 'LogSoftmax': [ + 'paddle.nn.functional.log_softmax', dict(axis='axis'), + dict(axis=1) + ], + 'Softmax': ['paddle.nn.Softmax', dict(axis='axis'), dict(axis=1)], + 'Sqrt': ['paddle.sqrt'], + 'Floor': ['paddle.floor'], + 'Abs': ['paddle.abs'], + 'Erf': ['paddle.erf'], + 'Sin': ['paddle.sin'], + 'Cos': ['paddle.cos'], + } @print_mapping_info def directly_map(self, node, *args, **kwargs):