torch->onnx

参考:
参考连接:https://blog.csdn.net/cxx654/article/details/123011332

1 安装 onnx

>python -m pip install onnx

>python -m pip install onnxruntime

调用onnx

ModuleNotFoundError: No module named 'onnx.defs'

2 原理

I onnx是通用规则的部署格式

  所以oneflow ,pytorch等等都需要转onnx。

II 调用export接口转onnx

  onnxruntime执行

3  代码工程

  导入模块

import os
import numpy
import torch
from torch import nn
import torch.optim as opt
import onnxruntime as ort
import onnx

module

  3.1 定义NN

    1)def forward中的输入x  训练时输入多少维度就是多少维度。

        比如for 循环内x的维度为 [batchsize=10, channel =3, height=256, weight=256]

    2)def forward中的输入x 不需要考虑循环batchsize , 不用取单次batchsize=1.

    3)输出的return [batchsize 还是10, ...,...,...]

    4)CONV与linear之间 有个拍平的过程,

      self.flat = nn.Flatten(start_dim=1)
    代码

class SC(nn.Module):
"""
input shape = [n, 3, 8, 8] conv->
"""
def __init__(self):
super(SC, self).__init__()
self.cv1 = nn.Conv2d(in_channels=3,
out_channels=10,
kernel_size=3,
bias=True)
self.flat = nn.Flatten(start_dim=1)
# 2分类
self.fc1 = nn.Linear(360, 2) def forward(self, x):
# 1 输入batch原来一样
print("entry========", x.shape)
# 2 实际计算时会batch=1计算结果
# 3 返回原来batch,各个结果。
x_ = self.cv1(x)
x_ = self.flat(x_)
x_ = self.fc1(x_)
return x_

NN

    5)定义NN 与 训练教程 与训练过程是分开的

      比如以上代码为定义NN

      训练教程和训练过程 不定义在类中

# 训练 配置
opter = opt.Adam(sc.parameters(), lr=0.03)
loss = nn.CrossEntropyLoss()
# for 训练过程

train 组件

  3.2 保存为输入尺寸固定的onnx

    优点:量化时候比较容易

    注意:1) torch.load(model) model的类一定要导入或就在同文件。 和torch中的pickel策略有关。

  3.3 保存为动态尺寸的onnx

    带有实验 给固定参数的onnx ,输入batchsize=另外的数值, 会显示错误

batchsize = 100
x = torch.randn(size=(batchsize, 3, 8, 8))
model_out = sc(x)
print(model_out) # 什么时候 with torch.no_grad()???
os.makedirs("zandir", exist_ok=True) def gen_static():
torch.onnx.export(sc,
x,
"zandir\sc.onnx",
opset_version=11,
input_names=["inp"],
output_names=["opt"]) # 生成动态尺寸
def gen_dynamic():
dynamic_axes = {"inp": {0: "batchsize"}, "opt": {0: "batchsize"}}
torch.onnx.export(sc,
x,
"zandir\sc_dyn.onnx",
opset_version=11,
dynamic_axes=dynamic_axes,
input_names=["inp"],
output_names=["opt"]) # 测试导出静态模型传入非100 batchsize 是否报错
def load_static():
model = onnx.load("zandir\sc.onnx")
r = onnx.checker.check_model(model)
print("r===", r) def load_and_run_onnx_static():
model = onnx.load("zandir\sc.onnx")
session = ort.InferenceSession("zandir\sc.onnx")
# x = numpy.random.randn(100,3,8,8).astype(numpy.float32)
x = numpy.random.randn(16,3,8,8).astype(numpy.float32)
inputdata = {"inp": x}
output = session.run(None, inputdata)
print(len(output))
print(output[0]) def load_and_run_onnx_dyn():
session = ort.InferenceSession("zandir\sc_dyn.onnx")
# x = numpy.random.randn(100,3,8,8).astype(numpy.float32)
x = numpy.random.randn(16,3,8,8).astype(numpy.float32)
inputdata = {"inp": x}
output = session.run(None, inputdata)
print(len(output))
print(output[0]) gen_static()
gen_dynamic()
load_static()
# load_and_run_onnx_static()
load_and_run_onnx_dyn()

save_onnx

    

    



    

:)torch转onnx总结--|的更多相关文章

  1. pytorch1.0 用torch script导出模型

    python的易上手和pytorch的动态图特性,使得pytorch在学术研究中越来越受欢迎,但在生产环境,碍于python的GIL等特性,可能达不到高并发.低延迟的要求,存在需要用c++接口的情况. ...

  2. pytorch转onnx问题

    Fail to export the model in PyTorch https://github.com/onnx/tutorials/blob/master/tutorials/PytorchA ...

  3. 使用ONNX将模型转移至Caffe2和移动端

    使用ONNX将模型转移至Caffe2和移动端 本文介绍如何使用 ONNX 将 PyTorch 中定义的模型转换为 ONNX 格式,然后将其加载到 Caffe2 中.一旦进入 Caffe2, 就可以运行 ...

  4. 从PyTorch到ONNX的端到端AlexNet

    从PyTorch到ONNX的端到端AlexNet 这是一个简单的脚本,可将Torchvision中定义的经过预训练的AlexNet导出到ONNX中.运行一轮推理Inference,然后将生成的跟踪模型 ...

  5. 【推理引擎】ONNX 模型解析

    定义模型结构 首先使用 PyTorch 定义一个简单的网络模型: class ConvBnReluBlock(nn.Module): def __init__(self) -> None: su ...

  6. 实践torch.fx第二篇-fx量化实操

    好久不见各位,哈哈,又鸽了好久. 本文紧接上一篇<实践torch.fx第一篇--基于Pytorch的模型优化量化神器>继续说,主要讲如何利用FX进行模型量化. 为什么这篇文章拖了这么久,有 ...

  7. 【YOLOv5】手把手教你使用LabVIEW ONNX Runtime部署 TensorRT加速,实现YOLOv5实时物体识别(含源码)

    前言 上一篇博客给大家介绍了LabVIEW开放神经网络交互工具包[ONNX],今天我们就一起来看一下如何使用LabVIEW开放神经网络交互工具包实现TensorRT加速YOLOv5. 以下是YOLOv ...

  8. [深度学习] Pytorch模型转换为onnx模型笔记

    本文主要介绍将pytorch模型准确导出为可用的onnx模型.以方便OpenCV Dnn,NCNN,MNN,TensorRT等框架调用.所有代码见:Python-Study-Notes 文章目录 1 ...

  9. Torch Problems: require some packages doesn't work

    I've recently got a problem. require 'cutorch' doesn't work. But it was ok yesterday, although I hav ...

  10. Torch学习笔记1--Torch简介

    Torch是什么 Torch是一个由Lua语言开发的深度学习框架,目前支持Mac OS X 和Ubuntu 12及以上,官网 ,github地址. 具有如下特点: 交互式开发工具 可视化式的工具 第三 ...

随机推荐

  1. nginx中多ip多域名多端口配置

    1.Nginx中多IP配置: server { listen 80; server_name 192.168.15.7; location / { root /opt/Super_Marie; ind ...

  2. Linux的终端(base),进入base环境

    正常界面,如下 带有(base) 一般是由于安装了conda环境管理软件,它自带一个base环境.第一次安装时出现这种情况可能是由于软件将启动base环境的命令写入-/.bashrc 文件,这就相当于 ...

  3. SAP SMARTFORMS World格式白屏

    解决方法: SE38 RSCPSETEDITOR 不勾选SAP script 和智能表

  4. elasticsearch 安装与配置

    一.JAVA 与 elasticsearch 的版本对应 个人实测能够对应起来的版本: elasticsearch-rtf-2.2.1 需要 JDK7 或更低的版本,推荐使用 7 elasticsea ...

  5. mysql 根据父id查询下级所有数据

    select id,apply_resource_name from ( select t1.id,t1.apply_resource_name, if(find_in_set(parent_id, ...

  6. C# DevExpress GridControl中BandedGridView表格使用

    1.设计器方式创建 1.点击"Change view">>然后在选中"Convert to"选项>>最后选中点击"Banded ...

  7. python判断文件后缀名

    endswith()方法 利用文件名或路径名对文件后缀进行判断,例如对文件名后缀是否为.jpg的文件进行判断. path = "file.jpg" bool = path.ends ...

  8. DRF排序

    排序 对于列表数据,REST framework提供了OrderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序. 使用方法: 在类视图中设置filter_backends, 使用 ...

  9. Codeforces 919E Congruence Equation(循环节+数论)

    Link 题意 给$n, m, p, x$,求有多少个$n(1\leq n \leq x)$使得$n·a^{n}=b(\textrm{mod}\;p)$成立 思路 考虑一下左边的循环节长度,由于$n% ...

  10. 《黑马旅游网》综合案例六 BaseServlet 抽取

    BaseServlet抽取 减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet, 相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同 ...