從 PyTorch 到 ONNX:深度學習模型導出全解析

在模型訓練完畢后,我們通常希望將其部署到推理平臺中,比如 TensorRT、ONNX Runtime 或移動端框架。而 ONNX(Open Neural Network Exchange)正是 PyTorch 與這些平臺之間的橋梁。

本文將以一個圖像去噪模型 SimpleDenoiser 為例,手把手帶你完成 PyTorch 模型導出為 ONNX 格式的全過程,并解析每一行代碼背后的邏輯。

準備工作

我們假設你已經訓練好一個圖像去噪模型并保存為 .pth 文件,模型結構自編碼器實現如下(略):

class SimpleDenoiser(nn.Module):def __init__(self):super(SimpleDenoiser, self).__init__()self.encoder = nn.Sequential(nn.Conv2d(3, 64, 3, padding=1), nn.ReLU(),nn.Conv2d(64, 64, 3, padding=1), nn.ReLU())self.decoder = nn.Sequential(nn.Conv2d(64, 64, 3, padding=1), nn.ReLU(),nn.Conv2d(64, 3, 3, padding=1))def forward(self, x):x = self.encoder(x)x = self.decoder(x)return x

導出代碼分解

我們現在來看導出腳本的核心邏輯,并分塊解釋它的每一部分。

1. 導入模塊 & 設置路徑

//torch:核心框架//train.SimpleDenoiser:從訓練腳本復用模型結構//os:用于創建輸出目錄import torch
from train import SimpleDenoiser  # 模型結構
import os

2. 導出函數定義

//這個函數接收三個參數://pth_path: 訓練得到的模型參數文件路徑//onnx_path: 導出的 ONNX 文件保存路徑//input_size: 模擬推理輸入的尺寸(默認 1×3×256×256)
def export_model_to_onnx(pth_path, onnx_path, input_size=(1, 3, 256, 256)):

3. 加載模型和權重

//自動檢測 CUDA 可用性,加載模型到對應設備;//使用 load_state_dict() 加載訓練好的參數;//model.eval() 讓模型切換到推理模式(關閉 Dropout/BatchNorm 更新);
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = SimpleDenoiser().to(device)
model.load_state_dict(torch.load(pth_path, map_location=device))
model.eval()

4. 構造假輸入(Dummy Input)

//ONNX 導出需要一個具體的輸入樣本,我們這里用 torch.randn 生成一個形狀為 (1, 3, 256, 256) 的隨機圖//像;//輸入必須放在同一個設備上(GPU 或 CPU);
dummy_input = torch.randn(*input_size).to(device)

5. 導出為 ONNX

torch.onnx.export(model,  //要導出的模型dummy_input,  //示例輸入張量onnx_path, //	導出路徑export_params=True,  //是否導出權重opset_version=11,  //ONNX 的算子集版本,通常推薦 11 或 13do_constant_folding=True,  //優化常量表達式,減小模型體積input_names=['input'],  //自定義輸入輸出張量的名稱output_names=['output'],  //聲明哪些維度可以變動,比如 batch size、圖像大小等(部署時更靈活)dynamic_axes={'input': {0: 'batch_size', 2: 'height', 3: 'width'},'output': {0: 'batch_size', 2: 'height', 3: 'width'}}
)

6. 創建目錄并調用函數

//確保輸出文件夾存在,并調用導出函數生成最終模型。
if __name__ == "__main__":os.makedirs("onnx", exist_ok=True)export_model_to_onnx("weights/denoiser.pth", "onnx/denoiser.onnx")

導出后如何驗證?

pip install onnxruntime
import onnxruntime
import numpy as npsess = onnxruntime.InferenceSession("onnx/denoiser.onnx")
input = np.random.randn(1, 3, 256, 256).astype(np.float32)
output = sess.run(None, {"input": input})
print("輸出 shape:", output[0].shape)

?模型預覽:

總結

導出 ONNX 模型的流程主要包括:

  1. 加載模型結構 + 權重

  2. 準備 dummy 輸入張量

  3. 調用 torch.onnx.export() 進行導出

  4. 設置 dynamic_axes 可變尺寸以增強部署適配性

這套流程適用于大部分視覺模型(分類、去噪、分割等),也是后續進行 TensorRT 推理或移動端部署的基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77068.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77068.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77068.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hadoop集群部署教程-P6

Hadoop集群部署教程-P6 Hadoop集群部署教程(續) 第二十一章:監控與告警系統集成 21.1 Prometheus監控體系搭建 Exporter部署: # 部署HDFS Exporter wget https://github.com/prometheus/hdfs_exporter/releases/download/v1.1.…

【Altium】AD-生成PDF文件圖紙包含太多的空白怎么解決

1、 文檔目標 AD設計文件導出PDF時,圖紙模板方向設置問題 2、 問題場景 AD使用Smart PDF導出PDF時,不管你怎么設置頁面尺寸,只要從橫向轉為縱向輸出,輸出的始終是橫向紙張(中間保留縱向圖紙,兩邊大量留白…

大廠面試:六大排序

前言 本篇博客集中了冒泡,選擇,二分插入,快排,歸并,堆排,六大排序算法 如果覺得對你有幫助,可以點點關注,點點贊,謝謝你! 1.冒泡排序 //冒泡排序&#xff…

大模型開發:源碼分析 Qwen 2.5-VL 視頻抽幀模塊(附加FFmpeg 性能對比測試)

目錄 qwen 視頻理解能力 messages 構建 demo qwen 抽幀代碼分析 驗證兩個實際 case 官網介紹圖 性能對比:ffmpeg 抽幀、decord 庫抽幀 介紹 聯系 對比 測試結果 測試明細 ffmpeg 100 qps 測試(CPU) decord 100 qps 測試&#x…

git的上傳流程

好久沒使用git 命令上傳遠程倉庫了。。。。。溫習了一遍; 幾個注意點--單個文件大小不能超過100M~~~ 一步步運行下面的命令: 進入要上傳的文件夾內,點擊git bash 最終 hbu的小伙伴~有需要nndl實驗的可以自形下載哦

驅動學習專欄--字符設備驅動篇--2_字符設備注冊與注銷

對于字符設備驅動而言,當驅動模塊加載成功以后需要注冊字符設備,同樣,卸載驅動模 塊的時候也需要注銷掉字符設備。字符設備的注冊和注銷函數原型如下所示 : static inline int register_chrdev(unsigned int major, const char *name, const…

redis 放置序列化的對象,如果修改對象,需要修改版本號嗎?

在 Redis 中存儲序列化對象時,如果修改了對象的類結構(例如增刪字段、修改字段類型或順序),是否需要修改版本號取決于序列化協議的兼容性策略和業務場景的容錯需求。以下是詳細分析: 1. 為什么需要考慮版本號? 序列化兼容性問題: 當對象的類結構發生變化時,舊版本的序列…

WPF ObjectDataProvider

在 WPF(Windows Presentation Foundation)中,ObjectDataProvider 是一個非常有用的類,用于將非 UI 數據對象(如業務邏輯類或服務類)與 XAML 綁定集成。它允許在 XAML 中直接調用方法、訪問屬性或實例化對象,而無需編寫額外的代碼。以下是關于 ObjectDataProvider 的詳細…

深度學習-損失函數 python opencv源碼(史上最全)

目錄 定義 種類 如何選擇損失函數? 平方(均方)損失函數(Mean Squared Error, MSE) 均方根誤差 交叉熵 對數損失 筆記回饋 邏輯回歸中一些注意事項: 定義 損失函數又叫誤差函數、成本函數、代價函數…

poll為什么使用poll_list鏈表結構而不是數組 - 深入內核源碼分析

一:引言 在Linux內核中,poll機制是一個非常重要的I/O多路復用機制。它允許進程監視多個文件描述符,等待其中任何一個進入就緒狀態。poll的內部實現使用了poll_list鏈表結構而不是數組,這個設計選擇背后有其深層的技術考量。本文將從內核源碼層面深入分析這個設計決…

使用 Azure AKS 保護 Kubernetes 部署的綜合指南

企業不斷尋求增強其軟件開發和部署流程的方法。DevOps 一直是這一轉型的基石,彌合了開發與運營之間的差距。然而,隨著安全威脅日益復雜,將安全性集成到 DevOps 流水線(通常稱為 DevSecOps)已變得勢在必行。本指南深入探討了如何使用 Azure Kubernetes 服務 (AKS) 來利用 D…

2025年常見滲透測試面試題-webshell免殺思路(題目+回答)

網絡安全領域各種資源,學習文檔,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具,歡迎關注。 目錄 webshell免殺思路 PHP免殺原理 webshell免殺測試: webshell免殺繞過方法: 編…

訪問不到服務器上啟動的llamafactory-cli webui

采用SSH端口轉發有效,在Windows上面進行訪問 在服務器上啟動 llamafactory-cli webui 后,訪問方式需根據服務器類型和網絡環境選擇以下方案: 一、本地服務器(物理機/虛擬機) 1. 直接訪問 若服務器與操作設備處于同一…

基于 LSTM 的多特征序列預測-SHAP可視化!

往期精彩內容: 單步預測-風速預測模型代碼全家桶-CSDN博客 半天入門!鋰電池剩余壽命預測(Python)-CSDN博客 超強預測模型:二次分解-組合預測-CSDN博客 VMD CEEMDAN 二次分解,BiLSTM-Attention預測模型…

C++ 編程指南35 - 為保持ABI穩定,應避免模板接口

一:概述 模板在 C 中是編譯期展開的,不同模板參數會生成不同的代碼,這使得模板類/函數天然不具備 ABI 穩定性。為了保持ABI穩定,接口不要直接用模板,先用普通類打個底,模板只是“外殼”,這樣 AB…

【iOS】OC高級編程 iOS多線程與內存管理閱讀筆記——自動引用計數(二)

自動引用計數 前言ARC規則所有權修飾符**__strong修飾符**__weak修飾符__unsafe_unretained修飾符__autoreleasing修飾符 規則屬性數組 前言 上一篇我們主要學習了一些引用計數方法的內部實現,現在我們學習ARC規則。 ARC規則 所有權修飾符 OC中,為了處…

可信空間數據要素解決方案

可信空間數據要素解決方案 一、引言 隨著數字經濟的蓬勃發展,數據已成為重要的生產要素。可信空間數據要素解決方案旨在構建一個安全、可靠、高效的數據流通與應用環境,促進數據要素的合理配置和價值釋放,推動各行業的數字化轉型和創新發展…

mysql刪除表后重建表報錯Tablespace exists

版本 mysql:8.0.23 復現步驟 1、刪除表 DROP TABLE IF EXISTS xxx_demo; 2、新建表 CREATE TABLE xxx_demo (id bigint NOT NULL AUTO_INCREMENT COMMENT 主鍵id,creator varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT COMMENT 創建者,c…

【Leetcode-Hot100】缺失的第一個正數

題目 解答 有一處需要注意,我使用注釋部分進行交換值,報錯:超出時間限制。有人知道是為什么嗎?難道是先給nums[i]賦值后,從而改變了后一項的索引? class Solution(object):def firstMissingPositive(sel…

從單模態到多模態:五大模型架構演進與技術介紹

前言 1. ResNet — 殘差神經網絡背景核心問題與解決方案原理模型架構ResNet 系列變體技術創新與影響 2. ViT — Vision Transformer背景核心思想發展歷程Transformer的起源:ViT的出現:ViT的進一步發展: 模型架構技術創新與影響 3. Swin Trans…