Paddle2ONNX icon indicating copy to clipboard operation
Paddle2ONNX copied to clipboard

paddleclas中multilabels模型转 onnx后精度损失太多

Open xxddccaa opened this issue 3 years ago • 6 comments

看了一些issues都不能解决我的问题: https://github.com/PaddlePaddle/Paddle2ONNX/issues/451 https://github.com/PaddlePaddle/Paddle2ONNX/issues/772

这是我的issues: https://github.com/PaddlePaddle/PaddleClas/issues/2174 对于同一张图输入,paddle模型输出后sigmod是(最大的两个数值是0.10090836, 0.96171629): image 而onnx模型里面带了sigmod,输出就是想要的数值(最大的两个数值是0.00439452, 0.98361409): image 想不出来是哪里出了问题,是paddle转onnx之后精度差这么多吗?

xxddccaa avatar Jul 30 '22 06:07 xxddccaa

@xddun Hi, 你能提供下已经导出的原Paddle模型吗?

jiangjiajun avatar Jul 31 '22 06:07 jiangjiajun

你好,我把文件传百度云了,他们都是一一对应的: 链接:https://pan.baidu.com/s/1sscJwEJVflt06I-5fPNKBg?pwd=y9v3 提取码:y9v3

image

执行paddlecls ,使用latest.pdparams 、inference.pdiparams、onnx出来的数值都有或多或少的区别。

xxddccaa avatar Jul 31 '22 12:07 xxddccaa

今天有了新的对比发现,把图片保存为bin后利用不同模型处理多标签任务,看输出的最大值判定模型推理是否相同,我发现: (1)运行onnx的结果最大数值是 0.96299744 (2)运行paddleclas自带的推理的功能(/deploy/python/predict_cls.py)的结果最大数值是 0.9629971。 万分位以上的差别都是可以接受的,所以我觉得paddle2onnx还是OK的。 (3)运行paddleclas自带的infer推理(tools/infer.py)的结果最大数值是0.94861。那么问题就出在paddle的动态模型转到paddle的推理模型上。

我在paddlecls的项目里也提一下这个问题,希望能得到解决。

xxddccaa avatar Aug 01 '22 03:08 xxddccaa

你的意思是paddle的动态模型(即没导出,直接用权重加载后,然后用python预测)的结果,和导出之后再预测结果是有差异的吗? 虽然不能确认是否是动态转静态模型的问题,但看来确实是deploy/python/predict_cls.py和tools/infer.py的预测结果差异问题

jiangjiajun avatar Aug 01 '22 03:08 jiangjiajun

是的。是这个情况。

我也认同 确实是deploy/python/predict_cls.py和tools/infer.py的预测结果差异问题。

不知道可以提给谁解决,有心支持国产但是我好像遇到了自己不能解决的阻碍。

xxddccaa avatar Aug 01 '22 03:08 xxddccaa

我提一下我的使用过程,/mnt/c/Users/dong.xie/Desktop/workcode/workplace/PaddleClas/test.bin就是那张(3,224,224)的numpy变量。

                    import paddle.nn.functional as F
                    images = np.fromfile("/mnt/c/Users/dong.xie/Desktop/workcode/workplace/PaddleClas/test.bin",
                                     dtype=np.float32).reshape(3, 224, 224)
                    images = np.expand_dims(images, 0)

                    import onnxruntime as ort
                    session = ort.InferenceSession(
                        r'inference/inference.onnx')
                    outputs = session.run(None, {'x': images})
                    print("onnx", outputs[0].max())
                    # onnx 0.96299744

                    print("sigmod:", F.sigmoid(self.model(paddle.Tensor(images))[0]).max())
                    print("postprocess_func:", self.postprocess_func(self.model(paddle.Tensor(images)), image_file_list))

截屏里可以看出2者的结果:

image

xxddccaa avatar Aug 01 '22 04:08 xxddccaa