基础描述
-模型中有个除法操作,输入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出现
- param文件
a_sim.txt
4条答案
按热度按时间wz8daaqr1#
这边额外补充了输出featuremap的第一个元素和第二个原始
ncnn_mat.channel(0)[0] << "\t" << in_mat.channel(0)[1] << "\n";
发现第一个元素打印正常-8.96/5.18 ~= -1.7297, 第二个元素为-0.089971,不正常
jk9hmnmh2#
https://github.com/Tencent/ncnn/wiki/binaryop-broadcasting
因为 ncnn 的 binaryop 目前不支持 32 * 64 64 和 11*1 的broadcasting规则...
这种情况可以用 32 * 64 *64 和 1 来实现
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的
t8e9dugd4#
或者是不是在这些1x1x1的位置后面加入一个Flatten操作,编程一个1维的常量就可以了