TensorBoard的使用

2023-07-12 06:00:21

一、使用Pytorch匯入TensorBoard

SummaryWriter詳解

from torch.utils.tensorboard import SummaryWriter
  • SummaryWriter是向事件資料夾log_dir寫入事件檔案的一個操作,並且這個事件檔案可以被Tensorboard進行解析

引數詳解:

  • log_dir:輸入資料夾的名稱(string)。如果為None,預設位置為:runs/**CURRENT_DATETIME_HOSTNAME**

  • 其他不常用引數:comment, purge_step, max_queue, flush_secs, fliename_suffix. 具體用處可以在pycharm中ctrl+單擊SummaryWriter檢視。

二、SummaryWriter中一些子類函數的使用

1.add_scalar():新增標量到SummaryWriter中

(1)引數詳解

  • tag(string): Data的指定方式,圖表的標題

  • scalar(float or string/blobname): 需要儲存的數值

  • global_step(int): 訓練的步數(Global step value to record),結合scalar,那就是訓練到多少步的時候scalar的數值是多少。

  • walltime(float): (不常用引數,可選)Optional override default walltime(time.time()) with seconds after epoch of event

更直觀的引數解釋,可以表示為下圖的方式:

(2)程式碼演示(需要pip tensorborad)

from torch.utils.tensorboard import SummaryWriter

writer=SummaryWriter("logs")  #將事件檔案儲存到logs這個資料夾底下

#繪製一個y=2x的影象
for i in range(100):
    writer.add_scalar("y=x",2*i,i)  # writer.add_scalar(影象標題,y軸,x軸)
writer.close()

2.add_image():新增image到SummaryWriter

(1)引數詳解

  • tag(string): Data的指定方式,圖表的標題

  • img_tensor(torch.Tensor, numpy.array, or string/blobname): 影象資料

  • global_step(int): 訓練的步數(Global step value to record),結合img_tensor,那就是訓練到多少步的時候img_tensor的影象是什麼。

  • walltime(float): (不常用引數,可選)Optional override default walltime(time.time()) with seconds after epoch of event

預設輸入影象資料形狀:

  • (3, H, W):三通道,高,寬

  • 注意:如果輸入資料為 (H, W, 3) 也是可以的,但是需要設定dataformats,如dataformats='HWC'

(2)程式碼演示(需要pip tensorborad)

使用範例:

資料下載地址:百度網路硬碟 請輸入提取碼 (baidu.com)

提取碼:zsh8

① 利用PIL讀取圖片資料

from PIL import Image
image_path="E:\\Desktop\\hymenoptera_data\\hymenoptera_data\\train\\ants\\0013035.jpg"  #圖片路徑
img=Image.open(image_path)  #讀取圖片資訊
print(type(img))


'''
[Run]
<class 'PIL.JpegImagePlugin.JpegImageFile'>
'''
  • 很明顯,該資料型別不符合img_tensor的要求,所以不能用PIL讀取

② 利用Opencv讀取圖片,獲得numpy型圖片資料

利用numpy.array(),對PIL圖片進行轉換,具體操作如下:

from torch.utils.tensorboard import SummaryWriter
from PIL import Image
import numpy as np

writer=SummaryWriter("Image")

image_path="E:\\Desktop\\hymenoptera_data\\hymenoptera_data\\train\\ants\\0013035.jpg"  #圖片路徑
img_PIL=Image.open(image_path)  #讀取圖片的PIL格式

img_array=np.array(img_PIL)  #將PIL型別的圖片資料轉為numpy型資料
print(img_array.shape)   #檢檢視片資料的格式. [Run] (512, 768, 3);即3通道在最後一位

#新增image到SummaryWriter
#由shape資料可知,3通道在最後一位,所以設定為‘HWC’
writer.add_image("test", img_array, 1, dataformats='HWC')

writer.close()

③ 從PIL到numpy,需要在add_image()中指定shape中每一個數位/維表示的含義

三、如何開啟事件檔案logs

在上面writer=SummaryWriter("logs")程式碼的基礎上,建立了一個名稱為logs的檔案,下面我們學習如何開啟它。

1. 開啟方法:使用Anaconda Prompt或Pycharm的Terminal

(1)具體操作

  • 輸入tensorboard --logdir=logs並按回車,需要注意的是:logdir=事件檔案所在的檔名。得到如下語句:

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.13.0 at http://localhost:6006/ (Press CTRL+C to quit)

其中,http://localhost:6006/為tensorboard的開啟位置,可直接單擊開啟

  • 但有的時候,一臺伺服器上有好幾個人在使用,如果都指向6006視窗,則會導致與其他人發生衝突,所以我們可以指定一個埠:

    tensorboard --logdir=logs --port=6007

(2)可能存在的錯誤

開啟可能會出現下面這個頁面:

存在原因及解決辦法如下:

  • tensorboard --logdir=路徑中含有中文

    解決方法:把中文改成英文

  • 路徑錯誤

    解決方法:tensorboard --logdir=路徑,其中這個輸入的路徑不用帶引號

  • tensorboard語句錯誤

    解決方法:在一些tensorboard版本中,開啟路徑的語句為tensorboard --logdir=路徑,但在另一些版本中,開啟路徑的語句為tensorboard --logdir"路徑"

2. 可能存在的顯示錯誤

如果反覆更改上面的程式碼並執行,比如說把\(y=2x\)改為\(y=3x\),那麼可能會出現這樣的影象:

也就是說\(y=2x\)\(y=3x\)會同時出現在同一個影象上,並且還會出現一條擬合這兩個函數的線。解決方法如下:

  • 方法一:把--logdir中對應的資料夾找到,並直接刪除。然後再執行一次程式,繪製想要的圖片。

  • 方法二:建立一個子檔案

3.影象事件檔案的讀取

  • 方法同上

  • 如果要同時讀取幾張圖片,可以有以下方法:

    • writer.add_image("test", img_array, 1, dataformats='HWC')中的step由1改為2或多個,此時可在同一個影象上,翻頁顯示

    • writer.add_image("test", img_array, 1, dataformats='HWC')中的tag由"test"改為另一個名字,此時可開啟一個新的框來顯示影象