自定義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.pswp.cn/news/898674.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898674.shtml
英文地址,請注明出處:http://en.pswp.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 { …