Exporting the operator hardsigmoid to ONNX opset version 11 is not supported

博客主要讲述了在尝试将PyTorch的MobileNetV3模型转换为ONNX格式时遇到的RuntimeError,错误源于F.hardsigmoid函数在ONNX opset version 11中不受支持。作者提供了问题的解决方案,即用F.hardtanh替换F.hardsigmoid,并给出了修改后的SqueezeExcitation类的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

在将 MobileNetv3 模型从 PyTorch 转为 ONNX 时报错:

Error: RuntimeError: Exporting the operator hardsigmoid to ONNX opset version 11 is not supported. Please feel free to request support or submit a pull request on PyTorch GitHub.

运行环境:

PyTorch 版本:1.8.0

在网上找了很多文章,大部分都是写的一样的,就是将nn.Hardswish替换为自己实现的 Hardswitch,实际上,这个版本的 PyTorch 中,nn.Hardswish是可以转换成功的(老版本成不成功不清楚),报错的根本原因是 mobilenetv3 代码中使用了 F.hardsigmoid函数,解决办法是将代码中的 hardsigmoid 函数替换为 hardtanh 函数,如下:

class SqueezeExcitation(nn.Module):

    def __init__(self, input_channels: int, squeeze_factor: int = 4):
        super().__init__()
        squeeze_channels = _make_divisible(input_channels // squeeze_factor, 8)
        self.fc1 = nn.Conv2d(input_channels, squeeze_channels, 1)
        self.relu = nn.ReLU(inplace=True)
        self.fc2 = nn.Conv2d(squeeze_channels, input_channels, 1)

    def _scale(self, input: Tensor, inplace: bool) -> Tensor:
        scale = F.adaptive_avg_pool2d(input, 1)
        scale = self.fc1(scale)
        scale = self.relu(scale)
        scale = self.fc2(scale)
        return F.hardsigmoid(scale, inplace=inplace)  # 此行报错
        # return F.hardtanh(scale + 3, 0., 6., inplace=inplace) / 6.  # 更换为此行

    def forward(self, input: Tensor) -> Tensor:
        scale = self._scale(input, True)
        return scale * input

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值