当前位置:   article > 正文

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

hswish

一、前言

最近在搞 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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

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

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

#  onnx2caffe\_operators.py 下
def _c
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/137336
推荐阅读
相关标签
  

闽ICP备14008679号