ReXNet模型pth转onnx,swish不支持问题

问题描述:

 最近在使用一个算法模型ReXNet,算法是基于pytorch实现的,训练模型保存格式为.pth,我这里想把它转化为onnx做推理加速,模型转化代码这里就不贴了,很简单,直接上转化过程中遇到问题如下图:

请添加图片描述
可以看到报错信息为:RuntimeError: ONNX export failed: Couldn’t export Python operator SwishJitImplementation
说明SwishJitImplementation这个函数中有onnx不支持的op,我们去到rReXNet网络中去找到SwishJitImplementation这个函数,代码片如下图
请添加图片描述
即为模型中使用了swish激活函数,而onnx是不支持Swish这个函数的,我们需要对算法模型进行修改,或者在模型转化时对swish进行修改

首先先看下swish这个函数公式为:
请添加图片描述
函数图像为:

请添加图片描述
当 β \beta β = 0时,Swish激活函数变为线性函数 f(x) = x 2 \frac{x}{2} 2x​,
当 β \beta β = ∞ \infty ∞ 时,Swish激活函数变为0或x,相当于Relu,
所以,Swish函数可以看作是介于线性函数与ReLU函数之间的平滑函数

通过函数公式可以看出swish函数即为x*一个sigmoid(x)函数,sigmoid函数onnx是支持的,因此我们这里对swish进行转换,从而使pytorch模型成功转换为onnx模型

工程实现:
在Tensorflow中使用 x * tf.sigmoid(beta * x)或tf.nn.swish(x).
在Caffe中使用Scale+Sigmoid+EltWise(PROD)来实现或者合并成一个层.
在pytorch中使用x.mul_(x.sigmoid())

onnx不支持的操作还有如下:
onnx只能输出静态图,因此不支持if-else分支。一次只能走一个分支
onnx不支持步长为2的切片。例如a[::2,::2]
onnx不支持对切片对象赋值。例如a[0,:,:,:]=b, 可以用torch.cat改写
onnx里面的resize要求output shape必须为常量
不支持自定义的conv,支持conv1d,conv2d,conv3d
AdaptiveAvgPool2d : 使用AvgPool2d替换
Expand : torch.cat进行替换
ReLU6 : 通过relu改写;即 ReLU6 = 6.0 - nn.ReLU(inplace=True)(6.0-relu)
C++调用时数据类型要是32位浮点型

常用的激活函数
请添加图片描述参考:
https://blog.csdn.net/weixin_39421413/article/details/103083806
https://blog.csdn.net/qq_38978225/article/details/124587779
https://blog.csdn.net/weixin_38649779/article/details/122037115
https://blog.csdn.net/bblingbbling/article/details/107105648

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风华正茂6666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值