diff --git a/docs/inference_model_convertor/demo/tensorflow2paddle.ipynb b/docs/inference_model_convertor/demo/tensorflow2paddle.ipynb index e9d4d0797ff86b94cf86a60a4048a36776674e16..30122def364afddb72466a6f614f3bee8ffa075e 100644 --- a/docs/inference_model_convertor/demo/tensorflow2paddle.ipynb +++ b/docs/inference_model_convertor/demo/tensorflow2paddle.ipynb @@ -81,7 +81,7 @@ "source": [ "## 模型迁移\n", "### 1. 获取MobileNetV1的FrozenModel\n", - "由于X2Paddle只支持TensorFlow中FrozenModel的转换,如果为纯checkpoint模型,需要参考参考X2Paddle官方[文档](https://github.com/PaddlePaddle/X2Paddle/blob/develop/docs/user_guides/export_tf_model.md),将其转换为FrozenModel,本示例中提供的模型为FrozenModel,所以无需转换。" + "由于X2Paddle只支持TensorFlow中FrozenModel的转换,如果为纯checkpoint模型,需要参考参考X2Paddle官方[文档](https://github.com/PaddlePaddle/X2Paddle/blob/release-1.1/docs/user_guides/export_tf_model.md),将其转换为FrozenModel,本示例中提供的模型为FrozenModel,所以无需转换。" ] }, { @@ -210,4 +210,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/x2paddle/core/program.py b/x2paddle/core/program.py index d32597486dfda608345136128a6b698c9e36180b..f04748f296ccb539133194ff69287da3cdf4ab46 100755 --- a/x2paddle/core/program.py +++ b/x2paddle/core/program.py @@ -558,9 +558,9 @@ class PaddleGraph(object): paddle.save(self.parameters, save_path) def dygraph2static(self, save_dir, input_shapes=[], input_types=[]): - sepc_list = list() + spec_list = list() for i, name in enumerate(self.inputs): - sepc_list.append( + spec_list.append( paddle.static.InputSpec( shape=input_shapes[i], name=name, dtype=input_types[i])) path = osp.abspath(save_dir) @@ -574,7 +574,7 @@ class PaddleGraph(object): else: model.set_dict(restore) model.eval() - static_model = paddle.jit.to_static(model, input_spec=sepc_list) + static_model = paddle.jit.to_static(model, input_spec=spec_list) try: paddle.jit.save(static_model, osp.join(save_dir, "inference_model/model")) diff --git a/x2paddle/decoder/onnx_decoder.py b/x2paddle/decoder/onnx_decoder.py index ae3e61e3e069f15457f75cfddef7395fdc67cc92..db4ed90ba33d1aa819c0973e76a3df15f13688dc 100755 --- a/x2paddle/decoder/onnx_decoder.py +++ b/x2paddle/decoder/onnx_decoder.py @@ -583,7 +583,8 @@ class ONNXDecoder(object): item.name = self.make_variable_name(item.name) for node in graph.node: node.name = node.output[0] - if ":" in node.name and len(node.output) > 1: + if ":" in node.name and len( + node.output) > 1 and node.op_type != "LSTM": node.name = node.name.split(':')[0] node.name = self.make_variable_name(node.name) for i in range(len(node.input)): diff --git a/x2paddle/op_mapper/caffe2paddle/caffe_op_mapper.py b/x2paddle/op_mapper/caffe2paddle/caffe_op_mapper.py index e05f60c317496fd49f798ec3acbf60f5e0d592ef..c120945b1f6c1ac0c8c38a65091bf085b66031e5 100644 --- a/x2paddle/op_mapper/caffe2paddle/caffe_op_mapper.py +++ b/x2paddle/op_mapper/caffe2paddle/caffe_op_mapper.py @@ -966,11 +966,12 @@ class CaffeOpMapper(): inputs={"x": input.name}, outputs=[node.layer_name], **layer_attrs) - self.paddle_graph.add_layer( - "paddle.pow", - inputs={"x": node.layer_name}, - outputs=[node.layer_name], - exponent=params.power) + if params.power != 1: + self.paddle_graph.add_layer( + "paddle.pow", + inputs={"x": node.layer_name, + "y": params.power}, + outputs=[node.layer_name]) def Reduction(self, node): assert len( diff --git a/x2paddle/op_mapper/onnx2paddle/opset9/opset.py b/x2paddle/op_mapper/onnx2paddle/opset9/opset.py index c7fc867c952b1c76b3e93c846f3f4097c911ff33..c3038863c5b6e28c44881956746209db4e300911 100755 --- a/x2paddle/op_mapper/onnx2paddle/opset9/opset.py +++ b/x2paddle/op_mapper/onnx2paddle/opset9/opset.py @@ -2277,14 +2277,35 @@ class OpSet9(): paddings, var_x = self._pad_if_asymmetric(node, pads, val_x) - output_size = [0, 0] + if len(output_size) != 0: + paddings = [0] * 4 + total_paddings = list() + total_paddings.append((val_x.out_shapes[0][2] - 1) * strides[ + 0] + dilations[0] * (kernel_shape[0] - 1) + 1 + out_padding[0] - + output_size[0]) + total_paddings.append((val_x.out_shapes[0][3] - 1) * strides[ + 1] + dilations[1] * (kernel_shape[1] - 1) + 1 + out_padding[1] - + output_size[1]) + if auto_pad == "SAME_UPPER": + for i in range(len(total_paddings)): + paddings[2 * i] = total_paddings[0] - total_paddings[0] // 2 + paddings[2 * i + 1] = total_paddings[0] // 2 + else: + for i in range(len(total_paddings)): + paddings[2 * i] = total_paddings[0] // 2 + paddings[2 * i + 1] = total_paddings[0] - total_paddings[ + 0] // 2 + else: + output_size = [0, 0] - output_size[0] = (val_x.out_shapes[0][2] - 1 - ) * strides[0] - 2 * paddings[0] + dilations[0] * ( - kernel_shape[0] - 1) + 1 + out_padding[0] - output_size[1] = (val_x.out_shapes[0][3] - 1 - ) * strides[1] - 2 * paddings[1] + dilations[1] * ( - kernel_shape[1] - 1) + 1 + out_padding[1] + output_size[0] = ( + val_x.out_shapes[0][2] - 1 + ) * strides[0] - 2 * paddings[0] + dilations[0] * ( + kernel_shape[0] - 1) + 1 + out_padding[0] + output_size[1] = ( + val_x.out_shapes[0][3] - 1 + ) * strides[1] - 2 * paddings[1] + dilations[1] * ( + kernel_shape[1] - 1) + 1 + out_padding[1] # Conv2DTranspose缺少output_size,只能在forward里头传进output_size inputs_dict = {'x': val_x if isinstance(val_x, str) else val_x.name} @@ -2327,6 +2348,8 @@ class OpSet9(): if val_b is not None: _rename_or_remove_weight(self.weights, val_b.name, op_name + '.bias') + else: + layer_attrs["bias_attr"] = False self.paddle_graph.add_layer( kernel=paddle_op, inputs=inputs_dict, diff --git a/x2paddle/op_mapper/pytorch2paddle/aten.py b/x2paddle/op_mapper/pytorch2paddle/aten.py index 683dbad39591a8dc1f3658e46be730b3f0da2b15..b11a41440cf30af8869868af1ff121b3a2166560 100755 --- a/x2paddle/op_mapper/pytorch2paddle/aten.py +++ b/x2paddle/op_mapper/pytorch2paddle/aten.py @@ -1315,8 +1315,10 @@ def aten__convolution(mapper, graph, node): weights = mapper.pytorch_params[inputs_name[1]] if len(weights.shape) == 3: op_name = name_generator("conv1d", mapper.nn_name2id) - else: + elif len(weights.shape) == 4: op_name = name_generator("conv2d", mapper.nn_name2id) + else: + op_name = name_generator("conv3d", mapper.nn_name2id) output_name = mapper._get_outputs_name(node)[0] layer_outputs = [op_name, output_name] layer_inputs = {} @@ -1364,7 +1366,22 @@ def aten__convolution(mapper, graph, node): else: layer_attrs['in_channels'] = weights.shape[1] * mapper.attrs[ inputs_name[8]] - if len(weights.shape) == 4: + if len(weights.shape) == 3: + if mapper.attrs[inputs_name[6]]: + graph.add_layer( + "paddle.nn.Conv1DTranspose", + inputs=layer_inputs, + outputs=layer_outputs, + scope_name=scope_name, + **layer_attrs) + else: + graph.add_layer( + "paddle.nn.Conv1D", + inputs=layer_inputs, + outputs=layer_outputs, + scope_name=scope_name, + **layer_attrs) + elif len(weights.shape) == 4: if mapper.attrs[inputs_name[6]]: graph.add_layer( "paddle.nn.Conv2DTranspose", @@ -1382,14 +1399,14 @@ def aten__convolution(mapper, graph, node): else: if mapper.attrs[inputs_name[6]]: graph.add_layer( - "paddle.nn.Conv1DTranspose", + "paddle.nn.Conv3DTranspose", inputs=layer_inputs, outputs=layer_outputs, scope_name=scope_name, **layer_attrs) else: graph.add_layer( - "paddle.nn.Conv1D", + "paddle.nn.Conv3D", inputs=layer_inputs, outputs=layer_outputs, scope_name=scope_name,