X2Paddle
X2Paddle copied to clipboard
onnx_decoder: 对于Optional的OP input应该如何处理
感谢您参与 X2Paddle 社区! 问题模版为了 X2Paddle 能更好的迭代,例如新功能发布、 RoadMaps 和错误跟踪. :smile_cat:
问题描述
- 错误信息 https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Clip-13 Clip op 描述中提到 min 和 max 是 optional的, 默认值为numeric_limits::lowest() and numeric_limits::max(), 通过pytorch导出的onnx模型中会出现min或max不给设定值的情况
在修复了一些取op input的错误后, 遇到input不存在的情况应该如何在x2paddle框架上处理呢
diff --git a/x2paddle/decoder/onnx_decoder.py b/x2paddle/decoder/onnx_decoder.py
index 7fe4696..75e4325 100755
--- a/x2paddle/decoder/onnx_decoder.py
+++ b/x2paddle/decoder/onnx_decoder.py
@@ -329,10 +329,10 @@ class ONNXGraph(Graph):
def get_input_node(self, node, idx=0, copy=False):
if len(node.which_child) == 0:
- ipt_node = super(ONNXGraph, self).get_node(node.inputs[idx], copy)
+ ipt_node = super(ONNXGraph, self).get_node(node.layer.input[idx], copy)
return ipt_node
else:
- ipt_node = super(ONNXGraph, self).get_node(node.inputs[idx], copy)
+ ipt_node = super(ONNXGraph, self).get_node(node.layer.input[idx], copy)
new_ipt_name = "{}/{}".format(ipt_node.layer_name, idx)
if new_ipt_name in node.which_child:
ipt_node.index = node.which_child[new_ipt_name]
diff --git a/x2paddle/op_mapper/onnx2paddle/opset14.py b/x2paddle/op_mapper/onnx2paddle/opset14.py
index 0a4f18a..1ff533b 100644
--- a/x2paddle/op_mapper/onnx2paddle/opset14.py
+++ b/x2paddle/op_mapper/onnx2paddle/opset14.py
@@ -32,3 +32,4 @@ def print_mapping_info(func):
class OpSet14(OpSet13):
def __init__(self, decoder, paddle_graph):
super(OpSet14, self).__init__(decoder, paddle_graph)
+ self.directly_map_ops['HardSwish'] = ['paddle.nn.Hardswish']
diff --git a/x2paddle/op_mapper/onnx2paddle/opset_legacy.py b/x2paddle/op_mapper/onnx2paddle/opset_legacy.py
index bdf532a..15d903b 100644
--- a/x2paddle/op_mapper/onnx2paddle/opset_legacy.py
+++ b/x2paddle/op_mapper/onnx2paddle/opset_legacy.py
@@ -1233,7 +1233,7 @@ class OpSet():
val_x = self.graph.get_input_node(node, idx=0, copy=True)
val_y = self.graph.get_node(node.layer.output[0], copy=True)
max_value, min_value = None, None
- if len(node.inputs) == 1:
+ if len(node.layer.input) == 1:
max_value = node.get_attr('max')
min_value = node.get_attr('min')
layer_attrs = {
@@ -1247,7 +1247,7 @@ class OpSet():
outputs=[node.name],
**layer_attrs)
else:
- if len(node.inputs) == 2:
+ if len(node.layer.input) == 2:
val_ipt = self.graph.get_input_node(node, idx=1, copy=True)
index = node.get_input_index(val_ipt.name)
@@ -1268,7 +1268,7 @@ class OpSet():
outputs=[node.name],
**layer_attrs)
else:
- if len(node.inputs) == 3:
+ if len(node.layer.input) == 3:
min_ipt = self.graph.get_input_node(node, idx=1, copy=True)
max_ipt = self.graph.get_input_node(node, idx=2, copy=True)
self.paddle_graph.add_layer(
- 错误截图
具体信息
- 转换模型后用处
- [X] 使用 Paddle.js 运行在小程序上
- [ ] 使用 Paddle 框架/ PaddleInference 推理预测
- [ ] 使用 Paddle-Lite 做移动端推理
- [ ] 转换预训练参数,再使用 Paddle 进行模型开发
- 模型来源 SSDLite: https://pytorch.org/vision/main/models/generated/torchvision.models.detection.ssdlite320_mobilenet_v3_large.html#torchvision.models.detection.ssdlite320_mobilenet_v3_large
- 应用场景 用于小程序业务下的检测业务
- 版本信息 PaddlePaddle => daily build X2Paddle => 1.4.0 来源框架版本(PyTorch/TF/ONNX/Caffe) => PyTorch
联系方式: [email protected]
@TaylorHere 麻烦提供一下ONNX模型吧
另外,可以描述一下以下两个问题吗: 1、具体业务场景 2、为什么有转到Paddle部署的需求呢?
感谢~