PyTorch开放神经网络交换(Open Neural Network Exchange)ONNX通用格式模型的熟悉

这篇具有很好参考价值的文章主要介绍了PyTorch开放神经网络交换(Open Neural Network Exchange)ONNX通用格式模型的熟悉。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们在深度学习中可以发现有很多不同格式的模型文件,比如不同的框架就有各自的文件格式:.model、.h5、.pb、.pkl、.pt、.pth等等,各自有标准就带来互通的不便,所以微软、Meta和亚马逊在内的合作伙伴社区一起搞一个ONNX(Open Neural Network Exchange)文件格式的通用标准,这样就可以使得模型在不同框架之间方便的进行互操作了。
在上节的YOLOv8的目标对象的分类,分割,跟踪和姿态估计的多任务检测实践(Netron模型可视化) 我们在最后有接触到这个格式文件,而且给出了一个 https://netron.app/站点,可以将这个文件的计算图和相关属性都能可视化的给呈现出来。YOLO的模型有自带的方法:

from ultralytics import YOLO
model = YOLO('yolov8n-cls.pt')
model.export(format="onnx")

或者命令行的方式
yolo export model=yolov8n-cls.pt format=onnx

1、PyTorch演示onnx

这里我们来熟悉下在PyTorchonnx是怎么样的。看一个简单示例:

import torch

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

    def forward(self, x):
        return x.reshape(1,3,64,64)

model = myModel()
x = torch.randn(64,64,3)
torch.onnx.export(model, x, 'newmodel.onnx', input_names=['images'], output_names=['newimages'])

修改输入进来的形状,可以看到通过torch.onnx.export就可以生成onnx格式的模型文件。我们将它上传到上面的站点,将会生成如下的流程图:

PyTorch开放神经网络交换(Open Neural Network Exchange)ONNX通用格式模型的熟悉,深度学习框架(PyTorch),ONNX格式,onnx.export,onnx.load,豆瓣镜像安装,onnx.helper

 我们打印看下export方法有哪些参数:

export(model: 'Union[torch.nn.Module, torch.jit.ScriptModule, torch.jit.ScriptFunction]', args: 'Union[Tuple[Any, ...], torch.Tensor]', f: 'Union[str, io.BytesIO]', export_params: 'bool' = True, verbose: 'bool' = False, training: '_C_onnx.TrainingMode' = <TrainingMode.EVAL: 0>, input_names: 'Optional[Sequence[str]]' = None, output_names: 'Optional[Sequence[str]]' = None, operator_export_type: '_C_onnx.OperatorExportTypes' = <OperatorExportTypes.ONNX: 0>, opset_version: 'Optional[int]' = None, do_constant_folding: 'bool' = True, dynamic_axes: 'Optional[Union[Mapping[str, Mapping[int, str]], Mapping[str, Sequence[int]]]]' = None, keep_initializers_as_inputs: 'Optional[bool]' = None, custom_opsets: 'Optional[Mapping[str, int]]' = None, export_modules_as_functions: 'Union[bool, Collection[Type[torch.nn.Module]]]' = False) -> 'None'

2、加载onnx模型

2.1、安装onnx库

为了能够正确的加载onnx格式文件,需要先安装onnx库,依然推荐加豆瓣镜像安装

pip install onnx -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

安装好了之后,我们看下是否成功安装:

import onnx
dir(onnx)
'''
['Any', 'AttributeProto', 'EXPERIMENTAL', 'FunctionProto', 'GraphProto', 'IO', 'IR_VERSION', 'IR_VERSION_2017_10_10', 'IR_VERSION_2017_10_30', 'IR_VERSION_2017_11_3', 'IR_VERSION_2019_1_22', 'IR_VERSION_2019_3_18', 'IR_VERSION_2019_9_19', 'IR_VERSION_2020_5_8', 'IR_VERSION_2021_7_30', 'MapProto', 'ModelProto', 'NodeProto', 'ONNX_ML', 'OperatorProto', 'OperatorSetIdProto', 'OperatorSetProto', 'OperatorStatus', 'Optional', 'OptionalProto', 'STABLE', 'SequenceProto', 'SparseTensorProto', 'StringStringEntryProto', 'TensorAnnotation', 'TensorProto', 'TensorShapeProto', 'TrainingInfoProto', 'TypeProto', 'TypeVar', 'Union', 'ValueInfoProto', 'Version', '_Proto', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_deserialize', '_get_file_path', '_load_bytes', '_save_bytes', '_serialize', 'checker', 'compose', 'convert_model_to_external_data', 'defs', 'external_data_helper', 'gen_proto', 'google', 'helper', 'hub', 'load', 'load_external_data_for_model', 'load_from_string', 'load_model', 'load_model_from_string', 'load_tensor', 'load_tensor_from_string', 'mapping', 'numpy_helper', 'onnx_cpp2py_export', 'onnx_data_pb', 'onnx_data_pb2', 'onnx_ml_pb2', 'onnx_operators_ml_pb2', 'onnx_operators_pb', 'onnx_pb', 'os', 'parser', 'printer', 'save', 'save_model', 'save_tensor', 'shape_inference', 'typing', 'utils', 'version', 'version_converter', 'write_external_data_tensors']
'''

2.2、onnx模型信息

正确安装之后,就可以加载模型了。

import onnx

myModel = onnx.load("newmodel.onnx")
#打印整个模型信息
#print(myModel)
output = myModel.graph.output
#打印输出层的信息
print(output)

[name: "newimages"
type {
  tensor_type {
    elem_type: 1
    shape {
      dim {
        dim_value: 1
      }
      dim {
        dim_value: 3
      }
      dim {
        dim_value: 64
      }
      dim {
        dim_value: 64
      }
    }
  }
}
]

2.3、加载外部数据

需要注意的是,外部数据如果跟模型文件不是在同一个目录里面的话,需要使用load_external_data_for_model来加载外部数据

import onnx
from onnx.external_data_helper import load_external_data_for_model

mymodel = onnx.load('xx/model.onnx', load_external_data=False)
load_external_data_for_model(mymodel, 'datasets/')

这样就可以通过mymodel这个模型来加载指定目录的数据了。

3、保存新模型

我们可以试着在模型的基础上做一些修改,然后保存为一个新的模型文件。

import onnx
from onnx import helper

model = onnx.load('newmodel.onnx')
prob_info = helper.make_tensor_value_info('xx',onnx.TensorProto.FLOAT, [1,3,128,128])
model.graph.output.insert(0, prob_info)
onnx.save(model, 'newmodel2.onnx')

将一个新的节点插入到输出层,我们来看下生成的图:

PyTorch开放神经网络交换(Open Neural Network Exchange)ONNX通用格式模型的熟悉,深度学习框架(PyTorch),ONNX格式,onnx.export,onnx.load,豆瓣镜像安装,onnx.helper

其中helper里面有很多用法,比如增加节点:

node = helper.make_node("Range",inputs=["start", "limit", "delta"],outputs=["output"])
start = np.float32(1)
limit = np.float32(15)
delta = np.float32(2)
output = np.arange(start, limit, delta, dtype=np.float32)
print(output)#[ 1.  3.  5.  7.  9. 11. 13.]

这里的Range是其中一个操作类型(算子),用法:Operators 更多的操作类型,有兴趣的可以进去查阅

4、常见对象

在onnix常出现的几个对象,AttributeProto,TensorProto,GraphProto,NodeProto一起来了解下:

4.1、AttributeProto 

属性

import onnx
from onnx import helper
from onnx import AttributeProto, TensorProto, GraphProto

arg = helper.make_attribute("this_is_an_int", 1701)
print(arg)
'''
name: "this_is_an_int"
type: INT
i: 1701
'''

当然类型还可以是浮点数、字符串、数组等

4.2、NodeProto

节点

node_proto = helper.make_node("Relu", ["X"], ["Y"])
print(node_proto)
'''
input: "X"
output: "Y"
op_type: "Relu"
'''

其中op_type的算子挺多的,比如上面那个Range的用法。

4.3、AttributeProto和NodeProto结合

看下两者结合使用的一个例子,卷积核为3,步幅为1,填充为1的一个卷积。 

node_proto = helper.make_node(
    "Conv", ["X", "W", "B"], ["Y"],
    kernel=3, stride=1, pad=1)
# 属性按顺序打印
node_proto.attribute.sort(key=lambda attr: attr.name)
print(node_proto)
'''
input: "X"
input: "W"
input: "B"
output: "Y"
op_type: "Conv"
attribute {
  name: "kernel"
  type: INT
  i: 3
}
attribute {
  name: "pad"
  type: INT
  i: 1
}
attribute {
  name: "stride"
  type: INT
  i: 1
}
'''

另一种更有可读性的打印:

print(helper.printable_node(node_proto))
%Y = Conv[kernel = 3, pad = 1, stride = 1](%X, %W, %B)

4.4、TensorProto和GraphProto

graph_proto = helper.make_graph(
    [
        helper.make_node("FC", ["X", "W1", "B1"], ["H1"]),
        helper.make_node("Relu", ["H1"], ["R1"]),
        helper.make_node("FC", ["R1", "W2", "B2"], ["Y"]),
    ],
    "MLP",
    [
        helper.make_tensor_value_info("X" , TensorProto.FLOAT, [1]),
        helper.make_tensor_value_info("W1", TensorProto.FLOAT, [1]),
        helper.make_tensor_value_info("B1", TensorProto.FLOAT, [1]),
        helper.make_tensor_value_info("W2", TensorProto.FLOAT, [1]),
        helper.make_tensor_value_info("B2", TensorProto.FLOAT, [1]),
    ],
    [
        helper.make_tensor_value_info("Y", TensorProto.FLOAT, [1]),
    ]
)
print(helper.printable_graph(graph_proto))
'''
graph MLP (
  %X[FLOAT, 1]
  %W1[FLOAT, 1]
  %B1[FLOAT, 1]
  %W2[FLOAT, 1]
  %B2[FLOAT, 1]
) {
  %H1 = FC(%X, %W1, %B1)
  %R1 = Relu(%H1)
  %Y = FC(%R1, %W2, %B2)
  return %Y
'''

5、解析器

5.1、parse_graph

onnx.parser.parse_graph将文本表示,创建成ONNX图形

input = """
   agraph (float[N, 128] X, float[128, 10] W, float[10] B) => (float[N, 10] C)
   {
        T = MatMul(X, W)
        S = Add(T, B)
        C = Softmax(S)
   }
"""
graph = onnx.parser.parse_graph(input)
print(helper.printable_graph(graph))
'''
graph agraph (
  %X[FLOAT, Nx128]
  %W[FLOAT, 128x10]
  %B[FLOAT, 10]
) {
  %T = MatMul(%X, %W)
  %S = Add(%T, %B)
  %C = Softmax(%S)
  return %C
}
'''

 5.2、parse_model

onnx.parser.parse_model将文本表示,创建成ONNX模型

input = """
   <
     ir_version: 7,
     opset_import: ["" : 10]
   >
   agraph (float[N, 128] X, float[128, 10] W, float[10] B) => (float[N, 10] C)
   {
      T = MatMul(X, W)
      S = Add(T, B)
      C = Softmax(S)
   }
"""
model = onnx.parser.parse_model(input)
print(model)

'''
ir_version: 7
opset_import {
  domain: ""
  version: 10
}
graph {
  node {
    input: "X"
    input: "W"
    output: "T"
    op_type: "MatMul"
    domain: ""
  }
  node {
    input: "T"
    input: "B"
    output: "S"
    op_type: "Add"
    domain: ""
  }
  node {
    input: "S"
    output: "C"
    op_type: "Softmax"
    domain: ""
  }
  name: "agraph"
  input {
    name: "X"
    type {
      tensor_type {
        elem_type: 1
        shape {
          dim {
            dim_param: "N"
          }
          dim {
            dim_value: 128
          }
        }
      }
    }
  }
  input {
    name: "W"
    type {
      tensor_type {
        elem_type: 1
        shape {
          dim {
            dim_value: 128
          }
          dim {
            dim_value: 10
          }
        }
      }
    }
  }
  input {
    name: "B"
    type {
      tensor_type {
        elem_type: 1
        shape {
          dim {
            dim_value: 10
          }
        }
      }
    }
  }
  output {
    name: "C"
    type {
      tensor_type {
        elem_type: 1
        shape {
          dim {
            dim_param: "N"
          }
          dim {
            dim_value: 10
          }
        }
      }
    }
  }
}
'''

引用来源
github:https://github.com/onnx/onnx文章来源地址https://www.toymoban.com/news/detail-523972.html

到了这里,关于PyTorch开放神经网络交换(Open Neural Network Exchange)ONNX通用格式模型的熟悉的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 神经网络的学习(Neural Networks: Learning)

    案例:假设神经网络的训练样本有𝑚个,每个包含一组输入𝑥和一组输出信号𝑦,𝐿表示神经网络层数,𝑆𝐼表示每层的 neuron 个数(𝑆𝑙表示输出层神经元个数),𝑆𝐿代表最后一层中处理单元的个数。 将神经网络的分类定义为两种情况:二类分类和多类分类, 二类分

    2024年01月24日
    浏览(39)
  • 卷积神经网络CNN(Convolutional Neural Network)

    一、CNN与NN的区别 卷积神经网络与传统神经网络的区别: 二、CNN的整体架构 1.输入层;2.卷积层;3.池化层;4.全连接层 三、卷积层做了什么 首先将图形分割成一个个小区域,对于每一个区域特征不同;接下来选择一种特征计算的方法,为每一个区域计算特征值,得到特征图

    2024年02月04日
    浏览(75)
  • AIGC实战——卷积神经网络(Convolutional Neural Network, CNN)

    在深度学习一节中,我们使用 Keras

    2024年02月04日
    浏览(56)
  • 深度学习4. 循环神经网络 – Recurrent Neural Network | RNN

    目录 循环神经网络 – Recurrent Neural Network | RNN 为什么需要 RNN ?独特价值是什么? RNN 的基本原理 RNN 的优化算法 RNN 到 LSTM – 长短期记忆网络 从 LSTM 到 GRU RNN 的应用和使用场景 总结 百度百科+维基百科 卷积神经网络和普通的算法大部分都是输入和输出的一一对应,也就是一

    2024年02月11日
    浏览(45)
  • 神经网络语言模型(Neural Network Language Model,NNLM)

    神经网络语言模型(Neural Network Language Model,NNLM)是一种用神经网络建模语言的方法。NNLM 通过学习文本序列中的词汇之间的概率关系,能够捕捉到语言的结构和语境,从而能够生成自然语言文本或进行其他与语言相关的任务。 想象一下,你正在阅读一本小说。每当你读到一

    2024年02月02日
    浏览(43)
  • 物理信息神经网络PINNs : Physics Informed Neural Networks 详解

    本博客主要分为两部分: 1、PINN模型论文解读 2、PINN模型相关总结 基于物理信息的神经网络(Physics-informed Neural Network, 简称PINN),是一类用于解决有监督学习任务的神经网络,同时尊重由一般非线性偏微分方程描述的任何给定的物理规律。 原理 :它不仅能够像传统神经网

    2024年02月02日
    浏览(52)
  • 机器学习19:多类别神经网络-Multi-Class Neural Networks

    在【 机器学习12:分类 Classification 】一文中,笔者介绍了二元分类模型,它可以在两个可能的选择之一之间进行选择,例如: 电子邮件是垃圾邮件还是非垃圾邮件。 肿瘤是恶性的或良性的。 在本文中,我们将研究 多类 分类,它可以从多种可能性中进行选择。例如: 这只狗

    2024年02月12日
    浏览(43)
  • 【深度学习笔记】6_2 循环神经网络RNN(recurrent neural network)

    注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 上一节介绍的 n n n 元语法中,时间步 t t t 的词 w t w_t w t ​ 基于前面所有词的条件概率只考虑了最近时间步的 n − 1 n-1 n − 1 个词。如果要考虑比 t − ( n − 1 ) t-(n-1) t −

    2024年03月12日
    浏览(69)
  • 吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.1-3.5

    3.1 神经网络概述(Neural Network Overview) 本周你将学习如何实现一个神经网络。在我们深入学习具体技术之前,我希望快速的带你预览一下本周你将会学到的东西。如果这个视频中的某些细节你没有看懂你也不用担心,我们将在后面的几个视频中深入讨论技术细节。 现在我们

    2024年03月23日
    浏览(42)
  • 深度学习入门——深度卷积神经网络模型(Deep Convolution Neural Network,DCNN)概述

    机器学习是实现人工智能的方法和手段,其专门研究计算机如何模拟或实现人类的学习行为,以获取新的知识和技能,重新组织已有的知识结构使之不断改善自身性能的方法。计算机视觉技术作为人工智能的一个研究方向,其随着机器学习的发展而进步,尤其近10年来,以深

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包