Pytorch中Tensorboard的學習

1、Tensorboard介紹

??TensorBoard 是 TensorFlow 開發的一個可視化工具,用于幫助用戶理解和調試機器學習模型的訓練過程。盡管它最初是為 TensorFlow 設計的,但通過 PyTorch 的 torch.utils.tensorboard 模塊,PyTorch 用戶也可以方便地使用 TensorBoard 來記錄和可視化模型訓練中的各種數據(記得先安裝tensorboard包,pytorch不自帶)。
??SummaryWriter 是 PyTorch 中與 TensorBoard 交互的核心類,用于將數據寫入日志文件,供 TensorBoard 解析和展示。

1.1 TensorBoard 的核心功能

  1. 訓練指標可視化:
    記錄損失(Loss)、準確率(Accuracy)、學習率(Learning Rate)等標量數據,并繪制曲線。

  2. 模型結構可視化:
    展示神經網絡的計算圖(模型結構)。

  3. 直方圖和分布:
    可視化權重、梯度等張量的分布變化。

  4. 圖像和音頻:
    記錄輸入圖像、生成樣本或中間特征圖。

  5. 嵌入向量可視化:
    對高維數據進行降維(如 PCA 或 t-SNE),展示在 2D/3D 空間中的分布。

1.2 SummaryWriter 的基本用法

  1. 初始化 SummaryWriter
from torch.utils.tensorboard import SummaryWriter# 創建 SummaryWriter 對象
writer = SummaryWriter(log_dir="runs/experiment_1")

參數:

  • log_dir:日志文件的保存路徑(默認生成 runs/ 目錄下的時間戳文件夾)。
  1. 記錄標量數據(Scalars)
for epoch in range(100):loss = train_model()accuracy = calculate_accuracy()# 記錄損失和準確率writer.add_scalar("Loss/train", loss, epoch)writer.add_scalar("Accuracy/train", accuracy, epoch)
  1. 記錄圖像(Images)
images, _ = next(iter(dataloader))
writer.add_images("Input_images", images, epoch)
  1. 記錄直方圖(Histograms)
weights = model.layer.weight.data
writer.add_histogram("Weights/layer", weights, epoch)
  1. 記錄模型結構(Graph)
dummy_input = torch.randn(1, 3, 224, 224)  # 輸入示例
writer.add_graph(model, dummy_input)
  1. 關閉 Writer
    writer.close()

1.3 啟動 TensorBoard

在命令行中運行以下命令啟動 TensorBoard:

tensorboard --logdir=runs/

然后通過瀏覽器訪問 http://localhost:6006 查看可視化結果。

1.4 關鍵方法詳解

常用方法

方法功能
add_scalar(tag, scalar_value, global_step)記錄單個標量(如 Loss)
add_scalars(main_tag, tag_scalar_dict, global_step)記錄多個標量(如 Loss 和 Accuracy)
add_image(tag, img_tensor, global_step)記錄單張圖像(格式需為 CxHxW)
add_images(tag, img_tensor, global_step)記錄多張圖像(格式為 NxCxHxW)
add_histogram(tag, values, global_step)記錄張量分布直方圖
add_graph(model, input_to_model)記錄模型計算圖

1.5 使用示例

import torch
from torch.utils.tensorboard import SummaryWriter# 初始化
writer = SummaryWriter("runs/demo")# 模擬訓練過程
for epoch in range(100):# 假設訓練邏輯loss = 1.0 / (epoch + 1)accuracy = 0.8 - 0.002 * epoch# 記錄標量writer.add_scalar("Loss/train", loss, epoch)writer.add_scalar("Accuracy/train", accuracy, epoch)# 記錄隨機直方圖weights = torch.randn(100)writer.add_histogram("Random_weights", weights, epoch)# 記錄模型結構(假設 model 已定義)
dummy_input = torch.randn(1, 3, 224, 224)
writer.add_graph(model, dummy_input)# 關閉 Writer
writer.close()

1.6 注意事項

  1. 數據頻率:
    避免在每個訓練步(step)都記錄大量數據,否則日志文件會過大。

  2. 實驗管理:
    使用不同的 log_dir 區分不同實驗(如 runs/exp1, runs/exp2)。

  3. 張量格式:
    圖像數據需符合 CxHxW 格式(通道優先)。

  4. 性能影響:
    高頻記錄可能影響訓練速度,需權衡監控需求與效率。

1.7 總結

  • TensorBoard 是模型訓練可視化的標準工具,支持標量、圖像、直方圖等多種數據。
  • SummaryWriter 是 PyTorch 與 TensorBoard 的橋梁,通過簡單的方法將數據寫入日志。
  • 典型工作流程:
    記錄數據 → 啟動 TensorBoard → 瀏覽器查看 → 分析優化模型。

通過結合 TensorBoard 和 SummaryWriter,可以直觀地監控模型訓練過程,快速定位問題(如過擬合、梯度消失等),是深度學習開發中的必備技能。

2、Tensorboard實操

2.1 測試Tensorboard

2.1.1 add_scalar 函數介紹

??將單個標量值(如損失、準確率、學習率)記錄到 TensorBoard 日志中,生成隨時間/步驟變化的曲線圖,便于可視化分析。

基本語法

add_scalar(tag, scalar_value, global_step=None, walltime=None)

參數說明
tag (字符串)

  • 標識數據的標簽,決定在 TensorBoard 中的圖表標題和分組。
  • 支持層級命名(如 “train/loss” 和 “val/loss”),TensorBoard 會自動按斜杠分組顯示。

scalar_value (浮點數或標量張量)

  • 要記錄的具體數值(如 loss.item() 或 accuracy)。

global_step (整數, 可選)

  • 當前記錄的“步驟”,通常是迭代次數、epoch 數或自定義的計數器。
  • 作為曲線的橫坐標,需確保遞增以正確顯示變化趨勢。

walltime (浮點數, 可選)

  • 覆蓋默認的時間戳(記錄時刻),一般無需手動設置。

示例代碼

from torch.utils.tensorboard import SummaryWriter# 創建 SummaryWriter,日志保存到 runs/test 目錄
writer = SummaryWriter("runs/test")for i in range(100):# 記錄 y=3x 的標量值:tag為"y=3x",值為3*i,步驟為iwriter.add_scalar("y=3x", 3 * i, i)writer.close()  # 關閉寫入器,確保數據保存
  • tag=“y=3x”:在 TensorBoard 中生成名為 y=3x 的曲線圖。
  • scalar_value=3*i:每次迭代記錄的值(模擬 y=3x 函數)。
  • global_step=i:橫軸表示迭代步驟,從 0 到 99 遞增。

使用建議
命名規范

  • 使用清晰的層級標簽(如 “train/loss”、“val/accuracy”)以便在 TensorBoard 中分類查看。

步驟連續性

  • global_step 應單調遞增(如 0,1,2,…),避免跳躍或重復,否則圖表可能混亂。

高效記錄

  • 避免高頻調用(如每個 batch 都記錄),可每隔若干步記錄一次以減少開銷。

查看結果
運行后,使用以下命令啟動 TensorBoard:

tensorboard --logdir=runs/test

在瀏覽器中打開提示的鏈接,即可看到 y=3x 的線性增長曲線。

注意事項

  • 路徑引號問題:確保路徑字符串使用英文引號(如 “runs/test”),而非中文引號“”或‘’。
  • 及時關閉 Writer:調用 writer.close() 或在 with 塊中使用,防止日志未保存。

相關方法

add_scalars:同時記錄多個標量(如訓練和驗證損失對比):

writer.add_scalars("loss", {"train": train_loss, "val": val_loss}, epoch)

其他記錄方法:如 add_image(記錄圖像)、add_histogram(權重分布)等,用于多維數據可視化。

2.1.2 實例

from torch.utils.tensorboard import SummaryWriter# 創建一個 SummaryWriter 對象
writer = SummaryWriter("runs/test")
for i in range(100):writer.add_scalar("y=3x", 3*i, i)
writer.close()

??運行上述程序之后,會發現程序所在目錄中多了個文件夾runs,文件夾runs中有一個文件夾test:

在這里插入圖片描述
??如果想要查看可視化結果,可以在終端執行命令:

tensorboard --logdir=runs/

在這里,logdir=事件文件所在的文件夾,在本例中為logdir=test(注意不是logdir = runs/test,只能是一級目錄):

tensorboard --logdir=test     

運行之后,返回結果:

TensorFlow installation not found - running with reduced feature set.
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.19.0 at http://localhost:6006/ (Press CTRL+C to quit)

點擊網址,即可查看可視化結果。

在這里插入圖片描述

如果打開網址看不到你的數據結果,嘗試把相對路徑(test)換為絕對路徑再重新運行并打開網址即可。
??另外,如果想要更改端口號(即上面網址中的6006),可以在終端執行以下命令:

tensorboard --logdir=test --port=6007 

2.2 讀取圖像數據

2.2.1 add_jmage函數介紹

??SummaryWriter 中的 .add_image 方法用于將圖像數據記錄到 TensorBoard 中,幫助用戶可視化訓練過程中的圖像變化。

基本語法

add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')

參數說明:

  • tag (str): 圖像的名稱標識,用于在 TensorBoard 中分類顯示。
  • img_tensor (Tensor): 圖像張量,支持多種格式(需通過 dataformats 指定)。
  • global_step (int, 可選): 記錄的步驟(如訓練步數或 epoch),用于滑動查看圖像變化。
  • walltime (float, 可選): 自定義時間戳,默認使用當前時間。
  • dataformats (str, 可選): 圖像張量的格式,默認為 ‘CHW’(通道數 × 高度 × 寬度)。

圖像張量格式
常見格式:

  • 單圖像:(C, H, W)(默認)或 (H, W, C)(需設置 dataformats=‘HWC’)。
  • 灰度圖:(1, H, W) 或 (H, W)(需設置 dataformats=‘HW’)。
  • 批量圖像:使用 .add_images 或 torchvision.utils.make_grid 合并為網格后記錄。

數據類型與范圍:

  • 浮點型:數值范圍應為 [0.0, 1.0]。
  • 整型(uint8):數值范圍應為 [0, 255]。

使用步驟

  1. 導入庫并創建 SummaryWriter:
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
  1. 準備圖像張量:

從隨機數據生成:

img = torch.rand(3, 64, 64)  # 3通道,64x64,范圍[0,1]

從文件加載并轉換:

from PIL import Image
import numpy as np
import torch# 讀取圖像并轉為張量
image = Image.open("example.jpg")
img_array = np.array(image)
if img_array.ndim == 3:img_tensor = torch.from_numpy(img_array.transpose(2, 0, 1))  # HWC → CHW
else:img_tensor = torch.from_numpy(img_array).unsqueeze(0)       # 灰度圖添加通道維度
img_tensor = img_tensor.float() / 255.0  # 歸一化到[0,1]
  1. 記錄圖像:
writer.add_image('my_image', img_tensor, global_step=0)
  1. 處理多張圖像(網格):
import torchvisionimages = torch.randn(16, 3, 64, 64)        # 16張圖像
grid = torchvision.utils.make_grid(images, nrow=4)  # 合并為4x4網格
writer.add_image('16_images_grid', grid, 0)

注意事項

  • 數據范圍:若張量值超出 [0, 1] 或 [0, 255],需手動歸一化:
img = (img - img.min()) / (img.max() - img.min())  # 歸一化到[0,1]
  • 格式匹配:若張量形狀與 dataformats 不匹配,TensorBoard 可能無法正確顯示。
    例如:(H, W, C) 需設置 dataformats=‘HWC’。單通道灰度圖 (H, W) 需設置 dataformats=‘HW’。
  • GPU 張量:若張量在 GPU 上,需先移至 CPU:
img_tensor = img_tensor.cpu()

示例代碼

from torch.utils.tensorboard import SummaryWriter
import torchwriter = SummaryWriter()# 生成隨機圖像(3通道,64x64)
img = torch.rand(3, 64, 64)
writer.add_image('random_image', img, 0)# 記錄多張圖像的網格
images = torch.randn(16, 3, 64, 64)
grid = torchvision.utils.make_grid(images, nrow=4)
writer.add_image('image_grid', grid, 0)writer.close()

運行后,在命令行啟動 TensorBoard:

tensorboard --logdir=runs

通過以上步驟,可有效利用 .add_image 監控模型輸入、輸出或中間特征圖,提升訓練過程的可解釋性。

2.2.2 示例

??接下來使用SummaryWriter類中的.add_image()方法來讀取圖像數據。使用的圖像為.jpg格式文件:

在這里插入圖片描述

由于PIL中Image.open()打開的圖片類型為<class ‘PIL.JpegImagePlugin.JpegImageFile’>,而方法add_image()中
img_tensor 參數必須為圖像張量: (torch.Tensor, numpy.ndarray, or string/blobname)

        Args:tag (str): Data identifierimg_tensor (torch.Tensor, numpy.ndarray, or string/blobname): Image dataglobal_step (int): Global step value to recordwalltime (float): Optional override default walltime (time.time())seconds after epoch of eventdataformats (str): Image data format specification of the formCHW, HWC, HW, WH, etc.

因此,使用img_array = np.array(img_PIL)將PIL類型圖像轉換為numpy.ndarray類型圖像。

>>> import numpy as np
>>> img_array = np.array(img_PIL)
>>> type(img_array)
<class 'numpy.ndarray'>
>>> img_array.shape
(512, 768, 3)

??此外,轉換為numpy.ndarray類型圖像之后,方法add_image()中參數dataformats (str, 可選): 圖像張量的格式,默認為 ‘CHW’(通道數 × 高度 × 寬度)。而轉換之后的格式為(H x W x C),因此需要設置該參數為dataformats=‘HWC’。

完整代碼:

from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image# 創建一個 SummaryWriter 對象
writer = SummaryWriter("runs")
image_path = "hymenoptera_data/train/ants/0013035.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)
print(type(img_array))
print(img_array.shape)writer.add_image("train", img_array, 1, dataformats='HWC')
for i in range(100):writer.add_scalar("y=3x", 3*i, i)
writer.close()

??在終端執行命令:

tensorboard --logdir=E:\my_pycharm_projects\project1\runs  

運行:

TensorFlow installation not found - running with reduced feature set.
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.19.0 at http://localhost:6006/ (Press CTRL+C to quit)

點擊網址,即可查看可視化結果:
在這里插入圖片描述

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

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

相關文章

ETL 自動化:提升數據處理效率與準確性的核心驅動力

在數字化轉型的浪潮中&#xff0c;數據已成為企業戰略資產&#xff0c;高效處理數據的能力直接關系到企業的競爭力。ETL&#xff08;Extract, Transform, Load&#xff09;自動化作為數據處理領域的關鍵技術&#xff0c;正逐漸成為企業在數據時代脫穎而出、實現高效運營與精準決…

std::endl為什么C++ 智能提示是函數?

在使用vscode 的C智能提示后&#xff0c;輸入endl 后&#xff0c;提示的卻是std::endl(basic_ostream<CharT, Traits> &os), 感覺比較奇怪&#xff0c;各種代碼里都是直接用的std::endl 啊&#xff0c; 這里怎么變成函數了呢&#xff1f; 在 C 中&#xff0c;std::en…

簡潔、實用、無插件和更安全為特點的WordPress主題

簡站WordPress主題是一款以簡潔、實用、無插件和更安全為特點的WordPress主題&#xff0c;自2013年創立以來&#xff0c;憑借其設計理念和功能優勢&#xff0c;深受用戶喜愛。以下是對簡站WordPress主題的詳細介紹&#xff1a; 1. 設計理念 簡站WordPress主題的核心理念是“崇…

數據結構篇:空間復雜度和時間復雜度

目錄 1.前言&#xff1a; 1.1 學習感悟 1.2 數據結構的學習之路(初階) 2.什么是數據結構和算法 2.1 數據結構和算法的關系 2.2 算法的重要性 2.3 如何衡量算法的好壞 3.時間復雜度 3.1 時間復雜度的概念 3.2 大O的漸進表示法 O() 4.空間復雜度 5. 常見的時間復雜度和…

node-ddk,electron,截屏封裝(js-web-screen-shot)

node-ddk 截屏封裝(js-web-screen-shot) https://blog.csdn.net/eli960/article/details/146207062 也可以下載demo直接演示 http://linuxmail.cn/go#node-ddk 感謝/第三方 本截屏工具, 使用的是: js-web-screen-shot https://www.npmjs.com/package/vue-web-screen-shot…

泰坦軍團攜手順網旗下電競連鎖品牌樹呆熊 共創電競新紀元

在電競行業的浪潮中&#xff0c;品牌之間的戰略合作愈發成為推動市場前行的重要動力。最近&#xff0c;電競顯示器領域領軍品牌泰坦軍團高層領導出席順網旗下電競連鎖品牌樹呆熊十周年盛典。會議現場&#xff0c;雙方高層領導宣布泰坦軍團與樹呆熊正式達成戰略合作伙伴關系。 在…

HandyJSON原理

HandyJSON 的優勢 JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式, 應用廣泛. 在 App 的使用過程中, 服務端給移動端發送的大部分都是 JSON 數據, 移動端需要解析數據才能做進一步的處理. 在解析JSON數據這一塊, 目前 Swift 中流行的框架基本上是 SwiftyJSON, …

信號的產生和保存

信號的產生 信號就是操作系統對用戶操作做出的反應&#xff0c;但它的本質就是往操作系統寫入信號&#xff0c;這是由操作系統的結構決定的。通過修改比特位來告訴操作系統接收信號和傳了幾號信號。 也正是因為我們身為用戶無法親自修改內核數據&#xff0c;所以我們需要通過操…

在C++ Qt中集成Halcon窗口并實現跨平臺兼容和大圖加載

目錄 1. Halcon窗口嵌入Qt Widget 2. 處理大圖加載 3. 多線程優化顯示 4. 跨平臺兼容性 1. Halcon窗口嵌入Qt Widget 將Halcon的HWindow控件嵌入到Qt的QWidget容器中,利用系統原生句柄實現跨平臺。 #include <HalconCpp.h> #include <QWidget>class HalconWi…

深度學習技術與應用的未來展望:從基礎理論到實際實現

深度學習作為人工智能領域的核心技術之一&#xff0c;近年來引起了極大的關注。它不僅在學術界帶來了革命性的進展&#xff0c;也在工業界展現出了廣泛的應用前景。從圖像識別到自然語言處理&#xff0c;再到強化學習和生成對抗網絡&#xff08;GAN&#xff09;&#xff0c;深度…

藍光三維掃描技術:汽車零部件檢測的精準高效之選

——汽車方向盤配件、保險杠塑料件、鈑金件檢測項目 汽車制造工業的蓬勃發展&#xff0c;離不開強大的零部件制造體系作支撐。汽車零部件作為汽車工業的基礎&#xff0c;其設計水平、制造工藝、質量控制手段逐漸與國際標準接軌&#xff0c;對于零部件面差、孔位、圓角、特征線…

數據庫聯表Sql語句建一個新表(MySQL,Postgresql,SQL server)

數據庫聯表Sql語句建一個新表(MySQL,Postgresql,SQL server) 如果你想基于 SELECT USERS.ID,USERS.NAME,USERS.EMAIL,USERS.ID_CARD,USERS.V_CARD,USERS.ADDRESS,v_card.type,v_card.amount FROM USERS JOIN v_card on USERS.V_CARDv_card.v_card 這個查詢結果創建一個新表&am…

六十天前端強化訓練之第三十天之深入解析Vue3電商項目:TechStore全棧實踐(文結尾附有源代碼)

歡迎來到編程星辰海的博客講解 看完可以給一個免費的三連嗎&#xff0c;謝謝大佬&#xff01; 目錄 深入解析Vue3電商項目&#xff1a;TechStore全棧實踐 一、項目架構設計 二、核心功能實現 三、組合式API深度實踐 四、性能優化實踐 五、項目擴展方向 六、開發經驗總結…

【人工智能】機器學習中的評價指標

機器學習中的評價指標 在機器學習中&#xff0c;評估指標&#xff08;Evaluation Metrics&#xff09;是衡量模型性能的工具。選擇合適的評估指標能夠幫助我們更好地理解模型的效果以及它在實際應用中的表現。 一般來說&#xff0c;評估指標主要分為三大類&#xff1a;分類、…

不同機床對螺桿支撐座的要求有哪些不同?

螺桿支撐座是機械設備中重要的支撐部件&#xff0c;其選擇直接影響到設備的穩定性和使用壽命&#xff0c;尤其是在機床中&#xff0c;不同的機床對螺桿支撐座的要求也是不同的。 1、精度&#xff1a;精密測量用的基準平面和精密機床機械的檢驗測量設備&#xff0c;需要使用高精…

在Spring Boot中,可以通過實現一些特定的接口來拓展Starter

在Spring Boot中&#xff0c;開發者可以通過實現一些特定的接口來拓展Starter。這些接口允許開發者自定義Spring Boot應用程序的配置和行為&#xff0c;從而創建功能豐富且易于使用的Starter。以下是一些關鍵的接口&#xff0c;用于拓展Starter&#xff1a; EnvironmentPostPro…

深入理解 tree 命令行工具:目錄結構可視化的利器

文章目錄 前言1. 什么是 tree 命令&#xff1f;安裝 tree 2. tree 的基本用法顯示當前目錄的樹狀結構顯示指定目錄的樹狀結構 3. tree 的常用選項3.1 顯示隱藏文件3.2 排除特定目錄或文件3.3 限制遞歸深度3.4 顯示文件大小3.5 顯示文件的權限信息3.6 將輸出保存到文件 4. 實際應…

Federated learning client selection algorithm based on gradient similarity閱讀

基于梯度相似性的聯邦學習客戶端選擇算法 Abstract 摘要introduction**背景****目的****結論****結果****討論****思路** 鏈接&#xff1a;https://link.springer.com/article/10.1007/s10586-024-04846-0 三區 Abstract 摘要 聯邦學習&#xff08;FL&#xff09;是一種創新的…

【測試工具】如何使用 burp pro 自定義一個攔截器插件

在 Burp Suite 中&#xff0c;你可以使用 Burp Extender 編寫自定義攔截器插件&#xff0c;以攔截并修改 HTTP 請求或響應。Burp Suite 支持 Java 和 Python (Jython) 作為擴展開發語言。以下是一個完整的流程&#xff0c;介紹如何創建一個 Burp 插件來攔截請求并進行自定義處理…

網絡編程的概念&作用

網絡編程是什么&#xff1f; 想象一下&#xff0c;你和朋友在不同的房間里&#xff0c;你們想互相傳遞紙條聊天。網絡編程就像是編寫一套規則&#xff0c;讓計算機能夠通過網絡&#xff08;比如互聯網&#xff09;互相傳遞信息。這些信息可以是文字、圖片、視頻&#xff0c;甚…