第六章 PyTorch 視覺化模組
第六章簡介
本章介紹視覺化工具,包括TensorBoard視覺化工具,混淆矩陣,CNN卷積核與特徵圖視覺化,分類模型注意力演算法——Grad CAM,模型參數量視覺化。
首先對強大的視覺化工具TensorBoard進行講解,介紹其提供的十多個資料視覺化API。
然後借助Tensorboard的繪圖功能,觀察CNN卷積核與特徵圖的變化過程,同時對分類混淆矩陣進行分析。
接著介紹一個實用的分類模型注意力機制視覺化演算法——Grad CAM。
最後介紹一系列對模型參數量分析的工具。
6.1 Tensorboard 基礎與使用
Tensorboard是TensorFlow中提供的視覺化工具,它能視覺化資料曲線、模型拓撲圖、圖像、統計分佈曲線等。
在PyTorch中,早期是不支持Tensorboard,採用了TensorboardX作為替身,現在PyTorch已經支持Tensorboard的使用,本節就介紹Tensorboard工具的概念、原理以及使用方法。
tensorboard 安裝
首先運行以下代碼,觀察報錯,通過報錯資訊指引我們安裝tensorboard。
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
from torch.utils.tensorboard import SummaryWriter
log_dir = BASE_DIR # 即test_tensorboard.py檔所在目錄
writer = SummaryWriter(log_dir=log_dir, filename_suffix="_test_tensorboard")
# writer = SummaryWriter(comment="test01", filename_suffix="_test_tensorboard")
x = range(100)
for i in x:
writer.add_scalar('y=2x', i * 2, i)
writer.add_scalar('y=pow(2, x)', 2 ** i, i)
writer.close()
Copy
直接運行代碼,提示:
import tensorboard ModuleNotFoundError: No module named 'tensorboard'
只需要在命令窗口中執行:
pip install tensorboard
重新運行代碼,獲得event file檔,《events.out.tfevents.1654508983.dream.5756.0》
tensorboard 初體驗
通過以上步驟得到了一個event file 檔,下面需要啟動tensorboard軟體對event file檔進行視覺化。
tensorboard基本原理是這樣的
- python代碼中將視覺化的資料記錄到event file中,保存至硬碟
- 採用tensorboard對event file檔進行讀取,並在web端進行視覺化
啟動步驟如下:
tensorboard --logdir=your path dir
Copy
在terminal中執行以下命令即可,注意必須是資料夾,不能是檔案名,tensorboard會將資料夾下所有event file都視覺化
得到TensorBoard 2.0.0 at http://localhost:6006/ (Press CTRL+C to quit)之類的提示
然後複製網址http://localhost:6006/ 到流覽器中進行打開,就得到如下介面
在tensorboard啟動的過程中,可能發生的問題:
1. 6006埠被佔用:
port 6006 was already in use
E0117 15:58:38.631224 MainThread program.py:260] TensorBoard attempted to bind to port 6006, but it was already in use
TensorBoard attempted to bind to port 6006, but it was already in use
Copy
解決方法:修改埠為6007
tensorboard --logdir=your_dir --port=6007
Copy
到這裡可以知道,tensorboard軟體是一個web應用,它對指定目錄下的event file進行視覺化,視覺化頁面擁有一系列功能按鈕,供開發者使用。
通過demo代碼,我們繪製了兩條曲線,除了繪製曲線,tensorboard還又許多強大視覺化功能,下面就介紹如何進行其它資料類型的視覺化。
SummaryWriter類介紹
tensorboard環境配置好了,下面要重點學習在python代碼中如何把各類資料合理的寫入event file,然後用tensorboard軟體進行視覺化。
在pytorch代碼中,提供了SummaryWriter類來實現資料的寫入,請閱讀官方文檔對SummaryWriter的描述:
The SummaryWriter class provides a high-level API to create an event file in a given directory and add summaries and events to it. The class updates the file contents asynchronously. This allows a training program to call methods to add data to the file directly from the training loop, without slowing down training.
Copy
首先來學習SummaryWriter的參數設置,然後學習它提供的一些列寫入方法,如add_scalars、add_histogram和add_image等等。
CLASS torch.utils.tensorboard.writer.SummaryWriter(log_dir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='')
屬性:
log_dir (string) – 檔保存目錄設置,預設為 runs/current_datetime_hostname
comment (string) – 當log_dir採用預設值時,comment字串作為子目錄
purge_step (int) – ?
max_queue (int) –?
flush_secs (int) – 磁片刷新時間,預設值為120秒
filename_suffix (string) –檔案名尾碼
方法:
add_scalar
add_scalar(tag, scalar_value, global_step=None, walltime=None, new_style=False, double_precision=False)
功能:添加標量;tag的設置可以有個技巧是在同一欄下繪製多個圖,如'Loss/train', 'Loss/Valid', 這就類似於matplotlib的subplot(121), subplot(122)
- tag (string) – Data identifier
- scalar_value (float or string/blobname) – Value to save
- global_step (int) – Global step value to record
add_scalars
add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)
功能:在一個坐標軸中繪製多條曲線。常用於曲線對比。
- main_tag (string) – The parent name for the tags
- tag_scalar_dict (dict) – Key-value pair storing the tag and corresponding values
- global_step (int) – Global step value to record
核心在於tag_scalar_dict 字典中存放多條曲線的數值。
add_histogram
add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None)
功能:繪製長條圖。這裡的global_step表明會得到多個長條圖,詳情請看圖理解。
在tensorboard介面,需要進入HISTOGRAM中才能看到長條圖視覺化。
- tag (string) – Data identifier
- values (torch.Tensor, numpy.array, or string/blobname) – Values to build histogram
- global_step (int) – Global step value to record
- bins (string) – One of {‘tensorflow’,’auto’, ‘fd’, …}. This determines how the bins are made.
add_image
add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')
功能:繪製圖像。
- tag (string) – Data identifier
- img_tensor (torch.Tensor, numpy.array, or string/blobname) – Image data
- global_step (int) – Global step value to record dataformats- 資料通道順序物理意義。默認為 CHW
add_images
add_images(tag, img_tensor, global_step=None, walltime=None, dataformats='NCHW')
功能:繪製圖像序列,常用於資料清洗,卷積核,特徵圖的視覺化。
Add batched image data to summary.Note that this requires the pillow package.
- tag (string) – Data identifier
- img_tensor (torch.Tensor, numpy.array, or string/blobname) – Image data
- global_step (int) – Global step value to record
- walltime (float) – Optional override default walltime (time.time()) seconds after epoch of event
- dataformats (string) – Image data format specification of the form NCHW, NHWC, CHW, HWC, HW, WH, etc.
add_figure
add_figure(tag, figure, global_step=None, close=True, walltime=None)
功能:將matplotlib的figure繪製到tensorboard中。
Render matplotlib figure into an image and add it to summary.Note that this requires the matplotlib package.
tag (string) – Data identifier
figure (matplotlib.pyplot.figure) – Figure or a list of figures
global_step (int) – Global step value to record
close (bool) – Flag to automatically close the figure
walltime (float) – Optional override default walltime (time.time()) seconds after epoch of event
剩下一些高級函數,就不一一講解,用法雷同,再次僅匯總,供需使用。
add_video:繪製視頻
add_audio:繪製音訊,可進行音訊播放。
add_text:繪製文本
add_graph:繪製pytorch模型拓撲結構圖。
add_embedding:繪製高維資料在低維的投影
add_pr_curve:繪製PR曲線,二分類任務中很實用。
add_mesh:繪製網格、3D點雲圖。
add_hparams:記錄超參數組,可用於記錄本次曲線所對應的超參數。
小結
pytorch中使用tensorboard非常簡單,只需要將想要視覺化的資料採用SummaryWriter類進行記錄,存在硬碟中永久保存,然後借助tensorboard軟體對event file進行視覺化。
tensorboard是非常強大的視覺化工具,可以很好説明開發者分析模型開發過程中的各個狀態,如監控loss曲線觀察模型訓練情況,繪製梯度分佈長條圖觀察是否有梯度消失,繪製網路拓撲圖觀察網路結構等,請大家多留意SummaryWriter官方文檔的介紹,瞭解最新SummaryWriter有什麼方法可用。
留言列表