PaddlePaddle / X2Paddle

Deep learning model converter for PaddlePaddle. (『飞桨』深度学习模型转换工具)
http://www.paddlepaddle.org/
Apache License 2.0
731 stars 164 forks source link

转换tf模型发生TypeError: pad() got an unexpected keyword argument 'input' 错误 #423

Open xingjing1 opened 3 years ago

xingjing1 commented 3 years ago

tensorflow模型:检测手的一个模型, 转换paddle模型时候发生如下错误:

image

模型如下: palm_detection.zip

使用的方法是官方文档所介绍的方法: https://github.com/PaddlePaddle/X2Paddle

paddlepaddle版本:paddlepaddle-1.8.5-cp36-cp36m-win_amd64.whl paddlelite版本:paddlelite-2.6.3-cp36-cp36m-win_amd64.whl X2paddle版本:x2paddle-0.8.7-py3-none-any.whl

jiangjiajun commented 3 years ago

你好,请获取最新的github代码,重新安装x2paddle即可

pip uninstall x2paddle
git clone https://github.com/PaddlePaddle/X2Paddle.git
cd X2Paddle
git checkout develop
python setup.py install
xingjing1 commented 3 years ago

您好,按照您的方式输出如下信息: image

当我跑benchmark时候出现了如下问题: image 我是在树莓派上编译的paddle-lite,命令是: ./benchmark_bin --optimized_model_path=./benchmark_models/hand --warmup=10 --repeats=10 --threads=4 --result_filename=./result.txt`

之前benchmark过resnet的,可以正常输出世界。 转换后的模型如下: inference_model.zip

是转换模型不完全吗?

jiangjiajun commented 3 years ago

因为tf的模型输入格式是nhwc, 而paddlelite的benchmark工具可能是针对nchw的输入的,因此会有如上的错误提示

xingjing1 commented 3 years ago

因为tf的模型输入格式是nhwc, 而paddlelite的benchmark工具可能是针对nchw的输入的,因此会有如上的错误提示

好的,,那我自己写一个demo吧

xingjing1 commented 3 years ago

因为tf的模型输入格式是nhwc, 而paddlelite的benchmark工具可能是针对nchw的输入的,因此会有如上的错误提示

您知道有什么简便的方法可以benchmark这个模型吗?

jiangjiajun commented 3 years ago

因为tf的模型输入格式是nhwc, 而paddlelite的benchmark工具可能是针对nchw的输入的,因此会有如上的错误提示

您知道有什么简便的方法可以benchmark这个模型吗?

在X2Paddle转换后的生成目录,包含了两个文件夹 inference_modelmodel_with_code,其中在model_with_code目录中,x2paddle_model.py是模型的组网代码, 另外还有模型的权重目录,你可以修改x2paddle_model.py

例如当前是

from paddle.fluid.initializer import Constant
from paddle.fluid.param_attr import ParamAttr
import paddle.fluid as fluid
import math

def x2paddle_net():
    input = fluid.data(dtype='float32', name='input', shape=[1, 256, 256, 3])
    conv2d_transpose_0 = fluid.layers.transpose(x=input, perm=[0, 3, 1, 2])
    conv2d = fluid.layers.conv2d(input=conv2d_transpose_0, filter_size=[3, 3], param_attr='conv2d_Kernel', stride=[2, 2], num_filters=32, bias_attr='conv2d_Bias', dilation=[1, 1], padding='SAME')
   。。。
   。。。

将其修改,把输入改成NCHW格式,这样可以去掉第二行的transpose, 注意修改第三行的输入变量名,改成如下代码

from paddle.fluid.initializer import Constant
from paddle.fluid.param_attr import ParamAttr
import paddle.fluid as fluid
import math

def x2paddle_net():
    input = fluid.data(dtype='float32', name='input', shape=[1, 3, 256, 256])
    conv2d = fluid.layers.conv2d(input=input, filter_size=[3, 3], param_attr='conv2d_Kernel', stride=[2, 2], num_filters=32, bias_attr='conv2d_Bias', dilation=[1, 1], padding='SAME')

通过修改后的组网代码,加载权重,重新调用fluid.io.save_inference_model即可导出新的部署模型,接着再转成paddlelite的格式,即可使用benchmark工具

xingjing1 commented 3 years ago

因为tf的模型输入格式是nhwc, 而paddlelite的benchmark工具可能是针对nchw的输入的,因此会有如上的错误提示

您知道有什么简便的方法可以benchmark这个模型吗?

在X2Paddle转换后的生成目录,包含了两个文件夹 inference_modelmodel_with_code,其中在model_with_code目录中,x2paddle_model.py是模型的组网代码, 另外还有模型的权重目录,你可以修改x2paddle_model.py

例如当前是

from paddle.fluid.initializer import Constant
from paddle.fluid.param_attr import ParamAttr
import paddle.fluid as fluid
import math

def x2paddle_net():
    input = fluid.data(dtype='float32', name='input', shape=[1, 256, 256, 3])
    conv2d_transpose_0 = fluid.layers.transpose(x=input, perm=[0, 3, 1, 2])
    conv2d = fluid.layers.conv2d(input=conv2d_transpose_0, filter_size=[3, 3], param_attr='conv2d_Kernel', stride=[2, 2], num_filters=32, bias_attr='conv2d_Bias', dilation=[1, 1], padding='SAME')
   。。。
   。。。

将其修改,把输入改成NCHW格式,这样可以去掉第二行的transpose, 注意修改第三行的输入变量名,改成如下代码

from paddle.fluid.initializer import Constant
from paddle.fluid.param_attr import ParamAttr
import paddle.fluid as fluid
import math

def x2paddle_net():
    input = fluid.data(dtype='float32', name='input', shape=[1, 3, 256, 256])
    conv2d = fluid.layers.conv2d(input=input, filter_size=[3, 3], param_attr='conv2d_Kernel', stride=[2, 2], num_filters=32, bias_attr='conv2d_Bias', dilation=[1, 1], padding='SAME')

通过修改后的组网代码,加载权重,重新调用fluid.io.save_inference_model即可导出新的部署模型,接着再转成paddlelite的格式,即可使用benchmark工具

👍,多谢,我试试

xingjing1 commented 3 years ago

您好,我刚接触paddle,麻烦啦 我用如下代码,生成新的inference_model: ` import paddle.fluid as fluid import model_with_code.x2paddle_model as model

[input], [classificators, regressors] = model.x2paddle_net()

exe = fluid.Executor(fluid.CPUPlace()) fluid.io.load_persistables(exe, './model_with_code/weights') path = "./inference_model"

fluid.io.save_inference_model(dirname=path, feeded_var_names=['input'],main_program = , target_vars=[classificators, regressors], executor=exe) ` 进行benchmark,然而还是有segmentation fault错误,是我生成的方式有不对吗?

生成的新inference model和原来的model_with_code都在下面这个文件里。 palm.zip

我用checkforlite检测了一下: image 原因是这个吗?

jiangjiajun commented 3 years ago

这个建议在PaddleLite的Repo下提个issue咨询下 https://github.com/PaddlePaddle/Paddle-Lite check_for_lite的原理是查找Paddle-Lite/develop/lite/api/_paddle_use_ops.h代码下是否有相应OP实现,具体是否支持,还以PaddleLite的文档为准