广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python torch.onnx.export用法详细介绍
  • 197
分享到

Python torch.onnx.export用法详细介绍

2024-04-02 19:04:59 197人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录函数原型参数介绍mode (torch.nn.Module, torch.jit.ScriptModule or torch.jit.ScriptFunction)args (t

函数原型

参数介绍

mode (torch.nn.Module, torch.jit.ScriptModule or torch.jit.ScriptFunction)

需要转换的模型,支持的模型类型有:torch.nn.Module, torch.jit.ScriptModule or torch.jit.ScriptFunction

args (tuple or torch.Tensor)

args可以被设置成三种形式

1.一个tuple

args = (x, y, z)

这个tuple应该与模型的输入相对应,任何非Tensor的输入都会被硬编码入onnx模型,所有Tensor类型的参数会被当做onnx模型的输入。

2.一个Tensor

args = torch.Tensor([1, 2, 3])

一般这种情况下模型只有一个输入

3.一个带有字典的tuple

args = (x,
        {'y': input_y,
         'z': input_z})

这种情况下,所有字典之前的参数会被当做“非关键字”参数传入网络,字典种的键值对会被当做关键字参数传入网络。如果网络中的关键字参数未出现在此字典中,将会使用默认值,如果没有设定默认值,则会被指定为None。

NOTE:

一个特殊情况,当网络本身最后一个参数为字典时,直接在tuple最后写一个字典则会被误认为关键字传参。所以,可以通过在tuple最后添加一个空字典来解决。

#错误写法:
 
torch.onnx.export(
    model,
    (x,
     # WRONG: will be interpreted as named arguments
     {y: z}),
    "test.onnx.pb")
 
# 纠正
 
torch.onnx.export(
    model,
    (x,
     {y: z},
     {}),
    "test.onnx.pb")

f

一个文件类对象或一个路径字符串,二进制的protocol buffer将被写入此文件

export_params (bool, default True)

如果为True则导出模型的参数。如果想导出一个未训练的模型,则设为False

verbose (bool, default False)

如果为True,则打印一些转换日志,并且onnx模型中会包含doc_string信息。

training (enum, default TrainingMode.EVAL)

枚举类型包括:

TrainingMode.EVAL - 以推理模式导出模型。

TrainingMode.PRESERVE - 如果model.training为False,则以推理模式导出;否则以训练模式导出。

TrainingMode.TRAINING - 以训练模式导出,此模式将禁止一些影响训练的优化操作。

input_names (list of str, default empty list)

按顺序分配给onnx图的输入节点的名称列表。

output_names (list of str, default empty list)

按顺序分配给onnx图的输出节点的名称列表。

operator_export_type (enum, default None)

默认为OperatorExportTypes.ONNX, 如果PyTorch built with DPYTORCH_ONNX_CAFFE2_BUNDLE,则默认为OperatorExportTypes.ONNX_ATEN_FALLBACK。

枚举类型包括:

OperatorExportTypes.ONNX - 将所有操作导出为ONNX操作。

OperatorExportTypes.ONNX_FALLTHROUGH - 试图将所有操作导出为ONNX操作,但碰到无法转换的操作(如onnx未实现的操作),则将操作导出为“自定义操作”,为了使导出的模型可用,运行时必须支持这些自定义操作。支持自定义操作方法见链接。

OperatorExportTypes.ONNX_ATEN - 所有ATen操作导出为ATen操作,ATen是Pytorch的内建tensor库,所以这将使得模型直接使用Pytorch实现。(此方法转换的模型只能被Caffe2直接使用)

OperatorExportTypes.ONNX_ATEN_FALLBACK - 试图将所有的ATen操作也转换为ONNX操作,如果无法转换则转换为ATen操作(此方法转换的模型只能被Caffe2直接使用)。例如:

# 转换前:
graph(%0 : Float):
  %3 : int = prim::Constant[value=0]()
  # conversion unsupported
  %4 : Float = aten::triu(%0, %3)
  # conversion supported
  %5 : Float = aten::mul(%4, %0)
  return (%5)
 
 
# 转换后:
graph(%0 : Float):
  %1 : Long() = onnx::Constant[value={0}]()
  # not converted
  %2 : Float = aten::ATen[operator="triu"](%0, %1)
  # converted
  %3 : Float = onnx::Mul(%2, %0)
  return (%3)

opset_version (int, default 9)

默认是9。值必须等于_onnx_main_opset或在_onnx_stable_opsets之内。具体可在torch/onnx/symbolic_helper.py中找到。例如:

_default_onnx_opset_version = 9
 
_onnx_main_opset = 13
 
_onnx_stable_opsets = [7, 8, 9, 10, 11, 12]
 
_export_onnx_opset_version = _default_onnx_opset_version

do_constant_folding (bool, default False)

是否使用“常量折叠”优化。常量折叠将使用一些算好的常量来优化一些输入全为常量的节点。

example_outputs (T or a tuple of T, where T is Tensor or convertible to Tensor, default None)

当需输入模型为ScriptModule 或 ScriptFunction时必须提供。此参数用于确定输出的类型和形状,而不跟踪(tracing )模型的执行。

dynamic_axes (dict<string, dict<Python:int, string>> or dict<string, list(int)>, default empty dict)

通过以下规则设置动态的维度:

KEY(str) - 必须是input_names或output_names指定的名称,用来指定哪个变量需要使用到动态尺寸。

VALUE(dict or list) - 如果是一个dict,dict中的key是变量的某个维度,dict中的value是我们给这个维度取的名称。如果是一个list,则list中的元素都表示此变量的某个维度。

具体可参考如下示例:

class SumModule(torch.nn.Module):
    def forward(self, x):
        return torch.sum(x, dim=1)
 
# 以动态尺寸模式导出模型
 
torch.onnx.export(SumModule(), (torch.ones(2, 2),), "onnx.pb",
                  input_names=["x"], output_names=["sum"],
                  dynamic_axes={
                      # dict value: manually named axes
                      "x": {0: "my_custom_axis_name"},
                      # list value: automatic names
                      "sum": [0],
                  })
 
### 导出后的节点信息
 
##input
 
input {
  name: "x"
  ...
      shape {
        dim {
          dim_param: "my_custom_axis_name"  # axis 0
        }
        dim {
          dim_value: 2  # axis 1
...
 
##output
output {
  name: "sum"
  ...
      shape {
        dim {
          dim_param: "sum_dynamic_axes_1"  # axis 0
...
 

keep_initializers_as_inputs (bool, default None)

NONE

custom_opsets (dict<str, int>, default empty dict)

NONE

Torch.onnx.export执行流程:

1、如果输入到torch.onnx.export的模型是nn.Module类型,则默认会将模型使用torch.jit.trace转换为ScriptModule

2、使用args参数和torch.jit.trace将模型转换为ScriptModule,torch.jit.trace不能处理模型中的循环和if语句

3、如果模型中存在循环或者if语句,在执行torch.onnx.export之前先使用torch.jit.script将nn.Module转换为ScriptModule

4、模型转换成onnx之后,预测结果与之前会有稍微的差别,这些差别往往不会改变模型的预测结果,比如预测的概率在小数点之后五六位有差别。

总结

到此这篇关于Python torch.onnx.export用法详细介绍的文章就介绍到这了,更多相关Python torch.onnx.export用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python torch.onnx.export用法详细介绍

本文链接: https://www.lsjlt.com/news/119508.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python torch.onnx.export用法详细介绍
    目录函数原型参数介绍mode (torch.nn.Module, torch.jit.ScriptModule or torch.jit.ScriptFunction)args (t...
    99+
    2022-11-11
  • JavaInheritableThreadLocal用法详细介绍
    目录简介问题复现解决方案源码分析注意简介 本文介绍InheritableThreadLocal的用法。 ThreadLocal可以将数据绑定当前线程,如果希望当前线程的ThreadL...
    99+
    2022-11-13
  • 详细介绍python类及类的用法
    目录一、类的成员1.1 类的属性1.1.1 静态属性的创建方式1.1.2 实例属性1.2 类的方法二、类成员的修饰符三、类的特殊成员3.1 __doc__3.2  ...
    99+
    2022-11-12
  • Python列表list的详细用法介绍
    目录一. 创建列表1.1 第一种1.2 第二种二. 查询列表2.1 获取列表元素索引2.2 获取列表单个元素2.3 获取列表多个元素2.3 判断元素是否存在于列表三. 列表添加操作四...
    99+
    2022-11-11
  • Java 方法(详细介绍)
    那么什么是方法呢?Java方法是语句的集合,它们在一起执行一个功能。 (推荐学习:java课程)方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点 使程序变得更...
    99+
    2017-06-19
    java教程 Java
  • python语法-def()详细介绍(特别全)
    1. 什么是函数 在 Python 中,函数是一种可重用的代码块,用于执行特定的任务或操作。函数可以接受输入参数,并返回输出结果,从而实现模块化和封装性编程的目的。Python 中定义函数的语法如下: def function_name(p...
    99+
    2023-09-09
    python 开发语言
  • fastjson 使用方法详细介绍
    Fastjson介绍Fastjson是一个Java语言编写的JSON处理器。遵循http://json.org标准,为其官方网站收录的参考实现之一。功能qiang打,支持JDK的各种类型,包括基本的JavaBean、Collection、M...
    99+
    2023-05-30
    fastjson 使用
  • Android ADB详细介绍及用法
    Android ADB 用法 adb  全称是 Android Debug Bridge, 就是起到调试桥的作用。 用来操作android设备的 阅读目录 ad...
    99+
    2022-06-06
    adb Android
  • Python中栈的详细介绍
    目录1、问题描述2、解决方案3、结语本文转自公众号:"算法与编程之美" 1、问题描述 Python中数据类型有列表,元组,字典,队列,栈,树等等。像列表,元组这样的都是python内...
    99+
    2022-11-12
  • Python 模块EasyGui详细介绍
    Python 模块EasyGui详细介绍 前言: 在Windows想用Python开发一些简单的界面,所以找到了很容易上手的EasyGui库。下面就分享一下简单的使用吧。 参考的链接:官网Tutorial ...
    99+
    2022-06-04
    详细介绍 模块 Python
  • Python Socket编程详细介绍
    在使用Python做socket编程时,由于需要使用阻塞(默认)的方式来读取数据流,此时对于数据的结束每次都需要自己处理,太麻烦。并且网上也没找到太好的封装,所以就自己写了个简单的封装。 封装思路 1....
    99+
    2022-06-04
    详细介绍 Python Socket
  • Python 字典(Dictionary)详细介绍
    目录1.访问字典里的值2.修改字典3.删除字典元素3.1字典键的特性4.字典内置函数&方法字典是另一种可变容器模型,且可存储任意类型对象。 字典的每个键值 key=>v...
    99+
    2022-11-13
  • Python装饰器详细介绍
    目录装饰器一、介绍二、通过高阶函数+嵌套函数==>实现装饰器1、变量知识回顾2、高阶函数(装饰器前奏)3、嵌套函数(装饰器前戏)三、装饰器1、装饰器2、有参装饰器3、终极装饰器...
    99+
    2022-11-13
  • Android onCreate( )方法详细介绍
    onCreate( )方法是android应用程序中最常见的方法之一,那么,我们在使用onCreate()方法的时候应该注意哪些问题呢?     ...
    99+
    2022-06-06
    方法 Android
  • Python 内置logging 使用详细介绍
    目录logging 的主要作用logging 日志等级logging 的基础函数logging 的四大组件(类)logging 的配置logging 和 print 的区别主要参考资...
    99+
    2022-11-11
  • JSON基础介绍与详细用法
    一、什么是JSON 1、JSON指的是JavaScript对象表示法(JavaScript Object Notation)。2、JSON是轻量级的文本数据交换格式,比XML更小、更...
    99+
    2022-11-13
  • 详细介绍Github的使用方法
    随着互联网技术的不断发展,越来越多的开发者开始加入到开源项目中,Github作为目前全球最大的代码托管平台之一,也成为了开发者们分享、学习、合作的重要工具之一。然而,如何使用Github来进行代码管理、版本控制、协作开发等,还是很多新手开发...
    99+
    2023-10-22
  • Vuex详细介绍和使用方法
    目录一、什么是Vuex二、运行机制三、创建项目1、使用脚手架搭建Vue项目2、安装Vuex3、启动项目4、配置使用Vuex4.1、创建store文件夹4.2、配置全局使用store对...
    99+
    2022-11-13
  • 详细介绍HTML的基本用法
    HTML是一种基本的网页设计语言,是创建网页的重要工具之一。对于想要学习HTML的初学者来说,了解HTML的基本用法是至关重要的。本文将详细介绍HTML的基本用法,让你轻松入手。一、HTML的基本概念HTML,全称是HyperText Ma...
    99+
    2023-05-14
  • React Immutable使用方法详细介绍
    目录1. 介绍2. 优缺点3. 对象处理4. 数组处理5. 优化组件渲染6. immutable和redux集合使用1. 介绍 假设当前 redux 的大小为 1G,现在要修改 re...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作