PyTorch-訓練可視化

訓練可視化

簡介

深度神經網絡是一個複雜的數學模型,其可解釋性長時間爲人質疑,被稱爲“黑盒”模型。但是其本質上就是個數學模型,很多統計學的方法可以用來觀察理解這類深度模型。在PyTorch中並沒有內置很完善的可視化功能,一般是藉助TensorFlow的TensorBoard進行可視化(使用TensorBoardX這個工具)或者使用Visdom這個可視化工具,這兩種方法是比較主流的手段。

TensoBoardX

通常神經網絡的訓練過程是漫長且複雜的,可視化訓練過程對於問題的發現和模型收斂效果的確定非常重要,需要可視化的通常由Loss曲線、Accuracy曲線、特徵圖可視化、預測混淆矩陣等。

TensorBoardX包是爲了讓TensorFlow以外的框架可以使用TensorBoard進行訓練可視化,其官方文檔可以自行查閱。

安裝

使用Pip工具安裝該包即可。(在安裝了tensorboard的前提下,使用命令pip install tensorboardx進行安裝。)

啓用監控

TensorBoard可視化的數據來自於本地log文件,該文件存在於一個文件夾,且在控制檯開啓TensorBoard服務時指定該文件夾爲監控文件夾。

在該虛擬環境下啓用tensorboard服務,啓用命令爲tensorboard --logdir=logs(已經創建了logs文件夾),默認開啓6006端口提供服務,通過http://localhost:6006/可以訪問可視化結果。

API函數接口

一般需要構建一個全局的事件寫入器(event writer),然後通過調用writer對象的add_x方法添加相關的數據、圖片等,構建writer對象傳入監控目錄即可,本文指logs文件夾。

本部分所有測試代碼文末的Github給出。

  • writer.add_scalar(tag, scalar_value, global_step=None, walltime=None)
    • 在一個圖表中記錄一個標量的變化情況,常用於Loss曲線的繪製。
    • tag參數爲該圖的標題。
    • scalar_value參數表示該步的數值,爲縱座標。
    • global_step參數表示步數,爲橫座標。
    • walltime參數表示爲event文件的文件名設置時間,默認當前時間。
      例如繪製一個一次函數衰減的loss圖如下。

在這裏插入圖片描述

  • writer.add_scalars(main_tag, tag_scalar_dict, global_step=None, walltime=None)
    • 在一個圖表中記錄多個標量的變化情況,常用於對比訓練集損失和測試集損失。
    • main_tag參數設置該圖的標籤。
    • tag_scalar_dict參數表示字典形式的多個標量,key爲tag,value爲標量的值,它們都是縱座標。
    • 其他參數同上。
      例如繪製一個訓練集和驗證集損失變化的圖像如下。

在這裏插入圖片描述

  • writer.add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None)
    • 繪製直方圖和分位數折線圖,用於檢測權值和梯度的分佈變化,觀察網絡更新的方向是否正確。
    • values參數表示繪製直方圖的數值。
    • bins參數確定如何取bins。
    • 其餘參數同上。

例如繪製模型參數的圖,注意需要在頂部選項欄切換到其他視圖,如HISTOGRAMS。
在這裏插入圖片描述

  • writer.add_image(tag, img_tensor, global_step=0, walltime=0)
    • 繪製圖片,常用於檢測模型的輸入、特徵圖、權重等,但是該接口只能可視化一張圖片,所以通常藉助torchvision.utils.make_grid()將多個圖片拼接爲一張圖片,其API如下,具體查看官方文檔,torchvision.utils.make_grid(tensor, nrow=8, padding=2, normalize=False, ra nge=None, scale_each=False, pad_value=0)
    • img_tensor參數表示需要可視化的圖片數據,要求(C, H, W)格式。
    • 其餘參數同上。
      下圖是多個隨機噪聲圖片的結果,同樣需要頂部導航欄切換查看。

在這裏插入圖片描述

  • writer.add_graph(model, input_to_model=None, verbose=False)
    • 繪製深度神經網絡結構拓撲圖。
    • model參數表示模型實例。
    • input_to_model參數表示模型的輸入數據,給一個隨機數符合shape要求即可。
      生成的是一個可編輯的模型可視化結果。

在這裏插入圖片描述

  • writer.add_embedding(mat, metadata=None, label_img=None, global_step=0, tag='default', metadata_header=None)
    • 在三維或者二維空間內展示數據分佈,可選T-SNE、PCA或者Custom方法。
    • mat參數表示需要繪製的數據,一個樣本必須是一個向量,即爲(N,D)維度。
    • metadata參數表示數據的標籤,爲一個長度爲N的列表。
    • label_img參數表示空間中展示的圖片,shape爲(N,C,H,W)
    • 其他參數同上。
      可視化MNIST數據集結果如下。

在這裏插入圖片描述

  • add_text(tag, text_string, global_step=None, walltime=None)
    • 記錄文字信息。
  • add_text(tag, text_string, global_step=None, walltime=None)
    • 記錄視頻信息。
  • add_figure(tag, figure, global_step=None, close=True, walltime=None)
    • 添加plt的圖片到圖像中。
  • add_figure(tag, figure, global_step=None, close=True, walltime=None)
    • 在圖像中繪製邊界框,常用於目標檢測。
  • add_figure(tag, figure, global_step=None, close=True, walltime=None)
    • 繪製PR曲線。
  • export_scalars_to_json(path)
    • 導出scalars信息爲json文件,方便後續使用。

上面就是TensorBoardX常用的一些接口,通過這些接口可以實現很多複雜的可視化操作,如卷積核可視化、特徵圖可視化、梯度分佈可視化等等,這裏就不提及了,後面的實戰文章我會用到。

補充說明

本文介紹了TensorBoardX這個訓練可視化工具,這是非常實用的適合PyTorch使用者的工具,當訓練遇到問題時方便的可視化會很容易判斷出模型的問題,從而優化得到較好的模型設計。本文涉及到的代碼均可以在我的Github找到,歡迎star或者fork。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章