ncnn icon indicating copy to clipboard operation
ncnn copied to clipboard

Transpose 转 Permute 出现问题

Open mingx9527 opened this issue 4 years ago • 3 comments

首先感谢NCNN团队的开源和贡献

个人在进行ncnn部署时遇到下述问题,请教

现象描述: 1)keras2onnx:keras框架模型,由于默认NHWC顺序,在转onnx中,为匹配NCHW顺序,onnx模型生成了多个Transpose 0231 和 0312两种层;已经验证onnx模型结果和keras模型结果是一样的 2)onnx2ncnn:能成功转化生成ncnn模型,并无警告和报错

问题1:若默认Permute设置 (onnx2ncnn.cpp) else if (perm[1] == 2 && perm[2] == 3 && perm[3] == 1) fprintf(pp, " 0=3"); // c w h else if (perm[1] == 3 && perm[2] == 1 && perm[3] == 2) fprintf(pp, " 0=4"); // h c w 会导致网络在推理过程中,出现通道混乱情况,如将c通道当h或w通道来进行计算的现象,出现该层输出:-nan

问题2:若改变Permute设置 else if (perm[1] == 2 && perm[2] == 3 && perm[3] == 1) fprintf(pp, " 0=0"); // c w h else if (perm[1] == 3 && perm[2] == 1 && perm[3] == 2) fprintf(pp, " 0=0"); // h c w 也可设置为“0=1” 虽然这不符合网络实际,却能前向出结果(不是nan,但与keras和onnx结果不一致),更奇怪的问题是同一张图像输入,多次前向,结果相差很大

mingx9527 avatar Feb 02 '21 10:02 mingx9527

https://github.com/Tencent/ncnn/tree/master/tools/keras 建议使用 keras2ncnn 工具直接转换 Transpose 是 onnx 中间商加的胶水op

nihui avatar Feb 02 '21 10:02 nihui

@nihui 谢谢指点,但对于我这次转换的模型来说, 这些工具都有自己的bug或支持不够全等问题,不能转化成功!我这边将keras模型重写为pytorch模型,再转ncnn,获得成功!

mingx9527 avatar Feb 22 '21 03:02 mingx9527

https://github.com/Tencent/ncnn/tree/master/tools/keras 建议使用 keras2ncnn 工具直接转换 Transpose 是 onnx 中间商加的胶水op

你好,如果是pytorch的该如何处理的,我pytorch网络最后将nchw使用permute转成nhwc, 转换成onnx,后转成ncnn,相同输入数据,推理发现有几个固定的位置,多次运行值不同,请问如何解决

geoffzhang avatar Nov 22 '23 11:11 geoffzhang

针对onnx模型转换的各种问题,推荐使用最新的pnnx工具转换到ncnn In view of various problems in onnx model conversion, it is recommended to use the latest pnnx tool to convert your model to ncnn

pip install pnnx
pnnx model.onnx inputshape=[1,3,224,224]

详细参考文档 Detailed reference documentation https://github.com/pnnx/pnnx https://github.com/Tencent/ncnn/wiki/use-ncnn-with-pytorch-or-onnx#how-to-use-pnnx

nihui avatar Aug 05 '24 07:08 nihui