PyTorch項目使用TensorboardX進行訓練可視化


轉自:(41條消息) 詳解PyTorch項目使用TensorboardX進行訓練可視化_淺度寺-CSDN博客_tensorboardx

什么是TensorboardX

Tensorboard 是 TensorFlow 的一個附加工具,可以記錄訓練過程的數字、圖像等內容,以方便研究人員觀察神經網絡訓練過程。可是對於 PyTorch 等其他神經網絡訓練框架並沒有功能像 Tensorboard 一樣全面的類似工具,一些已有的工具功能有限或使用起來比較困難 (tensorboard_logger, visdom等) 。TensorboardX 這個工具使得 TensorFlow 外的其他神經網絡框架也可以使用到 Tensorboard 的便捷功能。TensorboardX 的 github倉庫在這里。

配置TensorboardX

環境要求

  • 操作系統:MacOS / Ubuntu (Windows未測試)
  • Python2/3
  • PyTorch >= 1.0.0 && torchvision >= 0.2.1 && tensorboard >= 1.12.0

以上版本要求你對應TensorboardX@1.6版本。為保證版本時效性,建議大家按照 TensorboardX github倉庫中README 的要求進行環境配置。

安裝

可以直接使用 pip 進行安裝,或者從源碼進行安裝。

使用 pip 安裝

pip install tensorboardX

從源碼安裝

git clone https://github.com/lanpa/tensorboardX && cd tensorboardX && python setup.py install

使用TensorboardX

首先,需要創建一個 SummaryWriter 的示例:

#舉個例子
from
tensorboardX import SummaryWriter # Creates writer1 object. # The log will be saved in 'runs/exp' writer1 = SummaryWriter('runs/exp') # Creates writer2 object with auto generated file name # The log directory will be something like 'runs/Aug20-17-20-33' writer2 = SummaryWriter() # Creates writer3 object with auto generated file name, the comment will be appended to the filename. # The log directory will be something like 'runs/Aug20-17-20-33-resnet' writer3 = SummaryWriter(comment='resnet')

以上展示了三種初始化 SummaryWriter 的方法:

  1. 提供一個路徑,將使用該路徑來保存日志(如上面writer1
  2. 無參數,默認將使用 runs/日期時間 路徑來保存日志(如上面writer2
  3. 提供一個 comment 參數,將使用 runs/日期時間-comment 路徑來保存日志(如上面writer3

一般來講,我們對於每次實驗新建一個路徑不同的 SummaryWriter,也叫一個 run,如 runs/exp1、runs/exp2

接下來,我們就可以調用 SummaryWriter 實例的各種 add_something 方法向日志中寫入不同類型的數據了。想要在瀏覽器中查看可視化這些數據,只要在命令行中開啟 tensorboard 即可:

tensorboard --logdir=<your_log_dir>

注意:上面命令其中的 <your_log_dir> 既可以是單個 run 的路徑,如上面 writer1 生成的 runs/exp;也可以是多個 run 的父目錄,如 runs/ 下面可能會有很多的子文件夾,每個文件夾都代表了一次實驗。

             我們令 --logdir=runs/ 就可以在 tensorboard 可視化界面中方便地橫向比較 runs/ 下不同次實驗所得數據的差異。

使用各種 add 方法記錄數據

下面詳細介紹 SummaryWriter 實例的各種數據記錄方法,並提供相應的示例供參考。(可以運行測試)

數字 (scalar)

使用 add_scalar 方法來記錄數字常量

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

參數

tag (string): 數據名稱,不同名稱的數據使用不同曲線展示
scalar_value (float): 數字常量值
global_step (int, optional): 訓練的 step
walltime (float, optional): 記錄發生的時間,默認為 time.time()

需要注意,這里的 scalar_value 一定是 float 類型,如果是 PyTorch scalar tensor,則需要調用 .item() 方法獲取其數值。我們一般會使用 add_scalar 方法來記錄訓練過程的 loss、accuracy、learning rate 等數值的變化,直觀地監控訓練過程。

Example:

from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/scalar_example')
for i in range(10):
    writer.add_scalar('quadratic', i**2, global_step=i)
    writer.add_scalar('exponential', 2**i, global_step=i)

這里,我們在一個路徑為 runs/scalar_example 的 run 中分別寫入了二次函數數據 quadratic 和指數函數數據 exponential,原博主在瀏覽器可視化界面中效果如下:

 但是在我本地上只能出現:並沒有曲線(我的對應版本是:tensorboard==2.6.0,tensorflow==2.6.2,torch==1.10.0,torchvision==0.11.1,Os為win10,麻煩知道的跟我說一聲

 再次新建一個python文件如下

from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/another_scalar_example')
for i in range(10):
    writer.add_scalar('quadratic', i**3, global_step=i)
    writer.add_scalar('exponential', 3**i, global_step=i)

接下來我們在另一個路徑為 runs/another_scalar_example 的 run 中寫入名稱相同但參數不同的二次函數和指數函數數據,可視化效果如下。我們發現相同名稱的量值被放在了同一張圖表中展示,方便進行對比觀察。同時,我們還可以在屏幕左側的 runs 欄選擇要查看哪些 run 的數據。

圖片 (image)

使用 add_image 方法來記錄單個圖像數據注意,該方法需要 pillow 庫的支持

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

參數:

tag (string): 數據名稱
img_tensor (torch.Tensor / numpy.array): 圖像數據
global_step (int, optional): 訓練的 step
walltime (float, optional): 記錄發生的時間,默認為 time.time()
dataformats (string, optional): 圖像數據的格式,默認為 'CHW',即 Channel x Height x Width,還可以是 'CHW'、'HWC' 或 'HW' 等

我們一般會使用 add_image 來實時觀察生成式模型的生成效果,或者可視化分割、目標檢測的結果,幫助調試模型。

Example

from tensorboardX import SummaryWriter
import cv2 as cv

writer = SummaryWriter('runs/image_example')
for i in range(1, 6):
    writer.add_image('countdown',
                     cv.cvtColor(cv.imread('{你自己的圖片文件名【我是放在當前文件同路徑,你可以選擇絕對路徑】如下圖}.jpg'.format(i)), cv.COLOR_BGR2RGB),
                     global_step=i,
                     dataformats='HWC')

比如當前python 問價為demo3,圖片為1.jpg,目錄結構如下:

add_image 方法只能一次插入一張圖片。如果要一次性插入多張圖片,有兩種方法:

  1. 使用 torchvision 中的 make_grid 方法 [官方文檔] 將多張圖片拼合成一張圖片后,再調用 add_image 方法。
  2. 使用 SummaryWriter 的 add_images 方法 [官方文檔],參數和 add_image 類似,在此不再另行介紹。

直方圖 (histogram)

使用 add_histogram 方法來記錄一組數據的直方圖。

add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None)

參數

tag (string): 數據名稱
values (torch.Tensor, numpy.array, or string/blobname): 用來構建直方圖的數據
global_step (int, optional): 訓練的 step
bins (string, optional): 取值有 ‘tensorflow’、‘auto’、‘fd’ 等, 該參數決定了分桶的方式,詳見這里。
walltime (float, optional): 記錄發生的時間,默認為 time.time()
max_bins (int, optional): 最大分桶數

我們可以通過觀察數據、訓練參數、特征的直方圖,了解到它們大致的分布情況,輔助神經網絡的訓練過程。

Example

from tensorboardX import SummaryWriter
import numpy as np

writer = SummaryWriter('runs/embedding_example')
writer.add_histogram('normal_centered', np.random.normal(0, 1, 1000), global_step=1)
writer.add_histogram('normal_centered', np.random.normal(0, 2, 1000), global_step=50)
writer.add_histogram('normal_centered', np.random.normal(0, 3, 1000), global_step=100)

我們使用 numpy 從不同方差的正態分布中進行采樣。打開瀏覽器可視化界面后,我們會發現多出了"DISTRIBUTIONS"和"HISTOGRAMS"兩欄,它們都是用來觀察數據分布的。其中在"HISTOGRAMS"中,同一數據不同 step 時候的直方圖可以上下錯位排布 (OFFSET) 也可重疊排布 (OVERLAY)。如下第一圖為"DISTRIBUTIONS"界面,第二和第三為"HISTOGRAMS"界面。

 同一數據不同 step 時候的直方圖可以上下錯位排布 (OFFSET) 也可重疊排布 (OVERLAY):分別對應如下2圖

運行圖 (graph)

使用 add_graph 方法來可視化一個神經網絡。

add_graph(model, input_to_model=None, verbose=False, **kwargs)

參數

model (torch.nn.Module): 待可視化的網絡模型
input_to_model (torch.Tensor or list of torch.Tensor, optional): 待輸入神經網絡的變量或一組變量

該方法可以可視化神經網絡模型,TensorboardX 給出了一個官方樣例大家可以嘗試。樣例運行效果如下:

嵌入向量 (embedding)

使用 add_embedding 方法可以在二維或三維空間可視化 embedding 向量

參數

mat (torch.Tensor or numpy.array): 一個矩陣,每行代表特征空間的一個數據點
metadata (list or torch.Tensor or numpy.array, optional): 一個一維列表,mat 中每行數據的 label,大小應和 mat 行數相同
label_img (torch.Tensor, optional): 一個形如 NxCxHxW 的張量,對應 mat 每一行數據顯示出的圖像,N 應和 mat 行數相同
global_step (int, optional): 訓練的 step
tag (string, optional): 數據名稱,不同名稱的數據將分別展示

add_embedding 是一個很實用的方法,不僅可以將高維特征使用PCA、t-SNE等方法降維至二維平面或三維空間顯示,還可觀察每一個數據點在降維前的特征空間的K近鄰情況。下面例子中我們取 MNIST 訓練集中的 100 個數據,將圖像展成一維向量直接作為 embedding,使用 TensorboardX 可視化出來。(下面是原博主代碼,但是運行時出現錯誤,可能版本問題)

from tensorboardX import SummaryWriter
import torchvision

writer = SummaryWriter('runs/embedding_example')
mnist = torchvision.datasets.MNIST('mnist', download=True)
writer.add_embedding(
    mnist.train_data.reshape((-1, 28 * 28))[:100,:],
    metadata=mnist.train_labels[:100],
    label_img = mnist.train_data[:100,:,:].reshape((-1, 1, 28, 28)).float() / 255,
    global_step=0
)

修改后的代碼

from tensorboardX import SummaryWriter
import torchvision

writer = SummaryWriter('runs/embedding_example1')
mnist = torchvision.datasets.MNIST('mnist', download=True)
writer.add_embedding(
    mnist.data.reshape((-1, 28 * 28))[:100,:],
    metadata=mnist.targets[:100],
    label_img = mnist.data[:100,:,:].reshape((-1, 1, 28, 28)).float() / 255,
    global_step=0
)

采用 PCA 降維后在三維空間可視化效果如下:

 可以發現,雖然還沒有做任何特征提取的工作,但 MNIST 的數據已經呈現出聚類的效果,相同數字之間距離更近一些(有沒有想到 KNN 分類器)。我們還可以點擊左下方的 T-SNE,用 t-SNE 的方法進行可視化。

 add_embedding 方法需要注意的幾點:

mat 是二維 MxN,metadata 是一維 N,label_img 是四維 NxCxHxW!
label_img 記得歸一化為 0-1 之間的 float

其他

TensorboardX 除了上述的常用方法之外,還有許多其他方法如 add_audioadd_figure 等,感興趣的朋友可以參考[官方文檔]。相信讀了這篇文章過后,你已經能夠類比熟練調用其他的方法了。

一些tips
(1)如果在進入 embedding 可視化界面時卡住,請更新 tensorboard 至最新版本 (>=1.12.0)。
(2)tensorboard 有緩存,如果進行了一些 run 文件夾的刪除操作,最好重啟 tensorboard,以避免無效數據干擾展示效果。
(3)如果執行 add 操作后沒有實時在網頁可視化界面看到效果,試試重啟 tensorboard。
————————————————


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM