Tencent / ncnn

ncnn is a high-performance neural network inference framework optimized for the mobile platform
Other
20.42k stars 4.16k forks source link

Mxnet模型测试结果和PC端不一致 #197

Closed sunbinbin1991 closed 6 years ago

sunbinbin1991 commented 6 years ago

背景: 1:使用的是mxnet,使用的模型为修改后的squzenetnet,修改了输入(128128)和最后的一个卷积层. 2:更改了squzenetncnn.jni(只有输入大小),按照非常规方法https://github.com/GarrickLin/cmake_build_ndk,编译出可用的。libsquzenetncnn.so, 3::按照ncnn官方提示在编译出mxnet2ncnn.exe,ncnn2mem.exe,是的原来模型能够输入,获得了如下三个ncnn.bin,ncnn.proto.bin和ncnn.id.h文件 4:直接将 @dangbo 文件中的部分输入修改,并替换libsquzenetncnn.so 结果: 1:模型解决的是二分类问题,然而一直预测的只有一个类,并且结果为‘1’ 猜测: 1:通过背景2方法修改后的jni,编译后获得。so文件是能够显示修改后的变化的,就是说。so文件出错概率不高 2:使用的官网给出的libncnn.a编译而出的。so不知道是否有影响 3:由于在编译过程中提示出过一个错误: 1510844376 1 这里修改过。主要是因为生成的ncnn.id.h不一样,如下图(左边改后,右边原始): 1510844534 1 求教,预测结果不一致的可能原因 @nihui

sunbinbin1991 commented 6 years ago

看起来不是第二个问题,BLOB_name就是需要修改的

sunbinbin1991 commented 6 years ago

pk3ltgakpfw6zy45n9v_eid 应该是模型转化的问题,调试发现转化后的最后一层C那个值不对,正常应该是显示类别数2,原始的模型是C=1000,不知道模型转化具体哪里有问题

sunbinbin1991 commented 6 years ago

737 eu7pasz elecl63v 2 原始模型的输出,两者是不一样

zhly0 commented 6 years ago

以前转换caffe的模型也和pc端不一致,不知道现在解决了没有.求解

nihui commented 6 years ago

http://data.dmlc.ml/models/imagenet/squeezenet/ 这里下载的 squeezenet_v1.1-symbol.json squeezenet_v1.1-0000.params 测试了下没问题

跟 caffe 模型的区别是输出的 prob Mat 是 1000 x 1 x 1

zhly0 commented 6 years ago

@nihui ,多谢回答,之前有个issue,测试是批处理导致结果不一致而这个squeezenet_v1.1中没有用到批处理,不知道是否有测试批处理,多谢!

sunbinbin1991 commented 6 years ago

问题的原因是我用到了flatten层,所以模型转换有问题,@nihui大佬有时间能写一下就好了

sunbinbin1991 commented 6 years ago

q ahuxm lb47pq80y f_ut 试了一下模型转换,结果其中w和c的位置还是颠倒的(使用的是http://data.dmlc.ml/models/imagenet/squeezenet/的模型)

nihui commented 6 years ago

mxnet 模型输出的 prob Mat 是 1000 x 1 x 1 caffe 模型输出的 prob Mat 是 1 x 1 x 1000 squeezenet 没有问题

sunbinbin1991 commented 6 years ago

我在window上测试也是1000✘1✘1,没问题,不过使用我自己编译好的.so文件,却读不出每一层的结果,不知道哪里出现问题,自行编译的so,然后又尝试使用ndk-build编译得到的so文件,都不行,使用是给出的android-ncnn库,不知道哪里的问题

sunbinbin1991 commented 6 years ago

我这边的原因暂时找到了,编译的so文件要对应上具体的模型。一方面jni中Blob_name需要改,同时,Android上应该使用最终的二进制文件(.bin)(..proto的不行): u 1oi_c7jok vtg83 4k 8 而pc上VS可以用.proto,判断模型有没有load进去,可以查看打印的值: 8 z7k2346e j _26 _8el