ONNX (.onnx)

背景

    • 神经网络模型的开源格式.
    • 存储模型和各种元数据.
    • ONNX 是 Open Neural Network Exchange(开放式神经网络交换)的缩写.
    • 基于 Protobuf 的二进制文件
    • 由 Microsoft 和 Facebook 于 2017 年首次发布.

Import 与 Export

Import 参数

  • Import 通用参数:
  • "Elements" 该文件可用的参数和选项列表
    "Summary"文件摘要
    "Rules"所有可用参数的规则列表
  • Import 参数包括:
  • "ArrayAssociation"以关联形式导入参数
    "ArrayList"以列表形式导入参数
    "Description"每个序列基因座描述文本
    "ONNXGraph"网络的 ONNX 表示
    "ModelDomain"模型的命名空间或域名
    "ModelVersion"模型的整数版本数
    "Net"网络的 Wolfram 语言表示,包括所有初始数组(默认)
    "NetExternalObject"网络的 NetExternalObject 表示
    "IRVersion"模型使用的 ONNX 中间表示版本
    "OperatorSetVersion"运算符集模型兼容
    "ProducerName"用于生成模型的工具的名称
    "ProducerVersion"生成工具的版本
    "RawData"该文件的完整和未处理内容,其中包括图形表示和所有元数据
    "UninitializedNet"网络的 Wolfram 语言表示形式,不包含任何数组

选项

  • Import 选项:
  • "Arrays"None包含网络附加数组的有效 ONNX 张量原型文件的路径或路径列表
  • Export 选项:
  • "Description"NoneONNX 元数据中的模型文档字符串
    "ExternalArrays"Automatic将网络数组导出到不同的文件中
    "GraphName"AutomaticONNX 元数据中的图形名称
    "ModelVersion"0ONNX 元数据中的模型版本
    "OperatorSetVersion"Automatic模型使用的标准 ONNX 运算符集的版本
  • 选项 "ExternalArrays" 可被设为以下内容:
  • Automatic根据模型大小为网络数组创建外部文件
    None在模型文件中包括网络数组
    All将网络数组导出到不同的文件中,每个数组一个文件
    "Single"将所有网络数组导出到一个文件中
  • 当模型大小小于 2GB 时,将 "ExternalArrays" 设为 Automaticis 相当于 None,当大于 2GB 时相当于 "Single". 当设为 All"Single" 时,在主模型文件的同一目录中创建数组文件. 任何 ONNX 导入程序都希望此类文件位于相同的相对路径上.

范例

打开所有单元关闭所有单元

基本范例  (2)

以 ONNX 格式导入网络:

显示此文件中可用的 Import 元素:

将一个网导出为 ONNX 格式:

导入参数  (14)

ArrayAssociation  (1)

获取给定 ONNX 网络的名称映射到数组的关联:

ArrayList  (1)

获取给定 ONNX 网络的数组列表:

Description  (1)

获取给定 ONNX 网络的描述:

ONNXGraph  (1)

获取给定网络的 ONNX 表示形式:

ModelDomain  (1)

获取给定网络的 ONNX 模型域:

ModelVersion  (1)

获取给定网络的 ONNX 模型版本:

Net  (1)

将 ONNX 模型作为 Wolfram 语言网导入:

这是默认参数:

NetExternalObject  (1)

将 ONNX 模型导入为 NetExternalObject

IRVersion  (1)

获取给定网络的 ONNX 中间表示形式的版本:

OperatorSetVersion  (1)

获取给定网络使用的 ONNX 运算符集:

ProducerName  (1)

获取用于生成给定网络的工具的名称:

ProducerVersion  (1)

获取用于生成给定网络的工具的版本:

RawData  (1)

获取给定 ONNX 文件的全部未处理内容:

UninitializedNet  (1)

将 ONNX 模型导入为未初始化的 Wolfram 语言网络:

导入选项  (1)

"Arrays"  (1)

网络使用的数组可以包含在单独的 ONNX 张量原型文件中. 导入未初始化的网络:

通过指定一个阵列文件(可以在列表中指定多个阵列文件)将网络及其阵列导入:

导出选项  (5)

"Description"  (1)

指定模型描述元数据:

查看描述:

"ExternalArrays"  (1)

创建一个简单的网络并使用多个外部数组文件将其导出:

网络的每个数组都导出到以该数组命名的单独文件中,例如 "1_Weights"

主模型文件保留了所有数组文件的相对路径的记录,因此在导入模型时会自动包含数组:

将网络与所有外部数组导出到单个文件中:

名为 "Arrays" 被创建,其中包含网络的所有数组:

主模型文件保留了合并的数组文件的相对路径的记录,因此在导入模型时会自动包含数组:

当模型大小大于 2GB 时,会自动创建单个外部数组文件并发出警告消息:

"GraphName"  (1)

指定图名称元数据:

检查图形名称:

"ModelVersion"  (1)

指定模型版本元数据:

检查模型版本:

"OperatorSetVersion"  (1)

创建一个 PaddingLayer,并将其导出到运算符集 10 中:

查看运算符集的版本:

在运算符集 10 中,ONNX "Pad" 算符接受一个输入,其填充大小和值为静态属性:

可以把模型文件转换回来,因为 Import 支持运算符集 10:

将同一网络层导出到运算符集 11 中:

查看运算符集的版本:

在运算符集 11 中,"Pad" 算符的填充大小和值从属性移至输入. 该算符现在有两个额外的输入,并少了两个属性:

可以把模型文件转换回来,因为 Import 支持运算符集 11:

可能出现的问题  (1)

任何 NetEncoderNetDecoder 会自动被 Export 移除,ONNX 对其不支持. 创建一个 NetEncoderNetDecoder 的网络并将其导出:

将模型导回表明 NetEncoderNetDecoder 不存在: