TensorBoard Tutorial

#模型訓練視覺化

Fammy 蔡豐名
Taiwan AI Academy
8 min readFeb 20, 2019

--

本篇文章將很簡單的使用 MNIST 手寫數字辨識資料集來示範基本的 TensorBoard 使用操作

在開始之前,我們先預覽一下本文會介紹的 6 個TensorBoard 功能

  • (1) Scalars: 記錄訓練過程數值,Accuracy、Loss 等等,可以記錄任何你想要追蹤的數值
訓練過程 20 個 epochs 的 train/test accuracy & loss
  • (2) Images: 輸入的圖像
train/test 輸入的圖像
  • (3) Graphs: TensorFlow 的 Graph 流程架構圖
TensorBoard 繪製的 TensorFlow Graph 流程架構圖
  • (4) Distributions: 記錄一個 Tensor 輸出數值大小的分佈圖
  • (5) Histograms: 跟上面 distributions 雷同,只是方式為直方圖
  • (6) Projector: 強大的映射降維模組,內建 PCA 以及 T-SNE 兩種降維方式
MNIST 10000 張 test images 經過 ResNet50 後的 2048 維向量做 PCA降維
做 T-SNE 降維聚類 (after 1000 iterations)

Tensorboard 還有其他的功能,有興趣的可以自己 google 看看

開始 TensorBoard 的實作示範

#本篇內容以 AIA 台灣人工智慧學校 JupyterLab 的開發環境呈現

  • 首先,我們從 tensorflow 下載 MNIST 資料集
  • Build 一張很簡單的 tensorflow graph,使用 pretrained model ResNet50 來做分類
  • 直接開始 Session 的 training 如下

以上就是一個很簡單的 MNIST 分類器

接下來我們開始加入 TensorBoard 的 code

  • 透過 tf.summary 在原本的 Graph 上面把想要記錄的項目加進 TensorBoard 之中
  • tf.summary.image() 把輸入的影像記錄起來,但每一個 epoch 都全部這樣記錄下來將會是非常龐大的資料,所以我們會設 max_outputs 參數,設定儲存最多幾張,所以我們在 TensorBoard 看到的 Images 理論上會是最後一次呼叫 function 的前三張
  • tf.summary.histogram() 記錄 Tensor 的權重數值,這邊記錄了 gavp (Resnet50 的 global averge pooling) 和 logit (2048 x 5 的 fully-connected network)
  • tf.summary.scalar() 記錄了 Loss 和 Accuracy 兩個數值

最後用 tf.summary.merge_all() 把所有的 tf.summary 記錄整合起來,如此一來在 session 訓練時我們就只需要 run 這一個 operation 就可以了

在 session training 的部分也加入 TensorBoard 的 code

  • 呼叫 tf.summary.FileWriter() 來寫入資料夾裡面
  • writer.add_graph() 把 TensorFlow 的 Graph 寫進 TensorBoard 中,記錄在 pathLog 資料夾底下
  • 這邊為了把 training 跟 testing 的結果分開來記錄,所以多呼叫了兩個 FileWriter 分別寫到 pathLog 底下的子資料夾 train & test,如此就可以讓 TensorBoard 分開來顯示記錄

Projector 較為複雜,先暫時跳過,最後再說明

到目前為止,除了 Projector 之外都完成了,在 terminal 輸入 TensorBoard 指令執行就可以看到上面這些紀錄了(這邊方便起見直接在 Jupyter Notebook 環境下 terminal 指令)

  • 在同一個資料夾路徑下點新增頁面,開啟 Tensorboard
  • 就會出現 TensorBoard 介面囉,大家可以試著調看看每個介面可以調動的顯示參數
train 跟 test 的 accuracy 與 loss 曲線
  • Graph 的每一個區塊都可以點一下看資訊或點兩下展開與縮小
  • Distribution 中上面的是 global average pooling 的 Tensor 分佈,因為前一個卷積層通過 relu 了,所以可以看到都是正的;下面的輸出 logit 的權重分佈就呈現有正有負
  • Histograms 就是上圖的直方圖分佈圖,可以觀察權重分佈隨著 epoch 的變化

最後進入 Projector 的部分

#這個部分會比較複雜一點

先再預覽一次 PCA 降到 2 維的視覺化結果

我們需要記錄三件事情讓 Tensorboard 來實現上面的視覺化降維:

  1. 降維的根據:每張 testImage 通過 Resnet50 之後的 2048 維 embedding 特徵向量 (即 gavp)
  2. 顯示的圖像:需要傳進每一張 testImage 的圖像
  3. 圖像的標籤:需要傳進每一張 testImage 的 imageLabel

而且必須遵循 Tensorboard 的格式

  • 首先將 10000 張的 testImage 貼成正方形 N * N 的格式,每張 pixel 為 28 *28 如下圖形式
  • 下方這一個 function 可以幫助我們做到這間事,有興趣想研究的話可以到最下方附上的整段 code 有較多的註解
  • imageLabel 的部分也依照格式,照左上到右下的順序輸出一行一行的 Label
  • 接下來是 embedding 的主角,通過 Resnet50 之後的向量 gavp

用 session run gavp 得到我們要的 testImage 的特徵向量

這邊必須將得到的向量轉成 tensorflow 的變數並初始化符合格式(這些 embedding 向量就儲存在 session 裡面了)

  • import projector
  • add 一個 embedding 進去 projector 的 config 中

設定要 embed 的特徵向量 tensor name、imageLabel 跟 testImage 的檔案路徑、testImage 的 pixel 大小

最後 call 一個 visualize_embeddings 把他記錄起來,然後存下 check point 檔

  • 最後跟上面相同,在 terminal 執行 tensorboard 指令再開啟 Tensorboard 就可以囉
  • 大家可以在 Tensorboard 的介面上玩玩看各種功能

最後附上完整的 .ipynb 程式碼

謝謝你的閱讀,希望有帶給你幫助 >_<’’

--

--

Fammy 蔡豐名
Taiwan AI Academy

曾擔任 AIA 台灣人工智慧學校新竹分校助教,對技術與教學充滿熱忱,現為一線 IC 設計廠 AI 顧問