0

0

如何将PyTorch ResNet50模型导出为支持动态batch size的ONNX格式?

花韻仙語

花韻仙語

发布时间:2025-03-10 11:36:14

|

720人浏览过

|

来源于php中文网

原创

如何将pytorch resnet50模型导出为支持动态batch size的onnx格式?

本文阐述如何将PyTorch ResNet50模型导出为支持动态batch size的ONNX格式。 我们将解决导出过程中可能遇到的与动态batch size相关的难题。 原始代码中存在一些问题,例如imageretrievalnet类中未使用的self.lwhiten属性和gem类中使用parameter类型的self.p属性,这些都可能导致ONNX导出失败。

ONNX导出对动态形状和特定PyTorch操作符的处理有限制。gem类中self.p作为可学习参数,以及imageretrievalnet类中冗余属性,会增加导出复杂度,导致形状推断错误。

为了解决这些问题,我们需要修改代码:移除imageretrievalnet类中无用的self.lwhiten属性,并将gem类中的self.p属性改为常量赋值。 修改后的代码如下:

CA.LA
CA.LA

第一款时尚产品在线设计平台,服装设计系统

下载
import torch
import torch.nn as nn
from torchvision import models

class gem(nn.Module):
    def __init__(self, p=3, eps=1e-6):
        super(gem, self).__init__()
        self.p = p  # p设置为常量
        self.eps = eps

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        return torch.pow(torch.mean(torch.pow(x, self.p), dim=1, keepdim=True) + self.eps, 1/self.p)

class l2n(nn.Module):
    def __init__(self):
        super(l2n, self).__init__()

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        return x / torch.norm(x, p=2, dim=1, keepdim=True)

class ImageRetrievalNet(nn.Module):
    def __init__(self, dim: int = 512):
        super(ImageRetrievalNet, self).__init__()
        resnet50_model = models.resnet50()
        features = list(resnet50_model.children())[:-2]
        self.features = nn.Sequential(*features)
        self.pool = gem()
        self.whiten = nn.Linear(2048, dim, bias=True)
        self.norm = l2n()

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        o: torch.Tensor = self.features(x)
        pooled_t = self.pool(o)
        normed_t: torch.Tensor = self.norm(pooled_t)
        o: torch.Tensor = normed_t.squeeze(-1).squeeze(-1)
        if self.whiten is not None:
            whitened_t = self.whiten(o)
            normed_t: torch.Tensor = self.norm(whitened_t)
            o = normed_t
        return o.permute(1, 0)

通过这些修改,我们解决了ONNX导出过程中遇到的动态形状和参数类型不匹配问题。 现在,可以使用以下代码将修改后的模型导出为支持动态batch size的ONNX格式:

model = ImageRetrievalNet()
batch_size = 1  # 使用1进行测试,实际部署时batch size可变
input_shape = (batch_size, 3, 224, 224)
input_data = torch.randn(input_shape)
torch.onnx.export(
    model,
    input_data,
    "resnet50.onnx",
    input_names=["input"], output_names=["output"],
    opset_version=12,
    dynamic_axes={"input": {0: "batch_size"}, "output": {0: "batch_size"}}
)

修改后的代码能够成功导出ONNX模型并支持动态batch size,主要是因为消除了阻碍动态形状推断的因素,从而使ONNX导出过程顺利完成。 请确保已安装必要的库:torch, torchvision, onnx.

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1494

2023.10.24

pytorch是干嘛的
pytorch是干嘛的

pytorch是一个基于python的深度学习框架,提供以下主要功能:动态图计算,提供灵活性。强大的张量操作,实现高效处理。自动微分,简化梯度计算。预构建的神经网络模块,简化模型构建。各种优化器,用于性能优化。想了解更多pytorch的相关内容,可以阅读本专题下面的文章。

432

2024.05.29

Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

24

2025.12.22

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

29

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

117

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

178

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

16

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

70

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号