torch转onnx模型

2023-11-16

torch转onnx模型

一、前言

onnx是开放神经网络交换格式,用于不同框架之间的迁移,推理方面比原生的torch快很多。本文以MobilenetV3做分类任务为例,实现模型转换。


二、使用步骤

1.torch转换为onnx

代码如下:

#  torch2onnx.py
import torch
import torchvision
from models.mobilenetv3 import MobileNetV3_Large   # 引入模型

torch.set_grad_enabled(False)
torch_model = MobileNetV3_Large(2)  # 初始化网络
torch_model.load_state_dict(torch.load('./mobilenetv3-40-regular.pth'), False)  # 加载训练好的pth模型
batch_size = 1  # 批处理大小
input_shape = (1, 128, 128)  # 输入数据,我这里是灰度训练所以1代表是单通道,RGB训练是3128是图像输入网络的尺寸

# set the model to inference mode
torch_model.eval().cpu()  # cpu推理

x = torch.randn(batch_size, *input_shape).cpu()  # 生成张量
export_onnx_file = "./mobilenetv3-40-regular.onnx"  # 要生成的ONNX文件名
torch.onnx.export(torch_model,
                  x,
                  export_onnx_file,
                  opset_version=10,
                  do_constant_folding=True,  # 是否执行常量折叠优化
                  input_names=["input"],  # 输入名
                  output_names=["output"],  # 输出名
                  dynamic_axes={"input": {0: "batch_size"},  # 批处理变量
                                "output": {0: "batch_size"}})

这样将会得到onnx的转化模型

2.onnx推理

代码如下:

import cv2
from PIL import Image
import onnxruntime as ort
import numpy as np


def softmax(x):
    x = x.reshape(-1)
    e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum(axis=0)


def postprocess(result):
    return softmax(np.array(result)).tolist()


if __name__ == "__main__":
    onnx_model_path = "./mobilenetv3-40-regular.onnx"  # onnx模型
    ort_session = ort.InferenceSession(onnx_model_path)
    # 输入层名字
    onnx_input_name = ort_session.get_inputs()[0].name
    # 输出层名字
    onnx_outputs_names = ort_session.get_outputs()[0].name
    img = Image.open('./srcImgOK.jpeg').convert("L")  # 需要识别的图像读为灰度
    img = img.resize((128, 128), 0)  # resize成网络输入需要的size
    img = np.asarray(img, np.float32)/255.0  # 归一化
    img = img[np.newaxis, np.newaxis, :, :]
    # 如果是RGB则
    # img = img[np.newaxis, :, :, :]
    input_blob = np.array(img, dtype=np.float32)
    onnx_result = ort_session.run([onnx_outputs_names], input_feed={onnx_input_name: input_blob})
    res = postprocess(onnx_result)  # softmax
    idx = np.argmax(res)
    print(idx)  # 打印识别结果
    print(res[idx])  # 对应的概率

3、可能的异常

RuntimeError: Failed to export an ONNX attribute ‘onnx::Gather’, since it’s not constant, please try to make things (e.g., kernel size) static if possible
在这里插入图片描述点开报错的这个symbolic_helper.py打印一下报错位置print(“>>>>>>”, v.node()),得到mobilenetv3.py:204:0,代表这个模型文件的204行转换有问题,具体问题具体分析,定位到问题就可以找一下解决方案
mobilenetv3为例执行转换代码时可以先打印一下这个out.size(),然后改成常量就可以正常转换在这里插入图片描述

三.总结

转换后的onnx CPU推理速度大概快约10倍,有不对的望指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

torch转onnx模型 的相关文章

  • 深度好文:最全的大模型 RAG 技术概览

    本文是对检索增强生成 Retrieval Augmented Generation RAG 技术和算法的全面研究 对各种方法进行了系统性的梳理 涉及了 RAG 流程中的数据拆分 向量化 查询重写 查询路由等等 在做 RAG 的小伙伴一定知道
  • 比尔盖茨与萨姆.奥尔特曼的对话及感想

    谈话内容 比尔 盖茨 嘿 萨姆 萨姆 奥尔特曼 嘿 比尔 比尔 盖茨 你好吗 萨姆 奥尔特曼 哦 天哪 这真的太疯狂了 我还好 这是一个非常激动人心的时期 比尔 盖茨 团队情况怎么样 萨姆 奥尔特曼 我想 你知道很多人都注意到了这样一个事实
  • 用通俗易懂的方式讲解:图解 Transformer 架构

    文章目录 用通俗易懂方式讲解系列 1 导语 2 正文开始 现在我们开始 编码 从宏观视角看自注意力机制 从微观视角看自注意力机制 通过矩阵运算实现自注意力机制
  • 用通俗易懂的方式讲解:如何用大语言模型构建一个知识问答系统

    传统搜索系统基于关键字匹配 在面向 游戏攻略 技术图谱 知识库等业务场景时 缺少对用户问题理解和答案二次处理能力 本文探索使用大语言模型 Large Language Model LLM 通过其对自然语言理解和生成的能力 揣摩用户意图 并对
  • 【图像融合】基于联合双边滤波和局部梯度能量的多模态医学图像融合研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 图像 文章
  • 【路径规划】基于A*算法路径规划研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 利用CHAT写实验结论

    问CHAT 通过观察放置在玻璃表面上的单个水滴 人们可以观察到水滴充当成像系统 探究这样一个透镜的放大倍数和分辨率 CHAT回复 实验报告标题 利用玻璃表面的单一水滴观察成像系统的放大倍数和分辨率 一 实验目的 通过对比和测量 研究和探索玻
  • 基于java的ssh医院在线挂号系统设计与实现

    基于java的ssh医院在线挂号系统设计与实现 I 引言 A 研究背景和动机 基于Java的SSH医院在线挂号系统设计与实现的研究背景和动机 随着信息技术的迅速发展和应用 医院在线挂号系统已成为医院管理的重要组成部分 传统的挂号方式存在许多
  • 让CHAT介绍下V2ray

    CHAT回复 V2Ray是一个网络工具 主要用于科学上网和保护用户的网络安全 它的名字源自Vmess Ray 光线 通过使用新的网络协议 为用户提供稳定且灵活的代理服务 下面是一些V2Ray的主要特性 1 多协议支持 V2Ray 提供了大量
  • 链上繁荣,合作不断,外媒热议波场 TRON 2023 年度成绩

    近日 权威外媒Theblock 美联社和Decrypt等就波场 TRON 2023大事件进行了年度盘点 报道指出 波场TRON网络在2023年取得了一系列的发展和合作 提升了其在Web3领域的地位 其中 波场TRON网络账户数量增加了 54
  • 利用CHAT上传文件的操作

    问CHAT autox js ui 上传框 CHAT回复 上传文件的操作如果是在应用界面中的话 由于Android对于文件权限的限制 你可能不能直接模拟点击选择文件 一般来说有两种常见的解决方案 一种是使用intent来模拟发送一个文件路径
  • 性能大减80%,英伟达芯片在华“遇冷”,我方霸气回应:不强求

    中国这么大一块市场 谁看了不眼馋 在科技实力大于一切的今天 高端芯片的重要性不言而喻 作为半导体产业发展过程中不可或缺的一环 芯片技术也一直是我国技术发展的一大 心病 在美西方等国的联手压制下 我国芯片技术发展处处受阻 至今也未能在高端芯片
  • 2024 人工智能与大数据专业毕业设计(论文)选题指导

    目录 前言 毕设选题 选题迷茫 选题的重要性 更多选题指导 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生
  • 做大模型也有1年多了,聊聊这段时间的感悟!

    自ChatGPT问世以来 做大模型也有1年多了 今天给大家分享这一年后的感悟 过去一年应该是AI圈最万千瞩目的一年了 大家对大模型 OpenAI ChatGPT AI Native Agent这些词投入了太多的关注 以至于有一年的时间好像经
  • 机器学习算法实战案例:Informer实现多变量负荷预测

    文章目录 机器学习算法实战案例系列 答疑 技术交流 1 实验数据集 2 如何运行自己的数据集 3 报错分析 机器学习算法实战案例系
  • 人工智能 AI 如何让我们的生活更加便利

    每个人都可以从新技术中获益 一想到工作或生活更为便利 简捷且拥有更多空余时间 谁会不为之高兴呢 借助人工智能 每天能够多一些空余时间 或丰富自己的业余生活 为培养日常兴趣爱好增添一点便利 从电子阅读器到智能家居 再到植物识别应用和智能室内花
  • AI帮助终结全球饥饿问题

    全球饥饿问题是牵动人心的头等大事 5月28日是 世界饥饿日 这一问题更值得关注 让人人都能吃饱的想法不仅令人向往 而且很快就会变成现实 与大多数新事物引进一样 对于在控制世界粮食供应这样复杂的任务中AI究竟应该发挥多大的作用 人们还踟蹰不前
  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 开始弃用NeRF?为什么Gaussian Splatting在自动驾驶场景如此受欢迎?(浙江大学最新)...

    点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 今天自动驾驶之心为大家分享浙大刚刚出炉的3D Gaussian Splatting综述 文章首先回顾了3D Gaussian的原理和应用 借着全面比较了3D GS在静态
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据

随机推荐

  • Navicat16安装教程

    注 因版权原因 本文已去除破解相关的文件和内容 1 在本站下载解压后即可获得Navicat16安装包和破解补丁 如图所示 2 双击 navicat160 premium cs x64 exe 程序 即可进入安装界面 3 点击下一步 4 如图
  • version `GLIBCXX_3.4.14‘ not found

    Gate usr lib64 libstdc so 6 version GLIBCXX 3 4 14 not found required by Gate 本人测试gcc 8 3 0装不上 可考虑7 30亲测可装 4 81也测试过了 可以装
  • java list map 去重复_Java中List集合去除重复数据的六种方法

    1 循环list中的所有元素然后删除重复 public static List removeDuplicate List list for int i 0 i lt list size 1 i for int j list size 1 j
  • Android对于外置TF卡的读写操作(读写外置SD卡)

    上一篇介绍如何获得权限uri 在获得权限uri后 我们也不能直接对外卡直接操作 可以通过documentFile来进行 创建 添加修改和删除等操作 documentFile创建文件的过程可能与以往的File不同 它是通过mimeType和d
  • ROS turtlebot_follower :让机器人跟随我们移动

    ROS turtlebot follower 学习 首先在catkin ws src目录下载源码 地址 https github com turtlebot turtlebot apps git 了解代码见注释 其中有些地方我也不是很明白
  • 老胡的周刊(第108期)

    老胡的信息周刊 1 记录这周我看到的有价值的信息 主要针对计算机领域 内容主题极大程度被我个人喜好主导 这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享 项目 plane 2 概念比较新的项目管理工具 开源的 JIRA Line
  • DCGAN项目总结之生成器、识别器中: tcl.fully_connected、tcl.conv2d_transpose、 tcl.conv2d函数讲解

    首先全连接函数 fully connected 卷积操作 conv2d 反置卷积操作 conv2d transpose 的引用方式 import tensorflow contrib layers as tcl 适合刚接触深度学习的人 会的
  • 趋势拟合策略量化分析

    根据趋势拟合的量化分析方法 是对股票价格历史数据进行曲线拟合 从而预测出未来几天的股价 在本文所示的程序中 用fndays表示所用历史数据的天数 pndays表示预测未来的天数 例如我们可以用过去10天的价格预测未来3天的股票价格 1 数据
  • 什么是MFC中的“单个文档”和“多个文档”?

    2023年5月14日 周日中午 单个文档 比如windows自带的记事本软件就是单个文档的 因为如果你想再创建一个新的文本 必须在外面新建一个新的记事本程序 或者说 如果你想同时写两个文本 就必须在外面新建一个新的记事本程序 你不能在一个文
  • IOS手机上点击input 输入框,页面会自动放大

    解决办法 使用禁止缩放页面来完成
  • XY提供面试题

    1 软件测试的流程是什么 1 需求调查 全面了解系统概况 应用领域 软件开发周期 软件开发环境 开发组织 时间安排 功能需求 性能需求 质量需求及测试要求等 根据系统概况进行项目所需的人员 时间和工作量估计以及项目报价 2 制定初步的项目计
  • Python图像处理-1.pil读取图像,显示图像

    from PIL import Image import matplotlib pyplot as plt pil im1 Image open pic1 png pil im2 Image open pic1 png convert L
  • 聊聊大数据(一)——大数据的存储

    大数据 现在可谓越来越火了 不管是什么行业 也不敢是不是搞计算机的 都要赶个集 借着这股热潮 亦或炒作 亦或大干一番 尤其是从事IT行业的 不跟 大数据 沾点边 都不好意思出去说自己是干IT的 大数据 一词 已无从考证具体是什么时候兴起的
  • GAMES101 Lec 07~09:Shading 定义、着色模型、着色频率、图形渲染管线、纹理

    3dMax 导出一个模型文件包含内容 顶点坐标 法线 边的关系 model 模型 空间中有了一个摄像机 Model 通过变换可以让摄像机放在原点 View 三维空间的模型变换到屏幕上 Projection 通过采样进行光栅化 Rasteri
  • Java方法求最大值

    package Methoud 用方法求最值 public class M5 public static void main String args int ages 23 58 64 75 64 int max getArryMaxDat
  • 诺基亚如何利用计算机上网,诺基亚E63的WIFI上网功能全教程

    手机端设置 依次点击 功能表 工具 设置 连接 接入点 选中 增加新接入点 1 连接名称 诺基亚e63连接wifi 任意设定 最好设中文或数字 没测试过英文得 2 选择承载方式 为 无线局域网 3 WLAN网络名称 推荐用 搜索图片名称 获
  • node 实现h264视频流buffer转码flv并使用websocket发送

    背景 硬件海康旧监控 编写node服务端以实现网页播放 调用了之前用C封装好的海康接口 视频数据由接口通过回调函数传参过来形成h64裸数据Buffer 本博客记录的就是如何从视频裸流 Buffer转码并回传给websocket 直接上代码
  • 线程的生命周期 笔记

    1 新建 new Thread 进入此状态 2 Thread start 进入就绪状态 或者 在运行状态执行yield 放弃CPU的执行转到就绪状态 或者是阻塞状态转入 3 阻塞状态 sleep 同步锁获取失败进入阻塞状态 执行了wait方
  • 为Jira提供的自动化测试跟踪功能

    在敏捷 DevOps CI CD以及其他任何我们想加入的行业词汇的世界里 开发人员和测试人员面临着快速交付高质量 功能性软件的巨大压力 需求必须由一系列的测试来支持 这样才能看到分配的需求是否得到了满足 许多组织在Jira 或其他平台 中手
  • torch转onnx模型

    torch转onnx模型 一 前言 onnx是开放神经网络交换格式 用于不同框架之间的迁移 推理方面比原生的torch快很多 本文以MobilenetV3做分类任务为例 实现模型转换 二 使用步骤 1 torch转换为onnx 代码如下 t