paddleclas中multilabels模型转 onnx后精度损失太多
看了一些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):
而onnx模型里面带了sigmod,输出就是想要的数值(最大的两个数值是0.00439452, 0.98361409):
想不出来是哪里出了问题,是paddle转onnx之后精度差这么多吗?
@xddun Hi, 你能提供下已经导出的原Paddle模型吗?
你好,我把文件传百度云了,他们都是一一对应的: 链接:https://pan.baidu.com/s/1sscJwEJVflt06I-5fPNKBg?pwd=y9v3 提取码:y9v3

执行paddlecls ,使用latest.pdparams 、inference.pdiparams、onnx出来的数值都有或多或少的区别。
今天有了新的对比发现,把图片保存为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的项目里也提一下这个问题,希望能得到解决。
你的意思是paddle的动态模型(即没导出,直接用权重加载后,然后用python预测)的结果,和导出之后再预测结果是有差异的吗? 虽然不能确认是否是动态转静态模型的问题,但看来确实是deploy/python/predict_cls.py和tools/infer.py的预测结果差异问题
是的。是这个情况。
我也认同 确实是deploy/python/predict_cls.py和tools/infer.py的预测结果差异问题。
不知道可以提给谁解决,有心支持国产但是我好像遇到了自己不能解决的阻碍。
我提一下我的使用过程,/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者的结果:
