海思开发:海思上对 relu6、hswish、h-sigmoid 移植的探索

一、前言

最近在搞 mobilenet v2、v3,v2的激活函数是 relu6,v3有两个非线性函数:hswish 和 h-sigmoid,二者都用到了relu6,之前都是把它们替换,因为海思没有现成的relu6。当时就在想,能否利用现有op,组合成想要的relu6出来了? 这个想法在脑子里徘徊几天了,今天试着给它变现,结果如下。

二、经过

relu6与relu的最大区别就是前者的值域是[0, 6],而relu的值域是[0, +无穷]。所以对于x>6的值,我们要做个区分,于是看文档,终于发现可用的op,如下图,threshold layer 源码
在这里插入图片描述
用法很明显了,我们可以设阈值为 6,当输入大于6时,输出1,否则输出0,有了这个 threshold 输出 0/1,我们可以写个公式:

公式:
relu6_out =1 - threshold_out)* input + threshold_out * 6

注:
1. input 是上一级的输出,准确的说是 relu 的输出;
2. threshold_out 是 threshold layer 的输出,只有 0 / 1 两种值;
3.input > 6 时,threshold_out = 1 , relu6_out = 6;
4.input < 6 时,threshold_out = 0 , relu6_out = input.

公式里还有些乘、加的 op,本来想用 sclae 层,后来发现 power层 更好用,power layer 博客
在这里插入图片描述
好了,op都齐了,脑海中已经有了大致的结构与流程,给它画了出来,如下,下面所有的 op 作用等同于一个 relu6:
在这里插入图片描述
下面是代码编写部分,总体来说不算难写,调试时间也没多久。onnx2caffe转换代码在这里
老规矩,打开转换代码工程目录下的 onnx2caffe_operators.py 文件,在py文件末尾加上:

#  onnx2caffe\_operators.py 下
"Relu6": _convert_relu6  # 建议加在 relu 下面,方便查看

然后在上面添加一个_convert_relu6 函数:

#  onnx2caffe\_operators.py 下
def _c
  • 11
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值