使用pnnx将Torch模型转换为ncnn

1. 引言

以往我们将Torch模型转换为ncnn模型,通常需经过Torch–>onnx,onnx–>ncnn两个过程。但经常会出现某些算子不支持的问题。
ncnn作者针对该问题,直接开发一个Torch直接转换ncnn模型的工具 (PNNX),以下为相关介绍及使用方法。

2. 介绍

PyTorch神经网络eXchange(PNNX)是PyTorch模型互操作性的开放标准。PNNX为PyTorch提供了一种开放的模型格式。它定义了计算图以及严格匹配PyTorch的高级运算符。

3. 使用

3.1 安装

  • Windows/Linux/macOS 64bit
  • python 3.7 or later
pip3 install pnnx

从下述链接下载pnnx预编译包:
https://github.com/pnnx/pnnx/releases

此包包括所需的所有二进制文件。它是可移植的,因此不需要CUDA或PyTorch运行时环境

3.2 使用 PyTorch 导出 TorchScript 格式模型

导出torchscript模型文件

第一步是从 PyTorch 导出 TorchScript 模型, 例如 mobilenet_v2 这一经典的网络:
save_net.py:

import torch
import torchvision.models as models#net = models.resnet18(pretrained=True)
net = models.mobilenet_v2(pretrained=True)
net = net.eval()x = torch.rand(1, 3, 224, 224)mod = torch.jit.trace(net, x)
torch.jit.save(mod, "mobilenet_v2.pt")

执行可得到模型文件 mobilenet_v2.pt。

3.3 用PNNX把torchscript模型转为ncnn模型

./pnnx mobilenet_v2.pt inputshape=[1,3,224,224]

运行后会生成下列文件

  • mobilenet_v2.pnnx.param PNNX graph definition
  • mobilenet_v2.pnnx.bin PNNX model weight
  • mobilenet_v2_pnnx.py PyTorch script for inference, the python code - for model construction and weight initialization
  • mobilenet_v2.pnnx.onnx PNNX model in onnx format
  • mobilenet_v2.ncnn.param ncnn graph definition
  • mobilenet_v2.ncnn.bin ncnn model weight
  • mobilenet_v2_ncnn.py pyncnn script for inference

3.4 模型可视化

直接用 netron 查看即可
在这里插入图片描述

4. 参考

https://blog.csdn.net/qq_39056987/article/details/121331430
https://zhuanlan.zhihu.com/p/427620428
https://zhuanlan.zhihu.com/p/427512763
https://github.com/pnnx/pnnx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/598417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超快速排序

title: 超快速排序 date: 2024-01-05 11:51:43 tags: 逆序对 categories: 算法进阶指南 题目大意 解题思路 逆序数是一个序列每一个数的左边有多少比他本身大的值。将一个序列排序完整,最小交换次数即是逆序数之和。使用归并排序的同时,将每一个逆序数求…

C#用StringBuilder高效处理字符串

目录 一、背景 二、使用StringBuilder便捷、高效地操作字符串 三、实例 1.源码 2.生成效果 四、实例中知识点 1.StringBuilder类 (1)构造函数 (2)属性 (3)方法 2.Environment.NewLine 属性 一、…

SurfaceView和TextureView理解相关

一、为什么要使用SurfaceView 我们知道View是通过刷新来重绘视图,系统通过发出VSSYNC信号来进行屏幕的重绘,刷新的时间间隔是16ms,如果我们可以在16ms以内将绘制工作完成,则没有任何问题,如果我们绘制过程逻辑很复杂,…

SSD 颗粒还要涨价50%,入手前小心速度陷阱

大伙应该感受到了,自今年年中开始 SSD 普遍开始了小幅涨价。 但即便涨价到现在,NAND 厂商仍属于倒亏状态... 原因很简单,库存太多。 根据 TrendForce 的报道,主要制造商价格将需要再次上涨 40% 以上才能不亏,而达到盈…

【ZYNQ入门】第五篇、AXI HP口读写数据原理

目录 第一部分、AXI总线的相关知识 1、ZYNQ架构 2、AXI 总线和 AXI 接口以及 AXI 协议 3、AXI 总线与 ZYNQ 的关系 4、AXI 总线介绍 5、AXI 接口介绍 6、AXI 协议介绍 7、AXI高效传输的原因 8、常见总线汇总 9、HP接口写时序配置 10、HP DDR的地址分配 11、缓存一…

如何缓解BOT攻击?分享灵活准确的防御之道

BOT流量在所有互联网流量中的占比过半,而且存在好坏之分。其中“好”的BOT,比如在互联网上搜索和查找内容的BOT,它们是我们不可或缺的帮手。恶意的BOT进行信息数据爬取、薅羊毛等攻击行为,正损害着企业和用户的利益。专业数据统计…

将文本文件导入Oracle数据库的简便方法:SQL Developer

需求 我有一个文本文件dbim.txt,是通过alert log生成的,内容如下: 2020-09-11 2020-09-11 ... 2023-12-03 2023-12-03 2023-12-26我已经在Oracle数据库中建立了目标表: create table dbim(a varchar(16));我想把日志文件导入Or…

若依管理系统部署

本文章仅供参考,由于个软件版本不同可能会有偏差。 登录系统打开cmd 编辑文件 这些文件分别打开,打开后在浏览器会出现若依管理系统后台,输入账号 admin 密码 123456即可进入后台。 本文章仅供参考,由于个软件版本不同可能会有…

Linux内存管理:(六)页交换算法

文章说明: Linux内核版本:5.0 架构:ARM64 参考资料及图片来源:《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址: zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 引言 在Linux操作系统中&#x…

synchronized锁的底层原理

synchronized 锁是 Java 中用于实现线程同步的关键字。它提供了一种简单而有效的方式来确保多个线程之间的互斥访问。底层原理可以通过 Java 的内存模型和对象监视器锁(Monitor Lock)来理解。 Monitor结构如下: 在 Java 的内存模型中&#x…

Spring Boot 与 Spring 框架的区别

一、前言 Spring Boot 和 Spring 框架是由 Spring 项目提供的两个关键的技术栈,它们在 Java 开发中扮演着不同的角色。在阐述其区别之前,我们先大致了解下这两个框架 二、Spring 框架 1、背景 Spring 框架是一个全栈的企业应用开发框架,起…

springboot社区养老服务系统设计与实现

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一 、设计说明 1.1 研究背景 当…

梯度、散度、旋度

目录 梯度Gradient 散度Divergence 旋度Curl 梯度Gradient 即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模); Scalar -> Vector ,表示标量变化最快的方向&…

FPGA——VIVADO生成固化文件,掉电不丢失

VIVADO生成固化文件 (1)加入代码(2)生成bin文件,并且下载 (1)加入代码 设计文件(.xdc)中加入这段代码: set_property CFGBVS VCCO [current_design] set_property CONFIG_VOLTAGE 3.3 [current_design] set_property BITSTREAM.GENERAL.COMPRESS true [current_de…

echarts实现点击不同的柱子实现类目的不同名字

实现效果如下图: 首先实现echarts堆叠柱状图数据为0的不占用x轴空间 option {tooltip: {trigger: axis,axisPointer: {type: shadow},},legend: {},grid: {left: 3%,right: 4%,bottom: 3%,containLabel: true},xAxis: [{type: category,position: bottom,data: [园区内, 园区…

Linux_apachectl 网页优化

1.1 网页压缩与缓存 在使用 Apache 作为 Web 服务器的过程中,只有对 Apache 服务器进行适当的优化配 置,才能让 Apache 发挥出更好的性能。反过来说,如果 Apache 的配置非常糟糕, Apache 可能无法正常为我们服务。因此&#xff0c…

静态网页设计——BNA热火队介绍(HTML+CSS+JavaScript)

前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 使用技术:HTMLCSSJS 主要内容:对BNA的球队热火队进行介绍。 基本内容 1、首页 首页分为三部分,以html进行分割,最上方…

HTTP打怪升级之路

新手村 上个世纪80年代末,有一天,Tim Berners-Lee正在工作,他需要与另一台计算机上的同事共享一个文件。他尝试使用电子邮件,但发现电子邮件不能发送二进制文件。Tim Berners-Lee意识到,他需要一种新的协议来共享二进制…

静态网页设计——喜羊羊与灰太狼(HTML+CSS+JavaScript)

前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 感谢大佬的视频: https://www.bilibili.com/video/BV1Ta4y1B75m/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术:HTMLCSSJS 主要内容&a…

docker学习笔记04-可视化界面Portainer

1.Portainer简介 Portainer 是一款开源的容器管理工具,旨在帮助用户更轻松地管理 Docker 环境。无论您是 Docker 新手还是经验丰富的开发人员,Portainer 都提供了直观的用户界面,使您能够方便地创建、部署和监控容器。 安装 Portainer 非常…