ncnn 20211208版本与20220118commit(c0a94cd9cab)的结果不一致问题

wnvonmuf  于 4个月前  发布在  其他
关注(0)|答案(4)|浏览(54)

基础描述

-模型中有个除法操作,输入A : 32 * 64 *64 ;输入B : 1 * 1 * 1, 输出C : 32 * 64 * 64

  • 20211208的版本运算正常,但20220118的结果不正常(与手算验证结果也不一致);
  • 20211208正确版本输出 (328 = 324 / 327)

  • 20220118错误版本输出 (328 = 324 / 327)

截图328第一个元素应该为-9.4832 / 5.1805 ~= -1.83

网络节点图如下所示

  • Ncnn

  • Onnx

编译环境

Linux
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=OFF -DNCNN_BUILD_EXAMPLES=ON ..

其他

新版本的android上也是运算结果错误;且对于部分机型,会有inf出现

wz8daaqr

wz8daaqr1#

这边额外补充了输出featuremap的第一个元素和第二个原始
ncnn_mat.channel(0)[0] << "\t" << in_mat.channel(0)[1] << "\n";
发现第一个元素打印正常-8.96/5.18 ~= -1.7297, 第二个元素为-0.089971,不正常

jk9hmnmh

jk9hmnmh2#

https://github.com/Tencent/ncnn/wiki/binaryop-broadcasting
因为 ncnn 的 binaryop 目前不支持 32 * 64 64 和 11*1 的broadcasting规则...
这种情况可以用 32 * 64 *64 和 1 来实现

n3ipq98p

n3ipq98p3#

https://github.com/Tencent/ncnn/wiki/binaryop-broadcasting 因为 ncnn 的 binaryop 目前不支持 32 * 64 _64 和 1_1*1 的broadcasting规则... 这种情况可以用 32 * 64 *64 和 1 来实现

那为什么在20211208的版本内测试结果是正常的呢。 昨天我也看了,src/layer/x86/binaryop_x86.cpp的广播机制确实也不支持1,1,1的。
这边增加了这个代码,结果能正常,大致增加了b为1x1x1的

t8e9dugd

t8e9dugd4#

或者是不是在这些1x1x1的位置后面加入一个Flatten操作,编程一个1维的常量就可以了

相关问题