【问题解决】将pytorch模型及训练好的权重转换为onnx文件

本文介绍了ONNX的作用,展示了如何将PyTorch模型转换为ONNX格式,以及可能遇到的两个常见问题及其解决方法:缺失ONNX模块和运行时设备不匹配。

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

目录

1 ONNX是什么

2 pytorch模型转换为onnx文件

3 可能遇到的问题


1 ONNX是什么

ONNX(Open Neural Network Exchange)是一个开放的、跨平台的深度学习模型表示和转换工具。它的目标是使不同深度学习框架之间能够无缝地交换和使用模型。ONNX 的设计思想是将深度学习模型表示为计算图,其中节点表示操作(如卷积、池化等),边表示数据流动。这个计算图可以在不同的深度学习框架之间共享和执行。

在跨平台和跨框架使用模型、模型加速、模型在客户处部署时,经常需要用到onnx格式的模型。

2 pytorch模型转换为onnx文件

这里提供一种自定义pytorch模型和训练参数打包转换为onnx文件的方法。

import torch.onnx
import onnx

from models import MyModel  # 导入你的模型

Load_Path = 'my_dict_path.tar'  # 训练好的模型权重文件保存位置
Save_Path = 'my_file_path.onnx'  # 想要存放onnx文件的位置

# 实例化模型并加载权重
model = MyModel()
model.load_state_dict(torch.load(Load_Path, map_location=torch.device('cuda')))
model.eval()

# 定义示例输入
input_sample = torch.rand(1, 3, 64, 224, 224)

# 将模型转换为 ONNX 格式
torch.onnx.export(model, input_sample, Save_Path, 
                  verbose=True, input_names=['input'], output_names=['output'])

print("Model converted to ONNX format and saved to", Save_Path)

定义示例输入应与实际输入大小匹配。 

verbose参数用于控制程序输出的详细程度。当设置为True时,程序会输出更多的信息和细节。当设置为False时,程序的输出会更加简洁,只显示必要的信息。

3 可能遇到的问题

在写的过程中遇到了一些问题。

1

仅直接导入torch.onnx运行可能会报错

File"C:\Users\***\AppData\Local\Programs\Python\Python39\lib\torch\onnx\_internal\onnx_proto_utils.py", line 221, in _add_onnxscript_fn raise errors.OnnxExporterError("Module onnx is not installed!") from e torch.onnx.errors.OnnxExporterError: Module onnx is not installed!

先使用pip install onnx安装onnx包即可。

2

RuntimeError: Attempting to deserialize object on CUDA device 1 but torch.cuda.device_count() is 1. Please use torch.load with map_location to map your storages to an existing device

这个错误通常发生在你尝试加载一个在不同 GPU 设备上训练过的模型参数时。由于当前系统只有一个 GPU 设备,而模型参数保存在了另一个 GPU 设备上,所以导致了这个错误。

为了解决这个问题,可以在使用torch.load函数时,通过map_location参数将模型参数映射到当前可用的设备。

### 将PyTorch模型转换ONNX格式 为了将训练好的PyTorch `.pth` 模型文件转换ONNX 格式,需遵循一系列特定的操作流程。此过程不仅涉及加载已有的 PyTorch 模型并设置其进入评估模式,还需要准备一个输入张量作为示例数据来追踪模型的计算图以便于成功导出至 ONNX 文件。 #### 加载预训练模型 首先,确保已经安装了必要的库 `torch`, `onnx`. 接下来,加载之前保存的 `.pth` 模型文件,并将其置于评估模式下: ```python import torch from torchvision import models model = models.efficientnet_v2_s(pretrained=False) # 假设使用的是 EfficientNet V2 S 模型 checkpoint = torch.load('path_to_model.pth', map_location=torch.device('cpu')) model.load_state_dict(checkpoint['state_dict']) model.eval() ``` #### 准备输入张量 创建一个随机张量或实际测试图片对应的张量作为样例输入给定形状 `(batch_size, channels, height, width)`: ```python dummy_input = torch.randn(1, 3, 224, 224) ``` #### 导出为ONNX格式 利用 `torch.onnx.export()` 方法执行转换操作,在这里可以选择是否加入运算符集版本号和其他选项如简化输出等;对于某些架构可能还需指定额外参数以确保正确性: ```python input_names = ["actual_input_0"] + ["learned_%d" % i for i in range(16)] output_names = ["output"] dynamic_axes = {'actual_input_0': {0: 'batch_size'}, 'output': {0: 'batch_size'}} torch.onnx.export(model, dummy_input, "efficientnetv2s.onnx", export_params=True, opset_version=11, do_constant_folding=True, input_names=input_names, output_names=output_names, dynamic_axes=dynamic_axes) ``` 通过上述步骤可完成从 PyTorchONNX转换工作[^1]。值得注意的是,在处理具体问题时应根据实际情况调整代码中的细节部分,比如路径名、模型初始化方式及输入尺寸等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值