海思AI开发NNIE 模型转换问题记录

问题1 pooling层尺寸不一致

pooling层输出尺寸的计算公式如下:

当不能整除(输入或卷积核为奇数)时,pytorch默认是floor,而caffe默认是ceil,因此会出现onnx2caffe转换后输出尺寸比pytorch大1的情况。

解决办法:Slice层切割pooling层的输出

  • 如果训练端发现该问题,可以pytorch的pooling设置为ceil_mode=True

  • 如果部署端发现该问题,不想重新修改模型retrain,则需要手动修改prototxt

    • 首先,不能采用将padding置为0的方式,虽然能获得相同的size,但计算方式会发生变化,实测也是会出现掉点的。具体可以看下图;
  • 从上图可以看到,可以将caffe ceil模式输出的结果的最后一行和最后一列切掉,从而获得与pytorch相同的输出;
  • 最后,其实也可以修改caffe端pooling层为floor模式,但在当前情景下,caffe只是作为中转,还要转换到nnie模型,可能还会出现不匹配的情况,故这里不适用。
  • 代价:无效输出增多

    由于slice分割了pooling层的输出,故每次slice都会产生一个无用的tensor输出(最后一行/列),nnie每个模型seg的最大输出个数为16(hi_nnie.h中定义了#define SVP_NNIE_MAX_OUTPUT_NUM 16),故如果有些模型slice加的多,还得将这些无用输出合并成一个。

  • 问题2 不支持relu6

  • 解决办法:多个op组合进行替代

    relu6即在relu的基础上,将最大值钳制到6,图像如下:

 caffe和nnie没有现成的op支持,如非用relu6不可,可以用几个caffe支持的op组合进行代替,公式如下:

  • 阈值判断用threshold,乘和偏置作可以用power,tensor相加的操作可以用eltwise,具体组合方式见下图

衍生问题:Power 层shift=1.0无法正常加1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值