把pytorch產生的影像資料用tensorboard 的 embedding visualization 顯示出來,感覺蠻不錯der

Tzu-Wei Huang
May 25, 2018 · 6 min read

原文照翻 (這篇日文比較難,省略不少)

tensorboardX

普段業務や趣味で画像データを取り扱うことが多いのですが、とりあえず特徴空間上に可視化、ってときによく使う手法が PCA なり t-SNE なりでの Embedding でして。

工作或是研究的時候經常需要把影像資料拿來檢視。在特徴空間(feature space)上進行視覺化的方法多為 PCA 或是 t-SNE

根據影像內容取出特徵或是影像的 metadata 建立向量,並將他們降維到 2 維或 3 維我們就可以觀察影像之間的相似度。

要達成上面的目標我們可以用 PIL/Pillow 自幹。但是聽說 TensorFlow 有個叫做 TensorBoard 的視覺化工具很好用,所以就來用用看。

TensorflowのEmbedding Visualizationでカッコよく可視化したい

我到目前為止主要用的 DeepLearning framework 只有 PyTorch。在 PyTorch 還沒這麼熟的情況下就要去跨足 TensorFlow 讓人不是這麼有把握的時候發現了一個叫 tensorboardX 的東西。

蝦米~ 他竟然是個可以直接把 PyTorch 的torch.Tensor 物件寫到 Tensorboard 的格式的好物。除此之外,Embedding Projection 的功能也有實作。

PyTorchで学習の過程を確認したいときはtensorboardXを使うのが良かったです

除此之外,使用原版的 TensorFlow 的話要自己把影像組成一格一格的 sprite image,tensorboardX 把這件事默默的做好了,是個很完備的套件。

安裝

PyTorch、TensorFlow、tensorboardX 都要裝。 Linux 下 pip 安裝就可以、環境不同的話就自己看著辦。

$ pip install torch tensorboard tensorboardX (這裡與原文不同)

資料

把資料以下面的格式存成 CSV 格式,取名為 features.csv 。每一行的資料是「特徴値 20 維・label・影像檔位置」,共 10000 筆資料。

feature1,...,feature20,label,image_path

程式碼

以下是讀取 features.csv 然後寫到 TensorBoard 的 script。

要用來輸出的圖檔大小是50x50。因為 TensorBoard 的 sprite image 大小極限是8192x8192px。一共有10000張圖(所以會是5000x5000)。使用自己資料的話圖檔的大小就自己估計一下不要超過了。 https://www.tensorflow.org/versions/r1.2/get_started/embedding_viz#images

最後把特徴向量用 view() 把形狀處理好,加上label、影像內容一起傳到 add_embedding 即可。

import torch
import torchvision
import csv
import numpy as np
import PIL
import tensorboardX as tbxtransform = torchvision.transforms.Compose([
    torchvision.transforms.Resize((50, 50)),
    torchvision.transforms.ToTensor(),
])features = torch.zeros(0)
labels = []
label_imgs = torch.zeros(0)
with open('features.csv') as f_csv:
    for data in csv.reader(f_csv):
        feature = torch.Tensor(np.array(data[:20]).astype(float))
        features = torch.cat((features, feature))
        label = data[20]
        labels.append(label)
        label_img = transform(PIL.Image.open(data[21]).convert('RGB'))
        label_imgs = torch.cat((label_imgs, label_img))features = features.view(10000, 20)
label_imgs = label_imgs.view(10000, 3, 50, 50)writer = tbx.SummaryWriter()
writer.add_embedding(features, metadata=labels, label_img=label_imgs)
writer.close()

這個跑完之後會產生叫做 runs 的資料夾,裡面就是 TensorBoard 用的資料。 如果你已經會繼承 torch.utils.data.Dataset 建立自己的 dataloader 也可以自己改寫。

TensorBoard 起動

再來就是叫 TensorBoard 開啟 runs 資料夾。 喀啦喀啦把指令打進電腦之後 TensorBoard 會在 localhost 的 6006 port 起動 web server。

$ tensorboard --logdir=runs

可視化画面

在瀏覽器打開 web server 。 最初是 3D PCA 。他會轉來轉去。

想要更進一步觀察類別之間的相關性的話,可以用畫面左上角的下拉選單做進一步的視覺化。

用類似的方法可以把 PCA 換成 t-SNE 看結果。用滑鼠點畫面上的圖片可以計算 Nearest Neighbor 有誰。

總結

在發現這個之前自幹 Embedding projection 的人感覺就是個アホ呢。

    Tzu-Wei Huang

    Written by