深度學習PyTorch之動態計算圖可視化 - 使用 torchviz 生成計算圖

序號系列文章
1深度學習訓練中GPU內存管理
2深度學習PyTorch之數據加載DataLoader
3深度學習 PyTorch 中 18 種數據增強策略與實現
4深度學習pytorch之簡單方法自定義9類卷積即插即用
5深度學習PyTorch之13種模型精度評估公式及調用方法
6深度學習pytorch之4種歸一化方法(Normalization)原理公式解析
7深度學習pytorch之19種優化算法(optimizer)解析
8深度學習pytorch之22種損失函數數學公式和代碼定義
9DIY損失函數–以自適應邊界損失為例
10深度學習PyTorch之動態計算圖可視化 - 使用 torchviz 生成計算圖

文章目錄

        • 前言
        • 1. 什么是動態計算圖?
        • 2. 為什么要可視化計算圖?
        • 3. 使用 `torchviz` 生成計算圖
          • 3.1 安裝 `torchviz`
          • 3.2 生成計算圖完整代碼示例
          • 3.3 在訓練過程中生成計算圖
          • 3.4 代碼解讀
          • 3.5 生成的計算圖
        • 4. `torchviz` 的更多應用
        • 5. 總結
        • 參考文獻

前言

在深度學習模型的開發過程中,理解和可視化模型的計算圖對于調試、優化和教學都具有重要意義。PyTorch 采用的是動態圖機制,這使得每次前向傳播時計算圖都被動態創建。而 torchviz 是一個非常有用的工具,它可以將這些動態圖轉化為可視化圖形,幫助我們更直觀地理解模型的計算過程。在本篇博客中,我們將重點介紹如何使用 torchviz 生成和保存 PyTorch 模型的計算圖,并結合實際訓練代碼進行展示。

1. 什么是動態計算圖?

在 PyTorch 中,計算圖并不是在模型初始化時構建好的,而是通過前向傳播過程動態地構建的。這種動態特性意味著每次運行時,計算圖會根據輸入數據的形狀和大小而變化,因此我們可以靈活地進行調試和優化。PyTorch 的動態圖提供了較高的靈活性,允許在計算圖中嵌入復雜的控制流結構(例如循環和條件判斷)。

2. 為什么要可視化計算圖?

可視化計算圖的優勢在于:

  • 調試:通過查看每一層的輸入輸出,可以快速發現模型設計上的問題。
  • 優化:通過分析計算圖,可以識別瓶頸和不必要的計算,進而優化模型性能。
  • 教學:對于新手來說,計算圖能夠幫助他們理解深度學習模型的前向傳播過程。

雖然 PyTorch 的動態圖功能非常強大,但由于它不提供直接的計算圖展示方式,因此我們需要借助外部工具 torchviz 進行可視化。

3. 使用 torchviz 生成計算圖

torchviz 是一個能夠將 PyTorch 計算圖轉化為圖形的庫,具體來說,它能夠將計算圖渲染為 DOT 格式并生成可視化圖像文件(如 PNG 或 PDF)。我們通過以下幾步可以生成計算圖:

3.1 安裝 torchviz

首先,你需要安裝 torchviz 庫。可以通過 pip 安裝:

pip install torchviz

此時會直接將graphviz,torchziv兩個都安裝好,但是這種方法無法將graphviz導入系統路徑。出現報錯graphviz.backend.ExecutableNotFound: failed to execute ‘dot‘, make sure the Graphviz executables are***,需要從網址 Download | Graphviz下載graphviz的zip格式文件,解壓后復制到以下python路徑下即可。

在這里插入圖片描述

3.2 生成計算圖完整代碼示例

核心語句只包括make_dot和render兩個函數,其中:

  • make_dot(y) 會根據輸入張量 y 的計算過程生成計算圖。
  • render(“model_graph”, format=“png”) 將計算圖保存為 PNG 圖片。
import torch
import torch.nn as nn
import torch.optim as optim
from torchviz import make_dot# 定義一個簡單的神經網絡
class SimpleNN(nn.Module):def __init__(self):super(SimpleNN, self).__init__()self.fc1 = nn.Linear(2, 2)self.fc2 = nn.Linear(2, 1)def forward(self, x):x = torch.relu(self.fc1(x))x = self.fc2(x)return x# 創建模型實例
model = SimpleNN()# 輸入數據
x = torch.randn(1, 2)# 前向傳播
y = model(x)# 可視化計算圖
dot = make_dot(y, params=dict(model.named_parameters()))
dot.render("model_graph", format="png")  # 保存圖像為png文件

復制以上代碼運行后生成model_graph.png如
在這里插入圖片描述

3.3 在訓練過程中生成計算圖

假設你已經有了一個標準的 PyTorch 訓練代碼,并且希望在訓練過程中生成計算圖。我們可以在每次前向傳播時使用 torchviz.make_dot 來生成計算圖,并保存為 PNG 文件。

以下是一個集成計算圖生成的訓練代碼示例:

import torch
from torchviz import make_dotfor epo in range(epo_num):print(epo)train_loss = 0train_acc = 0.0seg_model.train()for index, (img, label) in enumerate(train_dataloader):img = img.to(device)label = label.to(device)optimizer.zero_grad()output = seg_model(img)  # 得到模型輸出# 使用 torch.sigmoid 激活函數output = torch.sigmoid(output)# 生成計算圖并保存為 PNG 文件if index == 0:  # 只在第一個batch時生成計算圖dot = make_dot(output, params=dict(seg_model.named_parameters()))dot.render("model_graph_epoch_{}_batch_{}".format(epo, index), format="png")  # 保存為 epoch_x_batch_y.png# 計算損失loss = criterion(output, label)loss.backward()iter_loss = loss.item()all_train_iter_loss.append(iter_loss)train_loss += iter_lossoptimizer.step()# 計算準確率output_1 = output.argmax(dim=1)label_1 = label.argmax(dim=1)correct = torch.eq(output_1, label_1).sum().item()iter_acc = correct / label_1.numel()all_train_iter_acc.append(iter_acc)train_acc += iter_acc
3.4 代碼解讀
  1. 前向傳播output = seg_model(img) 這一行執行了前向傳播,計算了模型的輸出。

  2. 計算圖生成:在每個 epoch 的第一個 batch 中,使用 make_dot(output, params=dict(seg_model.named_parameters())) 來生成計算圖。output 是模型的輸出,而 seg_model.named_parameters() 則提供了模型的參數信息,這對于生成完整的計算圖非常有幫助。

  3. 保存計算圖:通過 dot.render() 將計算圖保存為 PNG 格式的文件。文件名包含當前的 epoch 和 batch 索引,以便于區分。

    dot.render("model_graph_epoch_{}_batch_{}".format(epo, index), format="png")
    
3.5 生成的計算圖

計算圖會包含模型中的每個操作(如矩陣乘法、加法等),以及這些操作之間的連接關系。通過計算圖(以下示例),你可以清楚地看到模型的每一步計算如何進行。
在這里插入圖片描述

4. torchviz 的更多應用

除了在訓練過程中生成計算圖,torchviz 還可以用于以下場景:

  • 單步調試:如果你的模型非常復雜,可以在某個特定步驟(如單個前向傳播)生成計算圖,幫助調試。

  • 模型設計:在設計新的網絡架構時,通過生成計算圖,可以確保每一層的輸入輸出形狀是正確的。

  • 計算性能分析:通過分析計算圖中的每個節點,可以識別出性能瓶頸并進行優化。

5. 總結

PyTorch 的動態圖特性使得每次前向傳播時計算圖都是動態生成的,而 torchviz 則提供了一個簡便的工具,可以將這些動態生成的計算圖可視化為圖像文件。通過將 torchviz 集成到訓練代碼中,我們可以在訓練過程中實時生成計算圖,這不僅有助于我們調試模型,還可以為教學和研究提供更清晰的解釋。

參考文獻
  • torchviz GitHub
  • PyTorch 官方文檔

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

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

相關文章

K8S學習之基礎四十五:k8s中部署elasticsearch

k8s中部署elasticsearch 安裝并啟動nfs服務yum install nfs-utils -y systemctl start nfs systemctl enable nfs.service mkdir /data/v1 -p echo /data/v1 *(rw,no_root_squash) >> /etc/exports exports -arv systemctl restart nfs創建運行nfs-provisioner需要的sa賬…

Go紅隊開發—CLI框架(一)

CLI開發框架 命令行工具開發,主要是介紹開發用到的包,集成了一個框架,只要學會了基本每個人都能開發安全工具了。 該文章先學flags包,是比較經典的一個包,相比后面要學習的集成框架這個比較自由比較細化點&#xff0…

eclipse [jvm memory monitor] SHOW_MEMORY_MONITOR=true

eclipse虛擬機內存監控設置SHOW_MEMORY_MONITORtrue D:\eclipse-jee-oxygen-2-win32-x86_64\workspace\.metadata\.plugins\org.eclipse.core.runtime\.settings org.eclipse.ui.prefs (文件比較多,別找錯了) SHOW_MEMORY_MONITORtrue 重啟 -xms 1024…

量子計算與人工智能的融合:下一代算力革命

1. 引言:算力需求的飛速增長與量子計算的潛力 在信息技術飛速發展的今天,人工智能(AI)已經滲透到我們生活的方方面面,從智能助手到自動駕駛,再到醫療診斷,AI 的應用場景日益廣泛。然而&#xf…

Linux paste命令

目錄 一. 簡介二. 基本語法三. 小案例 一. 簡介 paste 命令用于合并多個文件的行&#xff0c;按列方式輸出&#xff0c;默認以制表符&#xff08;Tab&#xff09;分隔。 ?基本語法 paste [選項] 文件1 文件2 ...二. 基本語法 <()的方式模擬文件流paste命令將2個文件流粘…

uniapp處理流式請求

在uniapp里面處理流式請求相對于web端來說有點麻煩&#xff0c;下面我將講述幾種處理流式請求的方式。 1.websocket WebSocket 是處理實時數據流的最佳選擇之一&#xff0c;UniApp 提供了原生的 WebSocket 支持&#xff1a; <template><view class"container&…

低代碼理解

一、低代碼開發的核心定義 低代碼開發是通過可視化界面和聲明式編程替代傳統手工編碼的軟件開發范式&#xff0c;其核心目標是&#xff1a; 降低技術門檻&#xff1a;允許非專業開發者&#xff08;公民開發者&#xff09;參與應用構建提升開發效率&#xff1a;通過復用預制組…

WHAM 人體3d重建部署筆記 vitpose

目錄 視頻結果: docker安裝說明: conda環境安裝說明: 依賴項: 依賴庫: 安裝 mmpose,mmcv 下載模型權重: 算法原理, demo腳本 報錯inference_top_down_pose_model: 測試命令: 視頻結果: wham_smpl預測結果 git地址: GitHub - yohanshin/WHAM WHAM: Recons…

react 大屏根據屏幕分辨率縮放

記錄&#xff0c;以防忘記 const DataLargeScreen () > {const layoutRef useRef<any>();// ui稿寬度const width useRef(1920).current;// ui稿高度const height useRef(1080).current;const [scaleValue, setScaleValue] useState(1);const useWhichScaleValu…

【網絡】網關

【網絡】網關 網關 是計算機網絡中用于連接兩個不同網絡的設備或服務器&#xff0c;它充當著“翻譯器”和“轉發器”的角色&#xff0c;將數據包從一個網絡傳遞到另一個網絡&#xff0c;并在必要時進行協議轉換和數據重包裝。 主要功能 數據轉發&#xff1a;當本地網絡設備發…

Axure大屏可視化模板:賦能多領域,開啟數據展示新篇章

在當今這個數據爆炸的時代&#xff0c;數據已經成為各行各業的核心資產。然而&#xff0c;如何高效、直觀地展示數據&#xff0c;并將其轉化為有價值的決策依據&#xff0c;成為了許多企業和組織面臨的共同挑戰。Axure大屏可視化模板&#xff0c;作為一款強大的數據展示工具&am…

數據不外傳!通過內網穿透實現綠聯NAS遠程訪問的安全配置方案

文章目錄 前言1. 開啟ssh服務2. ssh連接3. 安裝cpolar內網穿透4. 配置綠聯NAS公網地址 前言 大家好&#xff0c;今天要帶給大家一個超級酷炫的技能——如何讓綠聯NAS秒變‘千里眼’&#xff0c;通過簡單的幾步操作就能輕松實現內網穿透。想象一下&#xff0c;無論你身處何地&a…

面試題精選《劍指Offer》:JVM類加載機制與Spring設計哲學深度剖析-大廠必考

一、JVM類加載核心機制 &#x1f525; 問題5&#xff1a;類從編譯到執行的全鏈路過程 完整生命周期流程圖 關鍵技術拆解 編譯階段 查看字節碼指令&#xff1a;javap -v Robot.class 常量池結構解析&#xff08;CONSTANT_Class_info等&#xff09; 類加載階段 // 手動加載…

WordPress分類目錄綁定二級域名插件

一.子域名訪問形式 1.wordpress 分類目錄 轉換為 子域名 &#xff08;綁定二級域名&#xff09;形式 2.wordpress 頁面轉換為 子域名 &#xff08;綁定二級域名&#xff09; 形式 3.wordpress 作者頁轉換為 子域名 &#xff08;綁定二級域名&#xff09;形式 4.為不同子域名…

Shopify Checkout UI Extensions

結賬界面的UI擴展允許應用開發者構建自定義功能&#xff0c;商家可以在結賬流程的定義點安裝&#xff0c;包括產品信息、運輸、支付、訂單摘要和Shop Pay。 Shopify官方在去年2024年使用結賬擴展取代了checkout.liquid&#xff0c;并將于2025年8月28日徹底停用checkout.liquid…

華為HCIE方向那么多應該如何選擇?

在華為認證體系里&#xff0c;HCIE作為最高等級的認證&#xff0c;是ICT領域專業實力的有力象征。HCIE設置了多個細分方向&#xff0c;這些方向宛如不同的專業賽道&#xff0c;為期望在ICT行業深入發展的人提供了豐富的選擇。今天&#xff0c;咱們就來好好聊聊華為HCIE方向的相…

bootstrap介紹(前端框架)(提供超過40種可復用組件,從導航欄到輪播圖,從卡片到彈窗)bootstrap框架

文章目錄 Bootstrap框架全解析起源與發展核心特性與優勢響應式設計組件豐富度一致性與兼容性 柵格系統深度解析柵格系統工作原理斷點設置與響應式策略 組件系統導航組件表單系統 自定義與擴展SASS變量系統構建系統優化 性能優化策略按需加載減少嵌套層級 實踐案例&#xff1a;電…

FastGPT原理分析-數據集創建第二步:處理任務的執行

概述 文章《FastGPT原理分析-數據集創建第一步》已經分析了數據集創建的第一步&#xff1a;文件上傳和預處理的實現邏輯。本文介紹文件上傳后&#xff0c;數據處理任務的具體實現邏輯。 數據集創建總體實現步驟 從上文可知數據集創建總體上來說分為兩大步驟&#xff1a; &a…

el-select下拉框,搜索時,若是匹配后的數據有且只有一條,則當失去焦點時,默認選中該條數據

1、使用指令 當所需功能只能通過直接的 DOM 操作來實現時&#xff0c;才應該使用自定義指令。可使用方法2封裝成共用函數&#xff0c;但用指令他人復用時比較便捷。 <el-tablev-loading"tableLoading"border:data"tableList"default-expand-allrow-key…

vue中keep-alive組件的使用

keep-alive是vue的內置組件&#xff0c;它的主要作用是對組件進行緩存&#xff0c;避免組件在切換時被重復創建和銷毀&#xff0c;從而提高應用的性能和用戶體驗。它自身不會渲染一個 DOM 元素&#xff0c;也不會出現在父組件鏈中。使用時&#xff0c;只需要將需要緩存的組件包…