自定义reset50模型转换到昇腾om

目录

原始转换脚本

脚本运行报错

基于reset50 模型的自定义网络

基本网络结构

卷积模块定义示例

Bottleneck定义示例

网络定义示例

改进的转换脚本

脚本运行报错channels不匹配

脚本运行报错维度不匹配

模型输入数据的类型

tensor size

NCHW和NHWC

自定义网络的通道数目

输入维度修改

onnx转换om文件

带参数images

带参数input

总结


之前转换yolov8 官方的模型,命令很简单,只有几行就可以搞定。

而自定的reset50 则显得更为复杂些。在这个转换过程中,我们可以了解一些模型相关的基本概念。

原始转换脚本

 model = models.torch.load('ok.pt')model.to(device)model.eval()dummy_img = torch.Tensor(torch.randn(10, 2, 95))) torch.onnx.export(model = model, #pth模型args=dummy_img,)

脚本运行报错

 pth2onnx('resnet18')File "E:\project\10\model_trasfer.py", line 12, in pth2onnxmodel.eval()
AttributeError: 'collections.OrderedDict' object has no attribute 'eval'

提示没有这个eval这个属性。

这个eval属性将模型设置为推理模式(参考: 将 PyTorch 训练模型转换为 ONNX | Microsoft Learn),是必须调用的。此属性是针对模型的,需要先定义一个模型再进行转换。

基于reset50 模型的自定义网络

由前述这个脚本转换的报错,我们需要一个模型。

基本网络结构

参考:ResNets: Why do they perform better than Classic ConvNets? (Conceptual Analysis) | Towards Data Science

【DL系列】ResNet网络结构详解、完整代码实现-CSDN博客

 主要包括

1)卷积模块,包括含卷积层(青色)、批归一化层(浅蓝色)、ReLU 激活函数(橙黄色)和最大池化层

2) 几个bottleneck模块

 

卷积模块定义示例

def Conv1(in_places, places, stride=2):return nn.Sequential(nn.Conv2d(in_channels=in_places, out_channels=places, kernel_size=7, stride=stride, padding=3, bias=False),nn.BatchNorm2d(places),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

参数

in_places : 输入通道数。

places : 输出通道数。

stride: 卷积步长,默认为 2.

作用: 作为 ResNet 的第一个卷积层,用于对输入图像进行初步特征提取

Bottleneck定义示例

class Bottleneck(nn.Module):def __init__(self, in_places, places, stride=1, downsampling=False, expansion=4):super(Bottleneck, self).__init__()self.expansion = expansionself.downsampling = downsamplingself.bottleneck = nn.Sequential(nn.Conv2d(in_channels=in_places, out_channels=places, kernel_size=1, stride=1, bias=False),nn.BatchNorm2d(places),nn.ReLU(inplace=True),nn.Conv2d(in_channels=places, out_channels=places, kernel_size=3, stride=stride, padding=1, bias=False),nn.BatchNorm2d(places),nn.ReLU(inplace=True),self.relu = nn.ReLU(inplace=True)def forward(self, x):residual = x#         print("bot input shape:",x.shape)out = self.bottleneck(x)if self.downsampling:residual = self.downsample(x)out += residualout = self.relu(out)#         print("bot output shape:",out.shape)return out

in_places: 输入通道数
places: 中间层的通道数
stride : 卷积步长,默认为 1
downsampling: 是否进行下采样(用于调整残差连接的维度)
expansion: 扩展因子,用于调整输出通道数。

作用  通过 1x1、3x3、1x1 的卷积层组合,减少计算量并提取特征。
使用残差连接 ( out += residua1 ) 解决深层网络的梯度消失问题


网络定义示例

class ResNet(nn.Module):def __init__(self, blocks, num_classes=10, expansion=4):super(ResNet, self).__init__()self.expansion = expansionself.conv1 = Conv1(in_places=2, places=64)self.layer1 = self.make_layer(in_places=64, places=64, block=blocks[0], stride=1)self.layer2 = self.make_layer(in_places=256, places=128, block=blocks[1], stride=2)self.layer3 = self.make_layer(in_places=512, places=256, block=blocks[2], stride=2)self.layer4 = self.make_layer(in_places=1024, places=512, block=blocks[3], stride=2)self.avgpool = nn.AdaptiveAvgPool2d((1, 1))self.fc = nn.Linear(512 * expansion, num_classes)def make_layer(self, in_places, places, block, stride):layers = []layers.append(Bottleneck(in_places, places, stride, downsampling=True))for i in range(1, block):#             print(i,in_places,places,self.expansion)layers.append(Bottleneck(places * self.expansion, places))return nn.Sequential(*layers)def forward(self, x):#         print(x.shape)x1 = self.conv1(x)#         print("conv1:",x1.shape)x2 = self.layer1(x1)return F.normalize(x7, dim=-1), F.normalize(x8, dim=-1)

功能:定义了完整的 ResNet 模型
参数

blocks : 每个阶段的 Bottleneck 模块数量(例如 ResNet-50 为 [3,4,6,3])。
num_classes : 分类任务的类别数,默认为 10
expansion :Bottleneck 模块的扩展因子,默认为 4
作用:
通过 make_layer 方法构建多个 Bottleneck 层。
使用全局平均池化 ( AdaptiveAvgPoo12d ) 将特征图转换为向量
通过全连接层 ( fc) 输出分类结果
返回归一化后的特征向量和分类结果
 

改进的转换脚本

主要在于model变量由上述自定义网络模型实例化而来。

 model = Resnet50_2d()  //这里引入自定义网络model.load_state_dict(torch.load('ok.pt')) #model = models.torch.load('ok.pt')#model.to(device)model.eval()dummy_img = torch.Tensor(torch.randn(10, 2, 95)) # (batchsize, channels, width, height)

脚本运行报错channels不匹配

return F.conv2d(

RuntimeError: Given groups=1, weight of size [64, 2, 7, 7], expected input[1, 10, 2, 95] to have 2 channels, but got 10 channels instead

脚本运行报错维度不匹配

raise ValueError("expected 4D input (got {}D input)".format(input.dim()))
ValueError: expected 4D input (got 3D input)

期望4D,但实际3D的输入。

模型输入数据的类型

任何程序都需要数据输入,只是数据输入的形式不同。

tensor size

tensor : 在模型转换中,指的是张量的形状或维度信息。张量是多维数组,广泛应用于深度学习框架中,用于表示输入数据、权重、中间结果等。

- 标量:0维张量(单个数值)
- 向量:1维张量(一维数组)
- 矩阵:2维张量(二维数组)
- 更高维张量:如3D、4D等

tensor size 表示张量在每个维度上的大小。 一个形状为 [3, 224, 224] 的张量表示一个3通道、224x224像素的图像。

NCHW和NHWC

多维数据通过多维数组存储,比如卷积神经网络的特征图(Feature Map)通常用四维数组保存,即4D,4D格式解释如下:

  • N:Batch数量,例如图像的数目。
  • H:Height,特征图高度,即垂直高度方向的像素个数。
  • W:Width,特征图宽度,即水平宽度方向的像素个数。
  • C:Channels,特征图通道,例如彩色RGB图像的Channels为3。

自定义网络的通道数目

通过2.2节及2.4节网络定义传输的参数

self.conv1 = Conv1(in_places=2, places=64)

 据此我们将转换脚本修改为:

dummy_img = torch.Tensor(torch.randn(2, 2, 95)) # (batchsize, channels, width, height)

输入维度修改

由原先3维修改为4维

dummy_img = torch.Tensor(torch.randn(2,2, 2, 95)) # (batchsize, channels, width, height)

至此,已经可以将pt模型文件转换到onnx文件。

onnx转换om文件

带参数images

atc --model=ok.onnx --framework=5 --output=resnet --input_shape="images:1,3,640,640"  --soc_version=Ascend310P3  --insert_op_conf=aipp.cfg
ATC start working now, please wait for a moment.
...
ATC run failed, Please check the detail log, Try 'atc --help' for more information
E10016: 1970-01-01-08:05:58.540.117 Opname [images] specified in [--input_shape] is not found in the model, confirm whether this node name exists, or node is not split with the specified delimiter ';'

提示模型中没有images。这里就特别注意

带参数input

atc  --model=ok.onnx     --framework=5     --output=resnet50_2d     --soc_version=Ascend310P3    --input_format=NCHW     --input_shape="input:2,2,2,95"     --log=info
ATC start working now, please wait for a moment.
...
ATC run success, welcome to the next use.

总结

   1) 自定义网络的模型转换,需要转换时实例化网络模型。

   2) 明确模型输入数据的维度及各维度的大小。毕竟模型的主要工作即处理这些数据。

示例常用的输入一般为 4D 张量,形状为 (batch_size, channels, height, width)

1)batch_size:每次输入网络的样本数量。根据硬件内存和训练需求选择,常见值为 32、64、128 等。

      在推理阶段,batch_size 表示一次性输入模型的样本数量。与训练阶段不同,推理时通常不需要反向传播和梯度计算,因此显存占用较低,可以支持较大的 batch_size。

 常见的 batch_size 选择

  • batch_size = 1

    • 适用于实时推理任务(如摄像头视频流处理)。

    • 延迟最低,但 GPU 利用率可能较低。

  • batch_size = 8/16/32

    • 适用于批量处理任务(如离线图像分类、目标检测)。

    • 在显存允许的情况下,提高 GPU 利用率。

  • batch_size = 动态调整

    • 根据输入数据的数量动态调整 batch_size

    • 例如,如果有 100 张图像需要处理,可以一次性输入 100 张(如果显存允许)。

2)channels:图像的通道数(如 RGB 图像为 3,灰度图像为 1)。由图像类型决定,RGB 为 3,灰度图为 1。

3)height 和 width:图像的高度和宽度。通常将图像调整为固定大小(如 224x224),以适应网络输入。

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

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

相关文章

vue3:十一、主页面布局(进入指定菜单页面,默认锁定到左侧菜单)

一、效果 直接进入home页面,直接展开对应的菜单项 二、具体实现 1、菜单容器增加默认选中变量 在菜单容器中将默认展开菜单default-openeds修改为默认选中菜单default-active 2、引入useRoute方法 引入该方法为了获取当前页面的路径 import { useRoute } from …

六十天前端强化训练之第二十七天之Pinia 状态管理全解与购物车实战案例

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、Pinia 深度解析 1. Pinia 核心设计 2. 核心概念图解 3. Store 类型对比 Option Store(选项式) Setup Store(组合式) …

计算机网络技术服务管理基于Spring Boot-SSM

目录 一、引言 二、用户需求分析 三、功能介绍 ‌‌3.1.资源管理‌: ‌3.2.故障管理‌: ‌3.3.性能管理‌: ‌3.4.安全管理‌: ‌3.5.配置管理‌: ‌3.6.日志管理‌: ‌3.7.用户管理‌&#xff1…

深度学习驱动下的字符识别:挑战与创新

一、引言 1.1 研究背景 深度学习在字符识别领域具有至关重要的地位。随着信息技术的飞速发展,对字符识别的准确性和效率要求越来越高。字符识别作为计算机视觉领域的一个重要研究方向,其主要目的是将各种形式的字符转换成计算机可识别的文本信息。近年…

Java多线程与高并发专题——Future 是什么?

引入 在上一篇Callable 和 Runnable 的不同?的最后,我们有提到和 Callable 配合的有一个 Future 类,通过 Future 可以了解任务执行情况,或者取消任务的执行,还可获取任务执行的结果,这些功能都是 Runnable…

【vue的some和filter】

在 Vue 中,some 和 filter 是两种不同的数组方法,分别用于处理数据筛选和条件判断。以下是它们在 Vue 中的具体用法和区别: 一、filter 方法 作用:对数组进行过滤,返回符合条件的新数组。 使用场景:常用于…

用ArcGIS做一张符合环评要求的植被类型图

植被类型图是环境影响评价(环评)中的重要图件,需满足数据准确性、制图规范性和信息完整性等要求。本教程将基于ArcMap平台,从数据准备到成果输出,详细讲解如何制作符合环评技术规范的植被类型图。 ArcGIS遥感解译土地…

Fourier-Lerobot——把斯坦福人形动作策略iDP3封装进了Lerobot(含我司七月人形研发落地实践)

前言 近期在抠lerobot源码时,看到其封装了ALOHA ACT、diffusion policy、π0时,我就在想,lerobot其实可以再封装下idp3 我甚至考虑是否从我联合带的那十几个具身研究生中选几个同学做下这事,对他们也是很好的历练然当25年3.18日…

MySQL拒绝访问

1. 问题 使用图形界面工具连接MySQL数据库,拒绝访问! 2. 解决方法 以管理员的身份打开cmd,输入命令,启动MySQL net start mysql版本号 3. 参考 暂无

多模态SVG生成新标杆:StarVector从图像文本生成高精度SVG的AI模型

一、引言:矢量图形的崛起与挑战 在现代数字世界中,图像扮演着至关重要的角色,而可伸缩矢量图形(SVG)正因其独特的优势,在网页设计、图形设计等领域占据着越来越重要的地位。与传统的基于像素的栅格图像不同…

Netty——BIO、NIO 与 Netty

文章目录 1. 介绍1.1 BIO1.1.1 概念1.1.2 工作原理1.1.3 优缺点 1.2 NIO1.2.1 概念1.2.2 工作原理1.2.3 优缺点 1.3 Netty1.3.1 概念1.3.2 工作原理1.3.3 优点 2. Netty 与 Java NIO 的区别2.1 抽象层次2.2 API 易用性2.3 性能优化2.4 功能扩展性2.5 线程模型2.6 适用场景 3. 总…

游戏引擎学习第175天

回顾和今天的计划 今天的主要任务是完成稀疏 Unicode 支持。之前我们已经完成了所有的思考和设计工作,但代码部分尚未完成,因为有许多内容需要调整和重构。因此,今天的目标就是把这些内容全部整理好并最终实现。 回顾当前测试资源构建器的状…

零基础上手Python数据分析 (7):Python 面向对象编程初步

写在前面 回顾一下,我们已经学习了 Python 的基本语法、数据类型、常用数据结构和文件操作、异常处理等。 到目前为止,我们主要采用的是 面向过程 (Procedural Programming) 的编程方式,即按照步骤一步一步地编写代码,解决问题。 这种方式对于简单的任务已经足够,但当程序…

CNN的空间归纳偏置(Inductive Bias):深入解析其本质与影响(与transformer的比较)

CNN的空间归纳偏置(Inductive Bias):深入解析其本质与影响 在深度学习领域,卷积神经网络(Convolutional Neural Networks, CNN)和Transformer代表了两种截然不同的设计哲学。CNN凭借其卓越的性能长期主导计…

1-4 麻雀优化深度核极限学习机超参数

本博客来源于CSDN机器鱼,未同意任何人转载。 更多内容,欢迎点击本专栏目录,查看更多内容。 目录 0.引言 1.原理 2.具体实现 3.结语 0.引言 在博客【深度核极限学习机】里我们讲述了深度核极限学习机原理,今天我们对其继续进…

miniconda安装保姆级教程|win11|深度学习环境配置

一、官网安装miniconda miniconda官网:Miniconda - Anaconda 点击Download按钮 在红框位置输入邮箱并点击submit,下载链接将会发到邮箱中 邮箱中将会收到如图所示邮件,点击下载 选择windows对应的miniconda安装包 miniconda安装包安装完成如…

AI安全、大模型安全研究(DeepSeek)

DeepSeek 点燃AI应用革命之火,但安全 “灰犀牛” 正在逼近 DeepSeek-R1国产大模型的发布,以技术创新惊艳了全球,更是极致的性价比推动国内千行百业接入 AI,政府、企业竞速开发智能业务处理、智能客服、代码生成、营销文案等应用,“落地效率” 成为第一关键词。然而与此相…

机器学习——Numpy的神奇索引与布尔索引

在 NumPy 中,神奇索引(Fancy Indexing) 和 布尔索引(Boolean Indexing) 是两种强大的索引方式,用于从数组中提取特定元素或子集。以下是它们的详细说明和示例: 1. 神奇索引(Fancy In…

Android Studio最后一个绑定JDK8的版本,但是官方下载是最新的,怎么下载Android Studio历史版本包,这篇文章帮你解决。

最近需要安装Android Studio 编辑器 发现官网最新的编辑器已经不支持 jdk8了 经过查阅资料: Android Studio最后一个绑定JDK8的版本:4.1.3 下载地址:https://developer.android.google.cn/studio/archive 如果你打开是这样的 下载页 这是因为你用的中…

Next-Auth 认证系统:用户与管理员双角色登录配置

概述 本文档介绍了如何使用 Next-Auth 配置一个同时支持普通用户和管理员用户登录的认证系统。 基本配置 首先,我们需要设置 Next-Auth 的基本配置,包括提供者、回调函数和页面路由。 import type { NextAuthConfig } from next-auth import type { …