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. 代码随想录算法训练营day04 | leetcode

    基础知识 记录一下栈实现及操作 public class ArrayDequeStack { public void main() { ArrayDeque stack = new ArrayDequ ...

  2. GPS地图生成02之经典算法体验

    经典的利用轨迹生成地图的算法与数据集可寻找于:Mapconstruction by pfoser Mapconstruction by pfoser数据集中,雅典数据集投影坐标系为(UTM, GGRS ...

  3. 在stm32中使用printf

    记录使用printf的方法 1.配置GPIO GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ...

  4. go语言初记

    快速了解 http://go-tour-zh.appspot.com/welcome/1 (可以需要爬墙) 下面记录下了解go的过程,特别记录下与你脑子里原有"观念"不同的地方: ...

  5. ChatGPT回答的关于maxscript + python

  6. 删除指定 route ip 段

    route del -net 172.18.0.0 netmask 255.255.0.0

  7. python + unittest + request + parameterized 参数化遇到中文名称testcase不显示的问题

    最近使用python+unittest+request+parameterized做接口测试,然后在利用parameterized做参数化时,发现测试用例的中文名称,感觉很奇怪,于是跟踪了parame ...

  8. Docker上安装MSSQL(SQL Server)

    ​ Mac OS X ,想安装微软的mssql-server数据库有三种方式: 第一种是在本机上安装MSSQL for Linux 版本. 第二种是安装Windows虚拟机,然后在虚拟机里面使用ISO ...

  9. vue中组件传值的几种方式

    一.父组件给子组件传值方式(步骤) 1.VC1(子组件)定义props[a,b,c] 注意:props中的每个值都可以加各种修饰,如数据类型,是否可为空,默认值... 2.VC2(父组件)引用子组件 ...

  10. typescript学习 回顾查漏

    1.在public构造函数上使用on参数是一种速记,它使我们能够自动使用该名称创建属性. class Student { fullName:string; constructor(public fir ...