Ncnn: pytorch模型转onnx再转ncnn出来的概率值精度有差

Created on 23 Jul 2019  ·  31Comments  ·  Source: Tencent/ncnn

大佬你好,我用pytorch模型转onnx以后,用onnx-simplifier这个库简化了一下,最后再转ncnn,在分类任务上最终输出的logit在小数点后一位有差别,我检查过RGB和mean std还有scale等问题,这些都是对的,想问下你这个现象正常么。

Most helpful comment

刚用onnxruntime验证了一下,simplifier之后的模型输出结果一致,那就只有可能问题出在ncnn这边了

All 31 comments

刚用onnxruntime验证了一下,simplifier之后的模型输出结果一致,那就只有可能问题出在ncnn这边了

我是一层一层的在排查

@novioleo 你也发现这个问题了么?我也一层一层查过 你那边有查出是哪个层的问题么

@luuuyi 目前来说应该问题是在模型精度和推断精度不一致。在推断的时候ncnn用的fp16,但是你可能模型的精度是fp32,甚至64。另外如果是pytorch的话,转换的时候可能是会有乱入的层。需要自己甄别一下。

@novioleo pytorch转出来的onnx simplifier之后ncnn层都支持 而且用微软的onnxruntime测试过一致性 ncnn只能用fp16进行推理么 有没有可配置的项目。

@luuuyi 目前我没看到。你可以先对你的模型量化一下。用apex,然后重训练,再放到ncnn上面,这样可以降低diff了。

@novioleo 你这样做了以后就没问题了么

@luuuyi 我目前用的pretrain的模型,还没finetune,我以前用其他模型出现diff是这样搞得,你可以先这样做。目前主流方案都是如此。量化裁剪后都需要retrain。

@novioleo 我用的也是pretrain的模型,如果确定是这个问题,那就需要重新训一下了。

@luuuyi 我当时就看第一层卷积都有差错,但是差距不大我就清楚是什么问题了。论int8的重要性。

@novioleo 感谢

@luuuyi 可以加个联系方式,后面一起交流哈。

@novioleo 可以的 我们邮箱里沟通联系方式,我的邮箱 [email protected],如果你不方便发邮件也可以跟我说一下你的联系方式

我也发现这个问题了,onnx转NCNN后精度变差,一开始怀疑归一化有问题。后来换onnxruntime,但是有个疑问,pytorch里面分类的归一化均值是
std= [0.229, 0.224, 0.225]
mean=[0.485, 0.456, 0.406]
onnxruntime里面是,也是用这个吗?预测还是不对,还在排查中。@luuuyi

@yulinhuyang no~ncnn的运算是做乘法,mean不变.std在现有基础乘以255,然后求倒数即可.即:
1/(0.229f*255)

@yulinhuyang ncnn里面貌似没有std这个概念,只有mean和scale,但是你可以把公式写出来,把mean和std代入进去的,输入预处理部分我已经确保一致了的,我运行一个分类模型,ncnn出来的top5其实都是一致的,只是prob和onnxruntime或者pytorch出来的prob不一样,大概在小数点后两位就不一样了

x86 cpu 目前发现 conv3x3s1 有计算上的bug,正在处理中 qaq

pytorch 和 mxnet-gluon 预处理方法已加入 FAQ
https://github.com/Tencent/ncnn/wiki/FAQ-ncnn-produce-wrong-result#pre-process

差距还是挺大的。

x86 cpu 目前发现 conv3x3s1 计算bug 已经修复了,如果是pc cpu上跑的话建议更新代码测试

@nihui 大佬发话了,放心了,坐等更新。

@luuuyi 请问下,您使用onnxruntime,softmax前一层全连接层输出和pytorch有比较过吗?感觉onnxruntime,计算和pytorch,同一张图片,输出结果差距也是小数点后一两位。

@yulinhuyang 我对比的是经过softmax出来的概率,只显示了小数点后三位,完全一致。

是的,基本上误差就是精度误差的差距。

---原始邮件---
发件人: "Yi Lu"<[email protected]>
发送时间: 2019年9月3日 21:43:05
收件人: "Tencent/ncnn"<[email protected]>;
抄送: "Mention"<[email protected]>;"Tao Luo"<[email protected]>;
主题: Re: [Tencent/ncnn] pytorch模型转onnx再转ncnn出来的概率值精度有差 (#1145)

@yulinhuyang 我对比的是经过softmax出来的概率,只显示了小数点后三位,完全一致。


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.

是运算精度误差,关闭这个issue了

我也发现这个问题了,onnx转NCNN后精度变差,一开始怀疑归一化有问题。后来换onnxruntime,但是有个疑问,pytorch里面分类的归一化均值是
std= [0.229, 0.224, 0.225]
mean=[0.485, 0.456, 0.406]
onnxruntime里面是,也是用这个吗?预测还是不对,还在排查中。@luuuyi

请问一下你解决了这个问题了吗,我也遇到和你一样的问题,你是如何解决呢?

@liguiyuan 你可以看下我上面发的。。。还有nihui发的。。

------------------ 原始邮件 ------------------
发件人: "liguiyuan"notifications@github.com;
发送时间: 2019年9月29日(星期天) 上午9:59
收件人: "Tencent/ncnn"ncnn@noreply.github.com;
抄送: "北国枫叶。"744351893@qq.com; "Mention"mention@noreply.github.com;
主题: Re: [Tencent/ncnn] pytorch模型转onnx再转ncnn出来的概率值精度有差 (#1145)

我也发现这个问题了,onnx转NCNN后精度变差,一开始怀疑归一化有问题。后来换onnxruntime,但是有个疑问,pytorch里面分类的归一化均值是
std= [0.229, 0.224, 0.225]
mean=[0.485, 0.456, 0.406]
onnxruntime里面是,也是用这个吗?预测还是不对,还在排查中。@luuuyi

请问一下你解决了这个问题了吗,我也遇到和你一样的问题,你是如何解决呢?


You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.

大佬你好,我用pytorch模型转onnx以后,用onnx-simplifier这个库简化了一下,最后再转ncnn,在分类任务上最终输出的logit在小数点后一位有差别,我检查过RGB和mean std还有scale等问题,这些都是对的,想问下你这个现象正常么。

你好 我这边和你一样的方式转成ncnn,但是检测后全是检测的背景,请问一下那个onnxruntime验证onnx有比较好的教程推荐不

apex
您好,我也遇到这个问题了!可以问您几个问题么?
请问,apex是什么?还有就是我是用pytorch转的ncnn,那么转完ncnn之后怎么微调?之前在pytorch上训练,转成ncnn后,是要微调ncnn?

@jianbaba apex是nvidia的混合精度的框架,ncnn无法微调,ncnn只是推断。

@jianbaba 自己去看官方文档

Was this page helpful?
0 / 5 - 0 ratings

Related issues

baiyecha picture baiyecha  ·  3Comments

zsliaoming picture zsliaoming  ·  3Comments

jinfagang picture jinfagang  ·  4Comments

SisterL picture SisterL  ·  3Comments

varbegin picture varbegin  ·  3Comments