赞
踩
最近在搞 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。