:)torch转onnx总结--|
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总结--|的更多相关文章
- pytorch1.0 用torch script导出模型
python的易上手和pytorch的动态图特性,使得pytorch在学术研究中越来越受欢迎,但在生产环境,碍于python的GIL等特性,可能达不到高并发.低延迟的要求,存在需要用c++接口的情况. ...
- pytorch转onnx问题
Fail to export the model in PyTorch https://github.com/onnx/tutorials/blob/master/tutorials/PytorchA ...
- 使用ONNX将模型转移至Caffe2和移动端
使用ONNX将模型转移至Caffe2和移动端 本文介绍如何使用 ONNX 将 PyTorch 中定义的模型转换为 ONNX 格式,然后将其加载到 Caffe2 中.一旦进入 Caffe2, 就可以运行 ...
- 从PyTorch到ONNX的端到端AlexNet
从PyTorch到ONNX的端到端AlexNet 这是一个简单的脚本,可将Torchvision中定义的经过预训练的AlexNet导出到ONNX中.运行一轮推理Inference,然后将生成的跟踪模型 ...
- 【推理引擎】ONNX 模型解析
定义模型结构 首先使用 PyTorch 定义一个简单的网络模型: class ConvBnReluBlock(nn.Module): def __init__(self) -> None: su ...
- 实践torch.fx第二篇-fx量化实操
好久不见各位,哈哈,又鸽了好久. 本文紧接上一篇<实践torch.fx第一篇--基于Pytorch的模型优化量化神器>继续说,主要讲如何利用FX进行模型量化. 为什么这篇文章拖了这么久,有 ...
- 【YOLOv5】手把手教你使用LabVIEW ONNX Runtime部署 TensorRT加速,实现YOLOv5实时物体识别(含源码)
前言 上一篇博客给大家介绍了LabVIEW开放神经网络交互工具包[ONNX],今天我们就一起来看一下如何使用LabVIEW开放神经网络交互工具包实现TensorRT加速YOLOv5. 以下是YOLOv ...
- [深度学习] Pytorch模型转换为onnx模型笔记
本文主要介绍将pytorch模型准确导出为可用的onnx模型.以方便OpenCV Dnn,NCNN,MNN,TensorRT等框架调用.所有代码见:Python-Study-Notes 文章目录 1 ...
- 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 ...
- Torch学习笔记1--Torch简介
Torch是什么 Torch是一个由Lua语言开发的深度学习框架,目前支持Mac OS X 和Ubuntu 12及以上,官网 ,github地址. 具有如下特点: 交互式开发工具 可视化式的工具 第三 ...
随机推荐
- Cobalt Strike 之:域内渗透
郑重声明: 本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关.倡导维护网络安全人人有责,共同维护网络文明和谐. Co ...
- IP 地址分类及子网划分
IP 地址分类 在现实生活中,一个市区有许多的区,区下面又有很多的街道,街道下面又有很多的小区,A 市区.B 市区就是一个范围,每一个范围都有不同的居民数量.类比到计算机网络,A 类地址可以容纳256 ...
- net core 依赖注入DI
控制反转:Inversion Of Control,简称 IOC,是面向对象中的一种设计原则,调用者不自己new实例,而是交给容器去创建,可以减轻代码的耦合度. 依赖注入:Dependency Inj ...
- 【11】java之抽象类
一.抽象类基本概念 1.1 抽象类 抽象类:是指在普通类的结构里增加抽象方法的组成部分,抽象类要使用 abstract 声明. 抽象方法:没有方法体且必须使用 abstract 关键字进行定义. 拥有 ...
- 08. AssetBundle.LoadFromFile
参数 path 文件在磁盘上的路径. crc 未压缩内容的 CRC-32 校验和(可选).如果该参数不为零,则加载前将内容与校验和进行比较,如果不匹配则给出错误. offset 字节偏移(可选).该值 ...
- C#窗体控件,文字随电脑分辨率自动调整大小
一.在类中添加方法,代码如下: #region 窗体控件.字体随分辨率调整,自动调整大小 public static void SetTag(Control cons) { foreach (Cont ...
- swiper滑动异常
遇到这样的情况,一共5张slide,但是从第三个起再往右划就不动了.后来发现是已经初始化swiper后又追加了slide.(大概意思是这样.太久的程序了,也不想仔细捋了) 暂且用到的办法: 先定义好: ...
- Vue 超长列表渲染性能优化
参考:https://juejin.cn/post/6979865534166728711#heading-3 组件懒加载参考:https://github.com/xunleif2e/vue-laz ...
- shell脚本自动过滤尝试多次连接ip并添加到系统黑名单
#!/bin/bash cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c | awk '{{ print $2 " ...
- 获取Java运行环境信息
设备相关信息 获取设备名称 import java.net.InetAddress; import java.net.UnknownHostException; try { InetAddress l ...